Browse Source

任务指派
Add Or Edit

leiy 1 year ago
parent
commit
e2277eb1f2

+ 3 - 2
OASystem/EntitySync/Program.cs

@@ -124,8 +124,9 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Dis_Country), //国家
     //typeof(Dis_City), //城市 
     //typeof(Fin_GroupExtraCost), //超支费用 
-    typeof(Pm_TaskAllocation), //任务分配 
-    typeof(Pm_TaskRelevanceUser), //任务分配关联人员(完成者) 
+    //typeof(Pm_TaskAllocation), //任务分配 
+    //typeof(Pm_TaskRelevanceUser), //任务分配关联人员(完成者) 
+    typeof(Pm_TaskJobRelevancy), //任务分配关联人员(完成者) 
 
 });
 Console.WriteLine("数据库结构同步完成!");

+ 7 - 7
OASystem/OASystem.Api/Controllers/MarketCustomerResourcesController.cs

@@ -36,11 +36,11 @@ namespace OASystem.API.Controllers
                 Result resultData = await _clientDataRepository._Init(dto.PortType);
                 if (resultData.Code == 0)
                 {
-                    jw = JsonView(true, resultData.Msg, resultData.Data);
+                    jw = JsonView(true, "查询成功!", resultData.Data);
                 }
                 else
                 {
-                    jw = JsonView(false, resultData.Msg, resultData.Data);
+                    jw = JsonView(false, resultData.Msg);
                 }
             }
             catch (Exception)
@@ -65,11 +65,11 @@ namespace OASystem.API.Controllers
                 Result resultData = await _clientDataRepository.QueryNewClientData(dto);
                 if (resultData.Code == 0)
                 {
-                    jw = JsonView(true, resultData.Msg, resultData.Data);
+                    jw = JsonView(true, "查询成功!", resultData.Data);
                 }
                 else
                 {
-                    jw = JsonView(false, resultData.Msg, resultData.Data);
+                    jw = JsonView(false, resultData.Msg);
                 }
             }
             catch (Exception)
@@ -92,14 +92,14 @@ namespace OASystem.API.Controllers
             JsonView jw = new JsonView();
             try
             {
-                Result resultData = await _clientDataRepository._BatchAssignment(dto.PortType , dto.Id);
+                Result resultData = await _clientDataRepository._Details(dto.PortType , dto.Id);
                 if (resultData.Code == 0)
                 {
-                    jw = JsonView(true, resultData.Msg, resultData.Data);
+                    jw = JsonView(true, "查询成功!", resultData.Data);
                 }
                 else
                 {
-                    jw = JsonView(false, resultData.Msg, resultData.Data);
+                    jw = JsonView(false, resultData.Msg);
                 }
             }
             catch (Exception)

+ 133 - 2
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,4 +1,5 @@
 using Aspose.Cells;
+using NPOI.POIFS.Crypt.Dsig;
 using OASystem.API.OAMethodLib;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
 using OASystem.Domain.Dtos.PersonnelModule;
@@ -26,6 +27,7 @@ namespace OASystem.API.Controllers
         private readonly IQiYeWeChatApiService _qiYeWeChatApiService;
         private readonly WageSheetRepository _wageSheetRep;
         private readonly UsersRepository _usersRep;
+        private readonly TaskAllocationRepository _taskAllocationRep;
 
         private string url;
         private string path;
@@ -37,7 +39,8 @@ namespace OASystem.API.Controllers
         /// <param name="wageSheetRep"></param>
         /// <param name="usersRep"></param>
         /// <param name="mapper"></param>
-        public PersonnelModuleController(IQiYeWeChatApiService qiYeWeChatApiService,WageSheetRepository wageSheetRep, UsersRepository usersRep, IMapper mapper)
+        public PersonnelModuleController(IQiYeWeChatApiService qiYeWeChatApiService,WageSheetRepository wageSheetRep, UsersRepository usersRep, IMapper mapper, 
+            TaskAllocationRepository taskAllocationRep)
         {
             _mapper = mapper;
             _usersRep = usersRep;
@@ -45,13 +48,14 @@ namespace OASystem.API.Controllers
             _wageSheetRep = wageSheetRep;
             _result = new Result();
 
-
             url = AppSettingsHelper.Get("ExcelBaseUrl");
             path = AppSettingsHelper.Get("ExcelBasePath");
             if (!System.IO.Directory.Exists(path))
             {
                 System.IO.Directory.CreateDirectory(path);//不存在就创建文件夹
             }
+
+            this._taskAllocationRep = taskAllocationRep;
         }
 
         #region 工资表单
@@ -949,6 +953,133 @@ namespace OASystem.API.Controllers
 
         #region 任务单
 
+        /// <summary>
+        /// 任务分配 
+        /// 基础数据源
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostTaskAllocationInit(TaskAllocationInitDto _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.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限!"));
+                #endregion
+
+                #endregion
+
+                var _view = await _taskAllocationRep._Init(_dto.PortType, _dto.UserId);
+                if (_view.Code==0)
+                {
+                    return Ok(JsonView(true, "查询成功!", _view.Data));
+                }
+
+                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> PostTaskAllocationDetails(TaskAllocationDetailsDto _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.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限!"));
+                #endregion
+
+                #endregion
+
+                var _view = await _taskAllocationRep._Details(_dto.PortType, _dto.Id);
+                if (_view.Code == 0)
+                {
+                    return Ok(JsonView(true, "查询成功!", _view.Data));
+                }
+
+                return Ok(JsonView(false, _view.Msg));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
+
+        /// <summary>
+        /// 任务分配
+        /// Add Or Edit
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> PostTaskAllocationAddOrEdit(TaskAllocationAddOrEditDto _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 (_dto.Id == 0)
+                {
+                    if (pageFunAuthView.AddAuth == 0) return Ok(JsonView(false, "您没有添加权限!"));
+                }
+                else if (_dto.Id > 0)
+                {
+
+                    if (pageFunAuthView.EditAuth == 0) return Ok(JsonView(false, "您没有编辑权限!"));
+                }
+
+                
+                #endregion
+
+                #endregion
+
+                var _view = await _taskAllocationRep._AddOrEdit(_dto);
+                if (_view.Code == 0)
+                {
+                    return Ok(JsonView(true, "操作成功!"));
+                }
+
+                return Ok(JsonView(false, _view.Msg));
+            }
+            catch (Exception ex)
+            {
+                return Ok(JsonView(false, ex.Message));
+            }
+        }
         #endregion
     }
 }

+ 3 - 0
OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs

@@ -264,6 +264,9 @@ namespace OASystem.Domain.AutoMappers
 
             CreateMap<WageSheetMonthWorkdaysAddOrEditDto, Pm_WageIssueWorkingDay>();
             CreateMap<CalendarInfoView, Sys_Calendar>();
+
+
+            CreateMap<TaskAllocationAddOrEditDto, Pm_TaskAllocation>();
             #endregion
         }
     }

+ 95 - 0
OASystem/OASystem.Domain/Dtos/PersonnelModule/TaskAllocationDto.cs

@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.PersonnelModule
+{
+    public class TaskAllocationDto
+    {
+    }
+
+    /// <summary>
+    /// 任务分配 Init Dto
+    /// </summary>
+    public class TaskAllocationInitDto : UserPageFuncDtoBase
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public int UserId { get; set; }
+
+    }
+
+    /// <summary>
+    /// 任务分配 Details Dto
+    /// </summary>
+    public class TaskAllocationDetailsDto : UserPageFuncDtoBase
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public int Id { get; set; }
+    }
+
+    /// <summary>
+    /// 任务分配 AddOrEdit Dto
+    /// </summary>
+    public class TaskAllocationAddOrEditDto : UserPageFuncDtoBase
+    {
+        /// <summary>
+        /// Id
+        /// Id == 0 添加
+        /// Id > 0 修改
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 部门Id
+        /// </summary>
+        public int DepId { get; set; }
+
+        /// <summary>
+        /// 团组Id
+        /// </summary>
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 优先级
+        /// 1 2 3 4
+        /// </summary>
+        public int TaskPriority { get; set; }
+
+        /// <summary>
+        /// 任务名称
+        /// </summary>
+        public string? TaskName { get; set; }
+
+        /// <summary>
+        /// 任务内容
+        /// </summary>
+        public string? TaskContent { get; set; }
+
+        /// <summary>
+        /// 指派人员
+        /// </summary>
+        public List<int>? UserIds { get; set; }
+
+        /// <summary>
+        /// 任务预计开始时间(由发布者设置开始时间)
+        /// </summary>
+        public string? PredictBeginTime { get; set; }
+
+        /// <summary>
+        /// 任务预计结束时间(由发布者设置结束时间)
+        /// </summary>
+        public string? PredictEndTime { get; set; }
+
+        /// <summary>
+        /// 0 否 1 是  
+        /// 是否纳入绩效考核
+        /// </summary>
+        public int IsIntoPerformance { get; set; } = 0;
+    }
+}

+ 3 - 2
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskAllocation.cs

@@ -21,6 +21,7 @@ namespace OASystem.Domain.Entities.PersonnelModule
 
         /// <summary>
         /// 任务归属部门ID
+        /// CompanyId = 2 的部门Id 为任务部门Id
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int DepId { get; set; }
@@ -60,13 +61,13 @@ namespace OASystem.Domain.Entities.PersonnelModule
         ///  发布者确认任务是否完成(员工任务完成时间小于或等于有效时间 默认完成)
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
-        public int IsComplete { get; set; }
+        public int IsComplete { get; set; } = 0;
 
         /// <summary>
         /// 0 否 1 是  
         /// 是否纳入绩效考核
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
-        public int IsIntoPerformance { get; set; }
+        public int IsIntoPerformance { get; set; } = 0;
     }
 }

+ 26 - 0
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskJobRelevancy.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.PersonnelModule
+{
+    /// <summary>
+    /// 任务分配
+    /// 任务权限(userId 控制userId)
+    /// </summary>
+    public class Pm_TaskJobRelevancy:EntityBase
+    {
+        /// <summary>
+        /// 主职位为四川泛美公司的总经理/副总经理/经理/主管 UserId
+        /// </summary>
+        public int PrimaryUserId { get; set; }
+
+        /// <summary>
+        /// 其他公司或四川泛美公司的职位 的UserId
+        /// </summary>
+        public int SubUserId { get; set; }
+
+    }
+}

+ 6 - 6
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_TaskRelevanceUser.cs

@@ -29,7 +29,7 @@ namespace OASystem.Domain.Entities.PersonnelModule
         /// 实际开始时间
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
-        public string? BeginTime { get; set; }
+        public string? BeginTime { get; set; } = "";
 
         /// <summary>
         /// 实际结束时间
@@ -37,26 +37,26 @@ namespace OASystem.Domain.Entities.PersonnelModule
         /// 大于任务分配的预计结束时间且未开始 默认未完成 原因 未开始
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(50)")]
-        public string? OverTime { get; set; }
+        public string? OverTime { get; set; } = "";
 
         /// <summary>
         /// 任务状态 
-        /// 0 已知晓 1 进行中 2 待审核 3 未完成  4 已完成 5任务中止
+        /// -1 未开始 0 已知晓 1 进行中 2 待审核 3 未完成  4 已完成 5任务中止
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
-        public int TaskStatus { get; set; }
+        public int TaskStatus { get; set; } = -1;
 
         /// <summary>
         /// 未完成原因
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(200)")]
-        public string? Cause { get; set; }
+        public string? Cause { get; set; } = "";
 
         /// <summary>
         /// 评分 
         /// 1 优秀(9-10) 2 良好(7-9) 3 一般(5-6) 4 不合格(0-5)
         /// </summary>
         [SugarColumn(IsNullable = true, ColumnDataType = "int")]
-        public int Score { get; set; }
+        public int Score { get; set; } = 0;
     }
 }

+ 1 - 3
OASystem/OASystem.Domain/ViewModels/CRM/NewClientDataView.cs

@@ -87,7 +87,7 @@ namespace OASystem.Domain.ViewModels.CRM
         /// <summary>
         /// 护照日期
         /// </summary>
-        public DateTime? PassportDate { get; set; }
+        public string? PassportDate { get; set; }
 
         /// <summary>
         /// 生日
@@ -97,13 +97,11 @@ namespace OASystem.Domain.ViewModels.CRM
         /// <summary>
         /// 预计出团
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int PreDele { get; set; }
 
         /// <summary>
         /// 已出团
         /// </summary>
-        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
         public int FinlishedDele { get; set; }
 
         /// <summary>

+ 199 - 0
OASystem/OASystem.Domain/ViewModels/PersonnelModule/TaskAllocationView.cs

@@ -0,0 +1,199 @@
+using OASystem.Domain.Entities.PersonnelModule;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.PersonnelModule
+{
+    /// <summary>
+    /// 任务分配View
+    /// </summary>
+    public class TaskAllocationView: Pm_TaskAllocation
+    {
+    }
+
+    /// <summary>
+    /// 任务分配
+    /// 基础数据 View
+    /// </summary>
+    public class InitView
+    {
+        /// <summary>
+        /// 任务操作权限
+        /// </summary>
+        public TaskOperationAudit TaskOperationAudit { get; set; }
+        /// <summary>
+        /// 任务名称 Items
+        /// </summary>
+        public List<string>? TaskNameInfos { get; set; }
+
+        /// <summary>
+        /// 执行任务人员信息 Items
+        /// </summary>
+        public List<ExecuteTaskUserInfo>? ExecuteTaskUserInfos { get; set; }
+
+        public List<ValueInfo>? GroupNameInfos { get; set; }
+        public ValueInfo? DepartmentNameInfo { get; set; }
+
+    }
+
+    /// <summary>
+    /// 预览信息
+    /// </summary>
+    public class ValueInfo
+    {
+        public int Id { get; set; }
+
+        public string Name { get; set; }
+    }
+
+    /// <summary>
+    /// 执行任务人员信息
+    /// </summary>
+    public class ExecuteTaskUserInfo
+    {
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string? Name { get; set; }
+
+        /// <summary>
+        /// 公司名称
+        /// </summary>
+        public string? CompanyName { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string? DepartmentName { get; set; }
+
+        /// <summary>
+        /// 职位名称
+        /// </summary>
+        public string? JobName { get; set; }
+    }
+
+    /// <summary>
+    /// 任务操作权限
+    /// </summary>
+    public class TaskOperationAudit
+    {
+        /// <summary>
+        /// 任务添权限
+        /// 0 否 1 是
+        /// </summary>
+        public int TaskAddAudit { get; set; } = 0;
+
+        /// <summary>
+        /// 任务删除权限
+        /// 0 否 1 是
+        /// </summary>
+        public int TaskDelAudit { get; set; } = 0;
+
+        /// <summary>
+        /// 任务终止权限
+        /// 0 否 1 是
+        /// </summary>
+        public int TasStopAudit { get; set; } = 0;
+    }
+
+    /// <summary>
+    /// 详情
+    /// </summary>
+    public class TaskDetailsView
+    {
+        public int Id { get; set; }
+
+        public int DiId { get; set; }
+
+        /// <summary>
+        /// 任务部门Id 
+        /// CompanyId = 2 的部门Id 为任务部门Id
+        /// </summary>
+        public int DepId { get; set; }
+
+        public int CreateUserId { get; set; }
+
+        public DateTime? CreateTime { get; set; }
+
+        /// <summary>
+        /// 任务名称
+        /// </summary>
+        public string? TaskName { get; set; }
+
+        /// <summary>
+        /// 任务内容
+        /// </summary>
+        public string? TaskContent { get; set; }
+
+        /// <summary>
+        /// 优先级
+        /// 1 2 3 4
+        /// </summary>
+        public int TaskPriority { get; set; }
+
+        /// <summary>
+        /// 任务预计开始时间(由发布者设置开始时间)
+        /// </summary>
+        public string? PredictBeginTime { get; set; }
+
+        /// <summary>
+        /// 任务预计结束时间(由发布者设置结束时间)
+        /// </summary>
+        public string? PredictEndTime { get; set; }
+
+        /// <summary>
+        /// 0 否 1 是  
+        /// 是否纳入绩效考核
+        /// </summary>
+        public int IsIntoPerformance { get; set; }
+
+        /// <summary>
+        /// 人员任务
+        /// </summary>
+        public List<TaskUserDetailsView>? UserTaskInfos { get; set; }
+
+        public string Remark { get; set; }
+    }
+
+    /// <summary>
+    /// 任务参与人
+    /// </summary>
+    public class TaskUserDetailsView 
+    {
+        public int Id { get; set; }
+
+        public int TAId { get; set; }
+
+        public int UserId { get; set; }
+
+        /// <summary>
+        /// 实际开始时间
+        /// </summary>
+        public string BeginTime { get; set; }
+
+        /// <summary>
+        /// 实际完成时间
+        /// </summary>
+        public string OverTime { get; set; }
+
+        /// <summary>
+        /// 任务状态
+        /// </summary>
+        public int TaskStatus { get; set; }
+
+        /// <summary>
+        /// 未完成原因
+        /// </summary>
+        public string Cause { get; set; }
+
+        /// <summary>
+        /// 评分备注
+        /// </summary>
+        public string Remark { get; set; }
+    }
+}

+ 16 - 0
OASystem/OASystem.Domain/ViewModels/PersonnelModule/TaskRelevanceUserView.cs

@@ -0,0 +1,16 @@
+using OASystem.Domain.Entities.PersonnelModule;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.PersonnelModule
+{
+    /// <summary>
+    /// 任务分配关联人员 view
+    /// </summary>
+    public class TaskRelevanceUserView :Pm_TaskRelevanceUser
+    {
+    }
+}

+ 20 - 14
OASystem/OASystem.Infrastructure/Repositories/CRM/NewClientDataRepository.cs

@@ -138,7 +138,7 @@ namespace OASystem.Infrastructure.Repositories.CRM
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        public async Task<Result> _BatchAssignment(int portType,int id)
+        public async Task<Result> _Details(int portType,int id)
         {
             Result result = new Result() { Code = -2, Msg = "未知错误" };
 
@@ -868,13 +868,13 @@ namespace OASystem.Infrastructure.Repositories.CRM
         public async Task<Result> _BatchAssignment(BatchAssignmentDto dto)
         {
             Result AcrionResult = new Result() { Code = -1,Msg="操作失败"};
-            if (dto.UserIdItem != null || dto.UserIdItem.Count < 1)
+            if (dto.UserIdItem == null || dto.UserIdItem.Count < 1)
             {
                 AcrionResult.Msg = "用户ID集合不能为空!";
                 return AcrionResult;
             }
 
-            if (dto.ClientDataIdItem != null || dto.ClientDataIdItem.Count < 1)
+            if (dto.ClientDataIdItem == null || dto.ClientDataIdItem.Count < 1)
             {
                 AcrionResult.Msg = "客户资料ID集合不能为空!";
                 return AcrionResult;
@@ -882,22 +882,28 @@ namespace OASystem.Infrastructure.Repositories.CRM
 
             List<Crm_ClientDataAndUser> _ClientDataAndUsers = new List<Crm_ClientDataAndUser>();
 
-            List < Crm_ClientDataAndUser > _ClientDataAndUsers1 = await _sqlSugar.Queryable< Crm_ClientDataAndUser >().Where(it => it.IsDel == 0).ToListAsync();
+            List<Crm_ClientDataAndUser> _ClientDataAndUsers1 = await _sqlSugar.Queryable<Crm_ClientDataAndUser>()
+                                                                              .Where(it =>
+                                                                                           it.IsDel == 0 &&
+                                                                                           dto.ClientDataIdItem.Contains(it.NewClientDataId) &&
+                                                                                           dto.UserIdItem.Contains(it.usersId)
+                                                                                     )
+                                                                              .ToListAsync();
             foreach (var clientDataId in dto.ClientDataIdItem)
             {
-                Crm_ClientDataAndUser ClientDataAndUser = new Crm_ClientDataAndUser()
-                { 
-                    CreateUserId = dto.UserId,
-                    NewClientDataId = clientDataId
-                };
-
-                foreach (var userId in dto.UserIdItem)
+                foreach (var userId1 in dto.UserIdItem)
                 {
-                    ClientDataAndUser.usersId = userId;
-                    Crm_ClientDataAndUser _ClientDataAndUsers2 = _ClientDataAndUsers1.Where(it => it.NewClientDataId == clientDataId && it.usersId == userId).FirstOrDefault();
+                    Crm_ClientDataAndUser _ClientDataAndUsers2 = _ClientDataAndUsers1.Where(it => it.NewClientDataId == clientDataId && 
+                                                                                                  it.usersId == userId1
+                                                                                            ).FirstOrDefault();
                     if (_ClientDataAndUsers2 == null)
                     {
-                        _ClientDataAndUsers.Add(ClientDataAndUser);
+                        _ClientDataAndUsers.Add(new Crm_ClientDataAndUser()
+                        {
+                            CreateUserId = dto.UserId,
+                            NewClientDataId = clientDataId,
+                            usersId = userId1
+                        });
                     }
                 }
             }

+ 385 - 0
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/TaskAllocationRepository.cs

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