Bläddra i källkod

优化任务管理逻辑并增强字段支持

- 将 GroupsController 中的字段编号化,增加字段支持。
- 增加性别、婚姻状况、护照类型等字段的处理逻辑。
- PersonnelModuleController 增强任务类型处理,优化权限验证。
- TaskAllocationDto 和 Pm_TaskAllocation 增加任务类型字段。
- TaskAllocationView 增加任务编辑和终止权限字段。
- TaskAllocationRepository 优化方法命名,增强任务状态验证逻辑。
- 删除冗余代码,提升代码可读性,增加日志记录。
Lyyyi 8 timmar sedan
förälder
incheckning
c987ca9cc9

+ 106 - 96
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -4313,7 +4313,7 @@ FROM
         /// <summary>
         /// 签证下载类型初始化
         /// </summary>
-        private readonly Dictionary<int, string> _visaTypeInit = new()
+        private readonly static Dictionary<int, string> _visaTypeInit = new()
         {
             { 1, "美国" },
             { 2, "日本" },
@@ -5751,150 +5751,154 @@ FROM
 
                 string currentNationality = custInfo.BirthProvince + custInfo.BirthCity;
                 SetFieldValue(formFields, "5.CurrentNationality", currentNationality); // 出生地
-                SetFieldValue(formFields, "CountryBirth", "中国"); // 出生国
-                SetFieldValue(formFields, "CurrentNationalityCountry", "中国"); // 现国籍
-                SetFieldValue(formFields, "NationalityBirth", ""); // 出生时国籍,如与现国籍不同
-                SetFieldValue(formFields, "OtherNationalities", ""); // 其他国籍
+                SetFieldValue(formFields, "6.CountryBirth", "中国"); // 出生国
+                SetFieldValue(formFields, "7.CurrentNationalityCountry", "中国"); // 现国籍
+                SetFieldValue(formFields, "7.NationalityBirth", ""); // 出生时国籍,如与现国籍不同
+                SetFieldValue(formFields, "7.OtherNationalities", ""); // 其他国籍
 
                 #region 性别处理
                 //清除性别
-                SetFieldValue(formFields, "Male", "Off"); // 性别 - 男
-                SetFieldValue(formFields, "Female", "Off"); // 性别 - 女
-                                                            //设置性别
+                SetFieldValue(formFields, "8.Male", "Off");     // 性别 - 男
+                SetFieldValue(formFields, "8.Female", "Off");   // 性别 - 女
+                SetFieldValue(formFields, "8.Other", "Off");    // 性别 - 其他
+                //设置性别
                 if (custInfo.Sex == 0) //男
                 {
-                    SetFieldValue(formFields, "Male", "Yes"); // 性别 - 男
+                    SetFieldValue(formFields, "8.Male", "Yes"); // 性别 - 男
                 }
                 else if (custInfo.Sex == 1) //女
                 {
-                    SetFieldValue(formFields, "Female", "Yes"); // 性别 - 女
+                    SetFieldValue(formFields, "8.Female", "Yes"); // 性别 - 女
+                }
+                else //其他
+                {
+                    SetFieldValue(formFields, "8.Other", "Yes"); // 性别 - 其他
                 }
 
                 #endregion
 
                 #region 婚姻状况处理
                 //清除婚姻状况
-                SetFieldValue(formFields, "Single", "Off"); // 婚姻状况 - 未婚
-                SetFieldValue(formFields, "Married", "Off"); // 婚姻状况 - 已婚
-                SetFieldValue(formFields, "RegisteredPartnership", "Off"); // 婚姻状况 - 注册伴侣关系
-                SetFieldValue(formFields, "Separated", "Off"); // 婚姻状况 - 分居
-                SetFieldValue(formFields, "Divorced", "Off"); // 婚姻状况 - 离婚
-                SetFieldValue(formFields, "Widow(er)", "Off"); // 婚姻状况 - 丧偶
-                SetFieldValue(formFields, "OtherCivilStatus", "Off"); // 婚姻状况 - 其它
-                SetFieldValue(formFields, "CivilStatusOther", ""); // 婚姻状况 - 其它(请注明)
+                SetFieldValue(formFields, "9.Single", "Off"); // 婚姻状况 - 未婚
+                SetFieldValue(formFields, "9.Married", "Off"); // 婚姻状况 - 已婚
+                SetFieldValue(formFields, "9.RegisteredPartnership", "Off"); // 婚姻状况 - 注册伴侣关系
+                SetFieldValue(formFields, "9.Separated", "Off"); // 婚姻状况 - 分居
+                SetFieldValue(formFields, "9.Divorced", "Off"); // 婚姻状况 - 离婚
+                SetFieldValue(formFields, "9.Widow(er)", "Off"); // 婚姻状况 - 丧偶
+                SetFieldValue(formFields, "9.OtherCivilStatus", "Off"); // 婚姻状况 - 其它
+                SetFieldValue(formFields, "9.CivilStatusOther", ""); // 婚姻状况 - 其它(请注明)
                                                                    //设置婚姻状况
                 switch (custInfo.Marriage)
                 {
                     case 1: // 未婚
-                        SetFieldValue(formFields, "Single", "Yes");
+                        SetFieldValue(formFields, "9.Single", "Yes");
                         break;
                     case 2: // 已婚
-                        SetFieldValue(formFields, "Married", "Yes");
+                        SetFieldValue(formFields, "9.Married", "Yes");
                         break;
                     case 3: // 离异
-                        SetFieldValue(formFields, "Divorced", "Yes");
+                        SetFieldValue(formFields, "9.Divorced", "Yes");
                         break;
                     case 4: // 离异
-                        SetFieldValue(formFields, "Widow(er)", "Yes");
+                        SetFieldValue(formFields, "9.Widow(er)", "Yes");
                         break;
                 }
 
                 #endregion
 
                 //亲权人(如是未成年申请人 )/合法监护人(姓名、住址,如与申请人不同) 电话号码、电子邮件及国籍
-                SetFieldValue(formFields, "ParentalAuthority", "");
+                SetFieldValue(formFields, "10.ParentalAuthority", "");
 
-                SetFieldValue(formFields, "NationalIdentityNumber", idCard);  //公民身份证号码
+                SetFieldValue(formFields, "11.NationalIdentityNumber", idCard);  //公民身份证号码
 
                 #region 护照(旅行证件类型)处理
                 //清除值
-                SetFieldValue(formFields, "OrdinaryPassport", "Off");  //旅行证件类型 - 普通护照
-                SetFieldValue(formFields, "DiplomaticPassport", "Off");  //旅行证件类型 - 外交护照
-                SetFieldValue(formFields, "ServicePassport", "Off");  //旅行证件类型 - 公务护照
-                SetFieldValue(formFields, "OfficialPassport", "Off");  //旅行证件类型 - 因公护照
-                SetFieldValue(formFields, "SpecialPassport", "Off");  //旅行证件类型 - 特殊护照
-                SetFieldValue(formFields, "OtherTravel", "Off");  //旅行证件类型 - 其它旅行证件
-                SetFieldValue(formFields, "OtherTravelDesc", "");     //旅行证件类型 - 其它旅行证件(请注明)
-                                                                      //设置值
-                SetFieldValue(formFields, "OrdinaryPassport", "Yes");  //旅行证件类型 - 普通护照
+                SetFieldValue(formFields, "12.OrdinaryPassport", "Off");   //旅行证件类型 - 普通护照
+                SetFieldValue(formFields, "12.DiplomaticPassport", "Off"); //旅行证件类型 - 外交护照
+                SetFieldValue(formFields, "12.ServicePassport", "Off");    //旅行证件类型 - 公务护照
+                SetFieldValue(formFields, "12.OfficialPassport", "Off");   //旅行证件类型 - 因公护照
+                SetFieldValue(formFields, "12.SpecialPassport", "Off");    //旅行证件类型 - 特殊护照
+                SetFieldValue(formFields, "12.OtherTravel", "Off");        //旅行证件类型 - 其它旅行证件
+                SetFieldValue(formFields, "12.OtherTravelDesc", "");       //旅行证件类型 - 其它旅行证件(请注明)
+                //设置值
+                SetFieldValue(formFields, "12.OrdinaryPassport", "Yes");   //旅行证件类型 - 普通护照
                 if (passportInfo != null)
                 {
-                    SetFieldValue(formFields, "TravelNumber", passportInfo.CertNo);  //旅行证件编号
-                    SetFieldValue(formFields, "IssueDate", passportInfo.IssueDt?.ToString("yyyy-MM-dd") ?? "");  //签发日期
-                    SetFieldValue(formFields, "ValidUntil", passportInfo.ExpiryDt?.ToString("yyyy-MM-dd") ?? "");  //有效期至
-                    SetFieldValue(formFields, "IssuedCountry", passportInfo.Country);  //签发(国)
+                    SetFieldValue(formFields, "13.TravelNumber", passportInfo.CertNo);  //旅行证件编号
+                    SetFieldValue(formFields, "14.IssueDate", passportInfo.IssueDt?.ToString("yyyy-MM-dd") ?? "");  //签发日期
+                    SetFieldValue(formFields, "15.ValidUntil", passportInfo.ExpiryDt?.ToString("yyyy-MM-dd") ?? "");  //有效期至
+                    SetFieldValue(formFields, "16.IssuedCountry", passportInfo.Country);  //签发(国)
                 }
                 #endregion
 
                 //如有家庭成员为欧盟、欧洲经济区、瑞士或受益于退欧协议的英国公民的,请填写该家庭成员的个人信息
-                SetFieldValue(formFields, "LastName_om", "");  //姓
-                SetFieldValue(formFields, "FirstName_om", "");  //名
-                SetFieldValue(formFields, "BirthDate_om", "");  //出生日期(日-月-年)
-                SetFieldValue(formFields, "Nationality_om", "");  //国籍
-                SetFieldValue(formFields, "TravelNuber_om", "");  //旅行证件或身分证编号
+                SetFieldValue(formFields, "17.LastName_om", "");    //姓
+                SetFieldValue(formFields, "17.FirstName_om", "");   //名
+                SetFieldValue(formFields, "17.BirthDate_om", "");   //出生日期(日-月-年)
+                SetFieldValue(formFields, "17.Nationality_om", ""); //国籍
+                SetFieldValue(formFields, "17.TravelNuber_om", ""); //旅行证件或身分证编号
 
                 //申请人与欧盟、欧洲经济区、瑞士或受益于退欧协议的英国公民的关系 
-                SetFieldValue(formFields, "Spouse_om", "");  //配偶
-                SetFieldValue(formFields, "RegisteredPartnership_om", "");  //注册伴侣
-                SetFieldValue(formFields, "Child_om", "");  //子女
-                SetFieldValue(formFields, "DependentAscendant_om", "");  //受养人
-                SetFieldValue(formFields, "Grandchild_om", "");  //孙子女 
-                SetFieldValue(formFields, "FamilyOther_om", "");  //其他 
-                SetFieldValue(formFields, "FamilyOtherDesc_om", "");  //其他(说明)
+                SetFieldValue(formFields, "18.Spouse_om", "");                //配偶
+                SetFieldValue(formFields, "18.RegisteredPartnership_om", ""); //注册伴侣
+                SetFieldValue(formFields, "18.Child_om", "");                 //子女
+                SetFieldValue(formFields, "18.DependentAscendant_om", "");    //受养人
+                SetFieldValue(formFields, "18.Grandchild_om", "");            //孙子女 
+                SetFieldValue(formFields, "18.FamilyOther_om", "");           //其他 
+                SetFieldValue(formFields, "18.FamilyOtherDesc_om", "");       //其他(说明)
 
                 //申请人住址及电子邮件
                 string applicantHomeAddress = $"{custInfo.Address} {custInfo.Email}";
-                SetFieldValue(formFields, "ApplicantHomeAddress", applicantHomeAddress);  //申请人住址及电子邮件
-                SetFieldValue(formFields, "TelephoneNo", custInfo.Tel);  //电话号码
+                SetFieldValue(formFields, "19.ApplicantHomeAddress", applicantHomeAddress);  //申请人住址及电子邮件
+                SetFieldValue(formFields, "19.TelephoneNo", custInfo.Tel);  //电话号码
 
                 //是否居住在现时国籍以外的国家
-                SetFieldValue(formFields, "AnotherCountryNo", "Yes");  //否
-                SetFieldValue(formFields, "AnotherCountryYes", "");  //是
-                SetFieldValue(formFields, "ResidencePermit", "");  //居住许可或同等证
-                SetFieldValue(formFields, "Number", "");  //编号
-                SetFieldValue(formFields, "ValidUntils", "");  //有效期至
+                SetFieldValue(formFields, "20.AnotherCountryNo", "Yes"); //否
+                SetFieldValue(formFields, "20.AnotherCountryYes", "");  //是
+                SetFieldValue(formFields, "20.ResidencePermit", "");  //居住许可或同等证
+                SetFieldValue(formFields, "20.Number", "");  //编号
+                SetFieldValue(formFields, "20.ValidUntils", "");  //有效期至
 
-                SetFieldValue(formFields, "CurrentOccupation", custInfo.Job);  //当前职业 
+                SetFieldValue(formFields, "21.CurrentOccupation", custInfo.Job);  //当前职业 
 
                 //工作单位名称,地址和电话,学生填写学校名称及地址
                 var currCompanyInfo = currCompanyInfos.FirstOrDefault();
                 string employerInfoStr = $"{currCompanyInfo?.Company ?? ""} {currCompanyInfo?.CompanyAddress ?? ""} {currCompanyInfo?.Phone ?? ""}";
-                SetFieldValue(formFields, "EmployerInfo", employerInfoStr);
+                SetFieldValue(formFields, "22.EmployerInfo", employerInfoStr);
 
                 #region 旅行的目的
                 //清空值
-                SetFieldValue(formFields, "Tourism", "Off");  //旅游
-                SetFieldValue(formFields, "Business", "Off");  //商务
-                SetFieldValue(formFields, "VisitingFamily", "Off");  //探亲访友
-                SetFieldValue(formFields, "Cultural", "Off");  //文化
-                SetFieldValue(formFields, "Sports", "Off");  //体育
-                SetFieldValue(formFields, "OfficialVisit", "Off");  //官方访问
-                SetFieldValue(formFields, "MedicalReasons", "Off");  //医疗
-                SetFieldValue(formFields, "Study", "Off");  //学习
-                SetFieldValue(formFields, "AirportTransit", "Off");  //机场过境
-                SetFieldValue(formFields, "Other", "Off");  //其它
-                SetFieldValue(formFields, "OtherDesc", "");  //其它 (请注明)
+                SetFieldValue(formFields, "23.Tourism", "Off");        // 旅游
+                SetFieldValue(formFields, "23.Business", "Off");       // 商务
+                SetFieldValue(formFields, "23.VisitingFamily", "Off"); // 探亲访友
+                SetFieldValue(formFields, "23.Cultural", "Off");       // 文化
+                SetFieldValue(formFields, "23.Sports", "Off");         // 体育
+                SetFieldValue(formFields, "23.OfficialVisit", "Off");  // 官方访问
+                SetFieldValue(formFields, "23.MedicalReasons", "Off"); // 医疗
+                SetFieldValue(formFields, "23.Study", "Off");          // 学习
+                SetFieldValue(formFields, "23.AirportTransit", "Off"); // 机场过境
+                SetFieldValue(formFields, "23.Other", "Off");          // 其它
+                SetFieldValue(formFields, "23.OtherDesc", "");         // 其它 (请注明)
 
                 //设置值
-                if (groupInfo.VisitPurpose.contains("旅游")) SetFieldValue(formFields, "Tourism", "Yes");  //旅游
-                if (groupInfo.VisitPurpose.contains("商务")) SetFieldValue(formFields, "Business", "Yes");  //商务
-                if (groupInfo.VisitPurpose.contains("探亲访友")) SetFieldValue(formFields, "VisitingFamily", "Yes");  //探亲访友
-                if (groupInfo.VisitPurpose.contains("文化")) SetFieldValue(formFields, "Cultural", "Yes");  //文化
-                if (groupInfo.VisitPurpose.contains("体育")) SetFieldValue(formFields, "Sports", "Yes");  //体育
-                if (groupInfo.VisitPurpose.contains("官方访问")) SetFieldValue(formFields, "OfficialVisit", "Yes");  //官方访问
-                if (groupInfo.VisitPurpose.contains("医疗")) SetFieldValue(formFields, "MedicalReasons", "Yes");  //医疗
-                if (groupInfo.VisitPurpose.contains("学习")) SetFieldValue(formFields, "Study", "Yes");  //学习
-                if (groupInfo.VisitPurpose.contains("机场过境")) SetFieldValue(formFields, "AirportTransit", "Yes");  //机场过境
+                if (groupInfo.VisitPurpose.contains("旅游")) SetFieldValue(formFields, "23.Tourism", "Yes");           //旅游
+                if (groupInfo.VisitPurpose.contains("商务")) SetFieldValue(formFields, "23.Business", "Yes");          //商务
+                if (groupInfo.VisitPurpose.contains("探亲访友")) SetFieldValue(formFields, "23.VisitingFamily", "Yes"); //探亲访友
+                if (groupInfo.VisitPurpose.contains("文化")) SetFieldValue(formFields, "23.Cultural", "Yes");           //文化
+                if (groupInfo.VisitPurpose.contains("体育")) SetFieldValue(formFields, "23.Sports", "Yes");             //体育
+                if (groupInfo.VisitPurpose.contains("官方访问")) SetFieldValue(formFields, "23.OfficialVisit", "Yes");  //官方访问
+                if (groupInfo.VisitPurpose.contains("医疗")) SetFieldValue(formFields, "23.MedicalReasons", "Yes");     //医疗
+                if (groupInfo.VisitPurpose.contains("学习")) SetFieldValue(formFields, "23.Study", "Yes");              //学习
+                if (groupInfo.VisitPurpose.contains("机场过境")) SetFieldValue(formFields, "23.AirportTransit", "Yes");  //机场过境
 
                 #endregion
 
-                SetFieldValue(formFields, "AdditionalInfo", "");  //有关停留原因的补充信息
-
-                string[] RD_country = new string[] { };  //接收处理的国家
+                SetFieldValue(formFields, "24.AdditionalInfo", "");  //有关停留原因的补充信息
 
+                string[] RD_country = new string[] { }; //接收处理的国家
                 string firstEntryLabel = string.Empty; //首入申根国标签
-                string membeDescLabel = string.Empty; //申根国目的地
-                string stopDays = string.Empty; //停留天数
+                string membeDescLabel = string.Empty;  //申根国目的地
+                string stopDays = string.Empty;        //停留天数
                 if (!string.IsNullOrEmpty(groupInfo.VisitCountry))
                 {
                     List<string> SGGNames = new List<string>();//接收处理后的国家  是申根国
@@ -5983,26 +5987,26 @@ FROM
                     }
                 }
 
-                SetFieldValue(formFields, "MembeDesc", membeDescLabel);  //主要申根目的地 (以及其他申根目的地,如适用)
-                SetFieldValue(formFields, "FirstEntry", firstEntryLabel);  //首入申根国
+                SetFieldValue(formFields, "25.MembeDesc", membeDescLabel);   //主要申根目的地 (以及其他申根目的地,如适用)
+                SetFieldValue(formFields, "26.FirstEntry", firstEntryLabel); //首入申根国
 
                 //申请入境次数 
-                SetFieldValue(formFields, "27.SingleEntry", "");  //单次
-                SetFieldValue(formFields, "27.TwoEntries", "");  //两次
-                SetFieldValue(formFields, "27.MultipleEntries", "");  //多次
+                SetFieldValue(formFields, "27.SingleEntry", "");     //单次
+                SetFieldValue(formFields, "27.TwoEntries", "");      //两次
+                SetFieldValue(formFields, "27.MultipleEntries", ""); //多次
                 SetFieldValue(formFields, "27.IntendedDateIn", "");  //在申根地区预计首次停留的预计抵达日期
-                SetFieldValue(formFields, "27.IntendedDateOut", "");  //在申根地区预计首次停留之后的预计离开日期
+                SetFieldValue(formFields, "27.IntendedDateOut", ""); //在申根地区预计首次停留之后的预计离开日期
 
                 //以往申根国签证是否有指纹记录
-                SetFieldValue(formFields, "28.No", "");  //否 
-                SetFieldValue(formFields, "28.Yes", "");  //是 
-                SetFieldValue(formFields, "28.KnownDate", "");  //如有,请写明日期
-                SetFieldValue(formFields, "28.KnownVisanumber", "");  //如有,请写明签证贴纸号码
+                SetFieldValue(formFields, "28.No", "");              //否 
+                SetFieldValue(formFields, "28.Yes", "");             //是 
+                SetFieldValue(formFields, "28.KnownDate", "");       //如有,请写明日期
+                SetFieldValue(formFields, "28.KnownVisanumber", ""); //如有,请写明签证贴纸号码
 
                 //最后目的地之入境许可
-                SetFieldValue(formFields, "29.Issued", "");  //签发机关 
+                SetFieldValue(formFields, "29.Issued", "");     //签发机关  Entry permit for the final country of destination, where applicable
                 SetFieldValue(formFields, "29.ValidFrom", "");  //有效期由 
-                SetFieldValue(formFields, "29.Until", "");  //至 
+                SetFieldValue(formFields, "29.Until", "");      //至 
 
                 //申根国的邀请人姓名。如无邀请人,请填写申根国的酒店或暂住居所名称
                 //得到当前国家下的城市酒店信息
@@ -6062,7 +6066,13 @@ FROM
                 SetFieldValue(formFields, "32.ponsorOther", "");  //赞助方式 - 其它
                 SetFieldValue(formFields, "32.ponsorOtherDesc", "");  //赞助方式 - 其它(请注明)
 
-                SetFieldValue(formFields, "33.PlaceAndDate", DateTime.Now.ToString("yyyy-MM-dd"));  //地点及日期
+                //填表人与申请人不同
+                SetFieldValue(formFields, "33.WriteTableName", "");     //姓名
+                SetFieldValue(formFields, "33.WriteTableAddress", "");  //住址
+                SetFieldValue(formFields, "33.WriteTableTel", "");      //电话
+
+
+                SetFieldValue(formFields, "EndPlaceAndDate", DateTime.Now.ToString("yyyy-MM-dd"));  //地点及日期
                 #endregion
 
             }

+ 66 - 341
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,6 +1,8 @@
 using Aspose.Cells;
 using Aspose.Words;
+using Dm.util;
 using FluentValidation;
+using Markdig;
 using Microsoft.AspNetCore.SignalR;
 using OASystem.API.OAMethodLib;
 using OASystem.API.OAMethodLib.DeepSeekAPI;
@@ -11,6 +13,7 @@ using OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice;
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Dtos.PersonnelModule;
 using OASystem.Domain.Dtos.Statistics;
+using OASystem.Domain.Entities;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.PersonnelModule;
@@ -21,9 +24,8 @@ using OASystem.Infrastructure.Repositories.PersonnelModule;
 using System.Data;
 using System.Diagnostics;
 using System.Globalization;
+using System.Threading.Tasks;
 using static OASystem.API.OAMethodLib.JWTHelper;
-using Markdig;
-using Dm.util;
 
 namespace OASystem.API.Controllers
 {
@@ -1009,7 +1011,7 @@ namespace OASystem.API.Controllers
 
             #endregion
 
-            var _view = await _taskAllocationRep._Init(dto.PortType, dto.UserId);
+            var _view = await _taskAllocationRep.Init(dto.PortType, dto.UserId);
             if (_view.Code == 0)
             {
                 return Ok(JsonView(true, "查询成功!", _view.Data));
@@ -1070,6 +1072,16 @@ namespace OASystem.API.Controllers
                 whereSql += string.Format(@" And ta.Status = {0} ", dto.Status);
             }
 
+            //任务类型
+            if (dto.TaskType == -1) //全部
+            {
+                whereSql += "";
+            }
+            else
+            {
+                whereSql += string.Format(@" And ta.TaskType = {0} ", dto.TaskType);
+            }
+
             //任务名称
             if (!string.IsNullOrEmpty(dto.TaskName))
             {
@@ -1093,12 +1105,14 @@ From
       ta.Id,
       ta.TaskName,
       ta.TaskContent,
+      s.Name as 'TaskTyoeName',
       ta.TaskPriority,
       d.DepName,
       di.TeamName,
       ta.Status,
       ta.PredictBeginTime,
       ta.PredictEndTime,
+      ta.CreateUserId,
       u.CnName As CreateUserName,
       ta.CreateTime,
       (
@@ -1118,31 +1132,32 @@ From
             1,
             ''
           )
-      ) As Participant,
-      (
-        SELECT
-          STUFF(
-            (
-              Select
-                ',' + u.CnName
-              From
-                Pm_TaskRelevanceUser tra
-                Left Join Sys_Users u On tra.UserId = u.Id
-              Where
-                tra.Isdel = 0
-                And tra.TAId = ta.Id
-                And tra.TaskStatus = 4 FOR XML PATH('')
-            ),
-            1,
-            1,
-            ''
-          )
-      ) As Consummator
+      ) As Participant
+      //,(
+      //  SELECT
+      //    STUFF(
+      //      (
+      //        Select
+      //          ',' + u.CnName
+      //        From
+      //          Pm_TaskRelevanceUser tra
+      //          Left Join Sys_Users u On tra.UserId = u.Id
+      //        Where
+      //          tra.Isdel = 0
+      //          And tra.TAId = ta.Id
+      //          And tra.TaskStatus = 4 FOR XML PATH('')
+      //      ),
+      //      1,
+      //      1,
+      //      ''
+      //    )
+      //) As Consummator
     From
       Pm_TaskAllocation ta
       Left Join Sys_Department d On ta.DepId = d.Id
       Left Join Grp_DelegationInfo di On ta.DiId = di.Id
       Left Join Sys_Users u On ta.CreateUserId = u.Id
+      left join Sys_SetData s on ta.TaskType = s.Id 
     Where
       ta.IsDel = 0 {0}
   ) As temp
@@ -1155,37 +1170,17 @@ WHERE
                 .WhereIF(groupArr.Any(), x => groupArr.Contains(x.TeamName))
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total);//ToPageAsync
 
-            List<int> taskIds = taskIds = _view.Select(it => it.Id).ToList();
-
-            string taskerSql = string.Format(@"Select tau.TAId,tau.Id,tau.UserId,u.CnName As UserName,tau.BeginTime,tau.OverTime,tau.TaskStatus,
-                                                  tau.Cause,tau.Score,tau.Remark As ScoreRemark,tau.CreateUserId As TaskCreateUserId
-                                                  From Pm_TaskRelevanceUser tau 
-                                                  Left Join Sys_Users u On tau.UserId = u.Id
-                                                  Where tau.IsDel = 0");
-
-            var taskerData = _sqlSugar.SqlQueryable<TaskerDetailsView>(taskerSql).Where(it => taskIds.Contains(it.TAId)).ToList();
             foreach (var item in _view)
             {
-                //任务接收者显示自己任务状态
-                if (!item.CreateUserName.Equals(currUserName))
-                {
-                    var subTaskInfo = taskerData.FirstOrDefault(x => item.Id == x.TAId && x.UserId == dto.UserId);
-                    if (subTaskInfo != null) item.Status = subTaskInfo.TaskStatus;
-                }
-                else
-                {
-                    item.TaskerDetails = taskerData.Where(it => it.TAId == item.Id).ToArray();
-                }
+                //设置编辑权限
+                (bool editPerm, string msg1) = _taskAllocationRep.EditPerm(item.Id, dto.UserId);
+                item.EditPerm = editPerm;
+                //设置任务终止权限
+                (bool taskStopPerm, string msg2) = _taskAllocationRep.TaskStopPerm(item.Id, dto.UserId);
+                item.TaskStopPerm = editPerm;
 
-                ////处理任务总状态 And 任务人状态
-                //var taskerStatusData = taskerData.Where(it => it.TAId == item.Id && it.TaskCreateUserId != dto.UserId && it.UserId == dto.UserId).FirstOrDefault();
-                //if (taskerStatusData != null)
-                //{
-                //    item.Status = taskerStatusData.TaskStatus;
-                //}
             }
 
-
             return Ok(JsonView(true, "查询成功!", _view, total));
         }
 
@@ -1210,7 +1205,7 @@ WHERE
 
             #endregion
 
-            var _view = await _taskAllocationRep._Details(dto.PortType, dto.Id);
+            var _view = await _taskAllocationRep.Details(dto.PortType, dto.Id);
             if (_view.Code == 0)
             {
                 return Ok(JsonView(true, "查询成功!", _view.Data));
@@ -1220,8 +1215,7 @@ WHERE
         }
 
         /// <summary>
-        /// 任务分配  001
-        /// Add Or Edit
+        /// 任务分配  发布任务/修改任务
         /// </summary>
         /// <returns></returns>
         [HttpPost]
@@ -1246,16 +1240,12 @@ WHERE
 
                 if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
             }
-
-
             #endregion
-
             #endregion
 
-            var _view = await _taskAllocationRep._AddOrEdit(dto);
+            var _view = await _taskAllocationRep.AddOrEdit(dto);
             if (_view.Code == 0)
             {
-
                 if (dto.Id == 0) //添加提示任务单创建
                 {
                     string title = $"[{dto.TaskName}] 任务新建成功!";
@@ -1275,15 +1265,14 @@ WHERE
         }
 
         /// <summary>
-        /// 任务分配
-        /// 状态任务归属人详情
+        /// 任务分配 状态任务归属人详情
         /// </summary>
         /// <returns></returns>
         [HttpPost]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostTaskAllocationTaskerDetails(TaskerDetailsDto dto)
         {
-            var _view = await _taskAllocationRep._TaskerDetails(dto.Id);
+            var _view = await _taskAllocationRep.TaskerDetails(dto.Id);
             if (_view.Code == 0)
             {
                 return Ok(JsonView(true, "操作成功!", _view.Data));
@@ -1293,112 +1282,14 @@ WHERE
         }
 
         /// <summary>
-        /// 任务分配
-        /// 状态任务归属人设置开始状态
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostTaskAllocationSetStartStatus(TaskerStatusDto dto)
-        {
-            var _view = await _taskAllocationRep._TaskerSetStartStatus(dto.UserId, dto.Id);
-            if (_view.Code == 0)
-            {
-                //发送消息
-                var taskData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == dto.Id).First();
-                if (taskData != null)
-                {
-                    var taskUserIds = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.TAId == dto.Id).Select(it => it.UserId).ToList();
-                    if (taskUserIds.Count > 0)
-                    {
-                        taskUserIds.Remove(dto.UserId);
-                    }
-
-                    var UserName = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.Id == dto.UserId).Select(it => it.CnName).First();
-
-                    string title_createUser = $"[{taskData.TaskName}] 进度更新!";
-                    string conten_createUser = $"[{UserName}] 已开始任务,请注意该工作人员任务进度!";
-
-                    //创建人发送消息
-                    List<int> createUserIds = new() { taskData.CreateUserId };
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title_createUser, conten_createUser, createUserIds);
-
-                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(createUserIds.Select(x => x.ToString()).ToList(), taskData.DiId, conten_createUser, taskData.CreateUserId);
-
-                    //其他人发送消息
-                    string title = $"[{taskData.TaskName}] 进度更新!";
-                    string content = $"[{UserName}] 已开始任务.若需查看,请前往任务页面查看详情!";
-
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, taskUserIds);
-
-                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(taskUserIds.Select(x => x.ToString()).ToList(), taskData.DiId, content, dto.UserId);
-
-                }
-
-                return Ok(JsonView(true, "操作成功!"));
-            }
-
-            return Ok(JsonView(false, _view.Msg));
-        }
-
-        /// <summary>
-        /// 任务分配
-        /// 状态 任务归属人 设置完成状态
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostTaskAllocationSetOverStatus(TaskerStatusDto dto)
-        {
-            var _view = await _taskAllocationRep._TaskerSetOverStatus(dto.UserId, dto.Id);
-            if (_view.Code == 0)
-            {
-                //发送消息
-                var taskData = _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == dto.Id).First();
-                if (taskData != null)
-                {
-                    var taskUserIds = _sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.TAId == dto.Id).Select(it => it.UserId).Distinct().ToList();
-                    var UserName = _sqlSugar.Queryable<Sys_Users>().Where(it => it.Id == dto.UserId).Select(it => it.CnName).First();
-
-                    string title_createUser = $"[{taskData.TaskName}] 进度更新!";
-                    string conten_createUser = $"[{UserName}] 已完成任务,请前往任务页面进行审核操作!";
-
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title_createUser, conten_createUser, new List<int>() { taskData.CreateUserId }); //创建人发送消息
-
-                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { taskData.CreateUserId.ToString() }, taskData.DiId, conten_createUser, dto.UserId);
-
-                    string title = $"[{taskData.TaskName}] 进度更新!";
-                    string content = $"[{UserName}] 已完成任务,请注意在规定时间内完成任务.若需查看,请前往任务页面查看详情!";
-                    string yw_content = $"[{UserName}] 已完成任务,请注意在规定时间内完成任务!";
-
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, taskUserIds); //其他人发送消息
-
-                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(taskUserIds.Select(x => x.ToString()).ToList(), taskData.DiId, yw_content, dto.UserId);
-
-                    string content1 = $"任务已完成,等待任务发布人审核!若需查看,请前往任务页面查看详情!";
-                    string yw_content1 = $"任务已完成,等待任务发布人审核!";
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content1, new List<int>() { dto.UserId }); //设置任务人 发送消息
-
-                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { dto.UserId.ToString() }, taskData.DiId, yw_content1, dto.UserId);
-
-                }
-
-                return Ok(JsonView(true, "操作成功!"));
-            }
-
-            return Ok(JsonView(false, _view.Msg));
-        }
-
-        /// <summary>
-        /// 任务分配
-        /// 状态 任务归属人 设置知晓状态
+        /// 任务分配 任务归属人设置知晓状态
         /// </summary>
         /// <returns></returns>
         [HttpPost]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
         public async Task<IActionResult> PostTaskAllocationSetHaveStatus(TaskAllocationStatusDto dto)
         {
-            var _view = await _taskAllocationRep._TaskSetHaveStatus(dto.SubId);
+            var _view = await _taskAllocationRep.TaskSetHaveStatus(dto.SubId,dto.UserId);
             if (_view.Code == 0)
             {
                 //发送消息
@@ -1409,7 +1300,6 @@ WHERE
 
                     if (taskData != null)
                     {
-
                         var UserName = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.Id == taskData.CreateUserId).Select(it => it.CnName).First();
 
                         string title = $"[{taskData.TaskName}] 进度更新!";
@@ -1420,7 +1310,6 @@ WHERE
 
                         await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { taskData.CreateUserId.ToString() }, taskData.DiId, qw_conten_createUser, taskData.CreateUserId);
 
-
                         string content = $"请注意任务完成时间!若需查看,请前往任务页面查看详情!";
                         string yw_content = $"请注意任务完成时间!";
                         await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, new List<int>() { taskUserData.UserId }); //设置任务人 发送消息
@@ -1436,196 +1325,32 @@ WHERE
         }
 
         /// <summary>
-        /// 任务分配
-        /// 任务发布者 单人设置审批状态
+        /// 任务分配 设置完成状态
         /// </summary>
         /// <returns></returns>
         [HttpPost]
         [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostTaskAllocationSetAuditStatus(TaskAllocationStatusDto dto)
+        public async Task<IActionResult> PostTaskAllocationSetAuditStatus(TaskAllocationSetAuditStatusDto dto)
         {
-            var _view = await _taskAllocationRep._TaskSetAuditStatus(dto.SubId);
+            var _view = _taskAllocationRep.TaskSetAuditStatus(dto.Id,dto.UserId,dto.OverTime);
             if (_view.Code == 0)
             {
                 //发送消息
-                var taskUserData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.Id == dto.SubId).First();
-                if (taskUserData != null)
+                var taskUserInfo = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.TAId == dto.Id).First();
+                if (taskUserInfo != null)
                 {
-                    var taskData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == taskUserData.TAId).First();
+                    var taskInfo = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == dto.Id).First();
 
-                    if (taskData != null)
+                    if (taskInfo != null)
                     {
-                        string title = $"[{taskData.TaskName}] 进度更新!";
+                        var userIds = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.TAId == dto.Id).Select(it => it.UserId).ToList();
+                        
+                        string title = $"[{taskInfo.TaskName}] 进度更新!";
                         string content = $"任务已完成!若需查看,请前往任务页面查看详情!";
                         string yw_content = $"任务已完成!";
-                        await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, new List<int>() { taskUserData.UserId }); //设置任务人 发送消息
-
-                        await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { taskUserData.UserId.ToString() }, taskData.DiId, yw_content, taskUserData.UserId);
-
-                    }
-                }
-
-                return Ok(JsonView(true, "操作成功!"));
-            }
-
-            return Ok(JsonView(false, _view.Msg));
-        }
-
-        /// <summary>
-        /// 任务分配
-        /// 任务发布者 单人设置未完成状态
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostTaskAllocationSetUnFinishedStatus(TaskAllocationSetUnFinishedStatusDto dto)
-        {
-            var _view = await _taskAllocationRep._TaskSetUnFinishedStatus(dto.SubId, dto.Cause);
-            if (_view.Code == 0)
-            {
-                //发送消息
-                var taskUserData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.Id == dto.SubId).First();
-                if (taskUserData != null)
-                {
-                    var taskData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == taskUserData.TAId).First();
-
-                    if (taskData != null)
-                    {
-                        string title = $"[{taskData.TaskName}] 进度更新!";
-                        string content = $"任务未完成!若需查看,请前往任务页面查看详情!";
-                        string yw_content = $"任务未完成!";
-                        await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, new List<int>() { taskUserData.UserId }); //设置任务人 发送消息
-                        await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { taskUserData.UserId.ToString() }, taskData.DiId, yw_content, taskUserData.UserId);
-
-                    }
-                }
-
-                return Ok(JsonView(true, "操作成功!"));
-            }
-
-            return Ok(JsonView(false, _view.Msg));
-        }
-
-        ///// <summary>
-        ///// 任务分配
-        ///// 确认任务是否可操作完成
-        ///// </summary>
-        ///// <returns></returns>
-        //[HttpPost]
-        //[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        //public async Task<IActionResult> PostTaskAllocationIsConfirmCompletion(TaskAllocationScoreDto dto)
-        //{
-        //    try
-        //    {
-        //        #region  参数验证
-        //        if (dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
-        //        if (dto.PageId < 1) dto.PageId = 172; //任务指派Id
-
-        //        PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
-
-        //        #region 页面操作权限验证
-        //        pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
-
-        //        if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
-
-        //        #endregion
-
-        //        #endregion
-
-        //        var _view = await _taskAllocationRep._TaskConfirmCompletion(dto.PortType, dto.Id);
-        //        if (_view.Code == 0)
-        //        {
-        //            return Ok(JsonView(true, "操作成功!"));
-        //        }
-
-        //        return Ok(JsonView(false, _view.Msg));
-        //    }
-        //    catch (Exception ex)
-        //    {
-        //        return Ok(JsonView(false, ex.Message));
-        //    }
-        //}
-
-        ///// <summary>
-        ///// 任务分配
-        ///// 任务确认完成
-        ///// </summary>
-        ///// <returns></returns>
-        //[HttpPost]
-        //[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        //public async Task<IActionResult> PostTaskAllocationConfirmCompletion(TaskAllocationConfirmCompletionDto dto)
-        //{
-        //    try
-        //    {
-        //        #region  参数验证
-        //        if (dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
-        //        if (dto.PageId < 1) dto.PageId = 172; //任务指派Id
-
-        //        PageFunAuthViewBase pageFunAuthView = new PageFunAuthViewBase();
-
-        //        #region 页面操作权限验证
-        //        pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
-
-        //        if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
-
-        //        #endregion
-
-        //        #endregion
-
-        //        var _view = await _taskAllocationRep._TaskConfirmCompletion(dto.PortType,dto.Id);
-        //        if (_view.Code == 0)
-        //        {
-        //            return Ok(JsonView(true, "操作成功!"));
-        //        }
-
-        //        return Ok(JsonView(false, _view.Msg));
-        //    }
-        //    catch (Exception ex)
-        //    {
-        //        return Ok(JsonView(false, ex.Message));
-        //    }
-        //}
-
-        /// <summary>
-        /// 任务分配
-        /// 任务发布者 任务评分
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
-        public async Task<IActionResult> PostTaskAllocationScore(TaskAllocationScoreDto dto)
-        {
-            #region  参数验证
-            if (dto.UserId < 1) return Ok(JsonView(false, "员工Id为空"));
-            if (dto.PageId < 1) dto.PageId = 172; //任务指派Id
-
-
-            #region 页面操作权限验证
-            PageFunAuthViewBase pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
-            if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
-
-            #endregion
-
-            #endregion
-
-            var _view = await _taskAllocationRep._TaskScore(dto);
-            if (_view.Code == 0)
-            {
-                //发送消息
-                var taskUserData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.Id == dto.SubId).First();
-                if (taskUserData != null)
-                {
-                    var taskData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == taskUserData.TAId).First();
-
-                    if (taskData != null)
-                    {
-                        string title = $"[{taskData.TaskName}] 进度更新!";
-                        string content = $"任务评分已完成!若需查看,请前往任务页面查看详情!";
-                        string yw_content = $"任务评分已完成!";
-                        await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, new List<int>() { taskUserData.UserId }); //设置任务人 发送消息
-
-
-                        await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { taskUserData.UserId.ToString() }, taskData.DiId, yw_content, taskUserData.UserId);
+                        await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, userIds); //设置任务人 发送消息
+                        var userIdStrs = userIds.Select(x => x.ToString()).ToList();
+                        await AppNoticeLibrary.SendUserMsg_Task_ToUser(userIdStrs, taskInfo.DiId, yw_content, taskInfo.CreateUserId);
 
                     }
                 }
@@ -1658,7 +1383,7 @@ WHERE
 
             #endregion
 
-            var _view = await _taskAllocationRep._TaskTermination(dto.Id);
+            var _view = await _taskAllocationRep.TaskTermination(dto.Id,dto.UserId);
             if (_view.Code == 0)
             {
                 //发送消息
@@ -1705,7 +1430,7 @@ WHERE
 
             #endregion
 
-            var _view = await _taskAllocationRep._TaskDel(dto.Id);
+            var _view = await _taskAllocationRep.TaskDel(dto.Id, dto.UserId);
             if (_view.Code == 0)
             {
                 return Ok(JsonView(true, "操作成功!"));

+ 1 - 1
OASystem/OASystem.Api/OAMethodLib/Quartz/Jobs/TaskJob.cs

@@ -23,7 +23,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Jobs
             try
             {
                 //在此处编写任务业务代码
-                TaskAssignment.PostTaskUpdateStatus();
+                //TaskAssignment.PostTaskUpdateStatus();
             }
             catch (Exception ex)
             {

+ 28 - 5
OASystem/OASystem.Domain/Dtos/PersonnelModule/TaskAllocationDto.cs

@@ -41,6 +41,11 @@ namespace OASystem.Domain.Dtos.PersonnelModule
         /// </summary>
         public int Status { get; set; }
 
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        public int TaskType { get; set; }
+
         /// <summary>
         /// 任务名称
         /// </summary>
@@ -82,6 +87,12 @@ namespace OASystem.Domain.Dtos.PersonnelModule
         /// </summary>
         public int DiId { get; set; }
 
+        /// <summary>
+        /// 任务类型 Setdata
+        /// 1 2 3 4
+        /// </summary>
+        public int TaskType { get; set; }
+
         /// <summary>
         /// 优先级
         /// 1 2 3 4
@@ -117,11 +128,9 @@ namespace OASystem.Domain.Dtos.PersonnelModule
         /// 0 否 1 是  
         /// 是否纳入绩效考核
         /// </summary>
-        public int IsIntoPerformance { get; set; } = 0;
+        public int IsIntoPerformance { get; set; } = 1;
     }
 
-    //
-
     /// <summary>
     /// 任务分配 
     /// 任务归属人 状态操作
@@ -138,7 +147,6 @@ namespace OASystem.Domain.Dtos.PersonnelModule
     /// </summary>
     public class TaskerStatusDto
     {
-
         public int UserId { get; set; }
 
         public int Id { get; set; }
@@ -162,13 +170,28 @@ namespace OASystem.Domain.Dtos.PersonnelModule
     /// 任务分配 
     /// 任务状态更改
     /// </summary>
-    public class TaskAllocationStatusDto
+    public class TaskAllocationStatusDto : UserPageFuncDtoBase
     {
         /// <summary>
         /// Id
         /// </summary>
         public int SubId { get; set; }
+    }
 
+    /// <summary>
+    /// 任务发布者 单人设置审批状态
+    /// </summary>
+    public class TaskAllocationSetAuditStatusDto : UserPageFuncDtoBase
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 实际结束时间
+        /// </summary>
+        public string OverTime { get; set; }
     }
 
     /// <summary>

+ 19 - 1
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskAllocation.cs

@@ -45,6 +45,12 @@ namespace OASystem.Domain.Entities.PersonnelModule
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int TaskPriority { get; set; }
 
+        /// <summary>
+        /// 任务类型 Setdata
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int TaskType { get; set; }
+
         /// <summary>
         /// 任务预计开始时间(由发布者设置开始时间)
         /// </summary>
@@ -57,6 +63,18 @@ namespace OASystem.Domain.Entities.PersonnelModule
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
         public string? PredictEndTime { get; set; }
 
+        /// <summary>
+        /// 实际开始时间
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
+        public string? BeginTime { get; set; }
+
+        /// <summary>
+        /// 实际完成时间
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
+        public string? OverTime { get; set; }
+
         /// <summary>
         /// 任务状态
         /// 0 未开始 1 进行中 2 待审核 3 未完成 4 已完成 5 任务终止
@@ -72,8 +90,8 @@ namespace OASystem.Domain.Entities.PersonnelModule
         public int IsComplete { get; set; } = 0;
 
         /// <summary>
-        /// 0 否 1 是  
         /// 是否纳入绩效考核
+        /// 0 否 1 是  
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int IsIntoPerformance { get; set; } = 0;

+ 11 - 3
OASystem/OASystem.Domain/ViewModels/PersonnelModule/TaskAllocationView.cs

@@ -37,6 +37,7 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
 
         public List<ValueInfo>? GroupNameInfos { get; set; }
         public ValueInfo? DepartmentNameInfo { get; set; }
+        public List<ValueInfo>? TaskTypeInfos { get; set; }
 
     }
 
@@ -129,6 +130,8 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         /// </summary>
         public string? TaskName { get; set; }
 
+        public string TaskTyoeName { get; set; }
+
         public string TaskContent { get; set; }
 
         /// <summary>
@@ -151,6 +154,8 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         /// </summary>
         public int Status { get; set; }
 
+        public int CreateUserId { get; set; }
+
         /// <summary>
         /// 任务发布人
         /// </summary>
@@ -176,11 +181,14 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         public string? Participant { get; set; }
 
         /// <summary>
-        /// 任务完成者
+        /// 编辑权限
         /// </summary>
-        public string? Consummator { get; set; }
+        public bool EditPerm { get; set; } = false;
 
-        public TaskerDetailsView[] TaskerDetails { get; set; } = Array.Empty<TaskerDetailsView>();
+        /// <summary>
+        /// 任务终止权限
+        /// </summary>
+        public bool TaskStopPerm { get; set; } = false;
     }
 
     /// <summary>

+ 397 - 193
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/TaskAllocationRepository.cs

@@ -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)
             {