3 Коміти dc63431b95 ... 58d66ee5b5

Автор SHA1 Опис Дата
  Lyyyi 58d66ee5b5 Merge branch 'develop' of http://132.232.92.186:3000/XinXiBu/OA2023 into develop 1 місяць тому
  Lyyyi 5db9012468 团组流程节点提示时间动态读取固定日期调整及节点名称更改 1 місяць тому
  Lyyyi 88fdc47a39 任务分配调整 1 місяць тому

+ 12 - 88
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -1,20 +1,13 @@
 using Aspose.Cells;
-using Aspose.Cells.Drawing;
 using Aspose.Words;
 using Aspose.Words.Drawing;
 using Aspose.Words.Tables;
 using DiffMatchPatch;
 using Dm.util;
-using Humanizer;
 using iTextSharp.text.pdf;
-using k8s.KubeConfigModels;
-using Microsoft.AspNetCore.Routing.Template;
 using Microsoft.AspNetCore.SignalR;
-using NPOI.POIFS.NIO;
-using NPOI.SS.Formula.Functions;
 using NPOI.SS.UserModel;
 using NPOI.SS.Util;
-using NPOI.Util;
 using NPOI.XSSF.UserModel;
 using OASystem.API.Middlewares;
 using OASystem.API.OAMethodLib;
@@ -33,45 +26,29 @@ using OASystem.Domain.Dtos.CRM;
 using OASystem.Domain.Dtos.FileDto;
 using OASystem.Domain.Dtos.Financial;
 using OASystem.Domain.Dtos.Groups;
-using OASystem.Domain.Dtos.PersonnelModule;
-using OASystem.Domain.Dtos.System;
 using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Financial;
 using OASystem.Domain.Entities.Groups;
-using OASystem.Domain.ViewModels.CRM;
 using OASystem.Domain.ViewModels.Financial;
 using OASystem.Domain.ViewModels.Groups;
-using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.Domain.ViewModels.OCR;
-using OASystem.Domain.ViewModels.SmallFun;
 using OASystem.Infrastructure.Logging;
 using OASystem.Infrastructure.Repositories.CRM;
 using OASystem.Infrastructure.Repositories.Financial;
 using OASystem.Infrastructure.Repositories.Groups;
-using OASystem.Infrastructure.Tools;
-using OASystem.RedisRepository;
-using Quartz.Logging;
 using Quartz.Util;
-using SQLitePCL;
-using SqlSugar;
 using SqlSugar.Extensions;
 using System.Collections;
 using System.ComponentModel.DataAnnotations;
 using System.Data;
 using System.Diagnostics;
 using System.Globalization;
-using System.IO;
 using System.IO.Compression;
 using System.Linq.Expressions;
-using System.Security.Cryptography.Xml;
 using System.Text.Json;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
 using System.Web;
-using YamlDotNet.Core;
 using static OASystem.API.OAMethodLib.JWTHelper;
 using static OASystem.Infrastructure.Repositories.Groups.AirTicketResRepository;
-using static OpenAI.GPT3.ObjectModels.SharedModels.IOpenAiModels;
 using Bookmark = Aspose.Words.Bookmark;
 using Cell = Aspose.Words.Tables.Cell;
 using Table = Aspose.Words.Tables.Table;
@@ -4082,12 +4059,13 @@ FROM
 
             _sqlSugar.BeginTran();
 
-            var infos = await _sqlSugar.Queryable<Crm_DeleClient>().Where(x => x.IsDel == 0).Select(x => new { x.Id,x.FirstName,x.LastName,x.Phone }).ToListAsync();
+            var infos = await _sqlSugar.Queryable<Crm_DeleClient>().Where(x => x.IsDel == 0).Select(x => new { x.Id, x.FirstName, x.LastName, x.Phone }).ToListAsync();
 
             var infoDecrypts = new List<dynamic>();
             foreach (var item in infos)
             {
-                infoDecrypts.Add(new { 
+                infoDecrypts.Add(new
+                {
                     Id = item.Id,
                     FirstName = AesEncryptionHelper.Decrypt(item.FirstName),
                     LastName = AesEncryptionHelper.Decrypt(item.LastName),
@@ -4095,9 +4073,9 @@ FROM
                 });
             }
 
-            var infoVaild = infoDecrypts.Where(x => 
-                info.FirstName.Equals(x.x.FirstName) && 
-                info.LastName.Equals(x.x.LastName) && 
+            var infoVaild = infoDecrypts.Where(x =>
+                info.FirstName.Equals(x.x.FirstName) &&
+                info.LastName.Equals(x.x.LastName) &&
                 info.Phone.Equals(x.x.Phone))
                 .FirstOrDefault();
 
@@ -4121,10 +4099,10 @@ FROM
                 EncryptionProcessor.EncryptProperties(info);
 
                 var insertId = await _sqlSugar.Insertable(info).ExecuteReturnIdentityAsync();
-                if (insertId <  1)
+                if (insertId < 1)
                 {
                     _sqlSugar.RollbackTran();
-                    return Ok(JsonView(false,"信息添加失败!"));
+                    return Ok(JsonView(false, "信息添加失败!"));
                 }
 
                 if (familys.Any())
@@ -4170,7 +4148,8 @@ FROM
                 }
             }
             //修改
-            else {
+            else
+            {
                 int id = infoVaild?.Id ?? 0;
                 var updInfo = await _sqlSugar.Queryable<Crm_DeleClient>().FirstAsync(x => x.Id == id);
 
@@ -4194,7 +4173,7 @@ FROM
 
                 EncryptionProcessor.EncryptProperties(updInfo);
 
-                var upd = await _sqlSugar.Updateable(updInfo).ExecuteCommandAsync(); 
+                var upd = await _sqlSugar.Updateable(updInfo).ExecuteCommandAsync();
                 if (upd < 1)
                 {
                     _sqlSugar.RollbackTran();
@@ -4275,61 +4254,6 @@ FROM
             return Ok(JsonView(true));
         }
 
-        /// <summary>
-        /// 签证表构建sql语句
-        /// 只更新null或者“”的逐句
-        /// </summary>
-        /// <param name="entity"></param>
-        /// <returns>修改sql语句</returns>
-        public static string UpdateEntityIfNullOrEmpty(Crm_DeleClient entity) 
-        {
-            string updateSql = string.Empty;
-            var type = typeof(T);
-            var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
-            var tableName = type.Name; // 默认表名与类名相同
-            var updateList = new List<string>();
-
-            foreach (var property in properties)
-            {
-                var value = property.GetValue(entity);
-                if (value == null || value.ToString() == "")
-                {
-                    var columnName = property.Name;
-                    var defaultValue = GetDefaultValue(property.PropertyType);
-
-                    updateList.Add($"[{columnName}] = {defaultValue}");
-                }
-            }
-
-            if (updateList.Count > 0)
-            {
-                updateSql = $"UPDATE [{tableName}] SET {string.Join(", ", updateList)} WHERE Id = {entity.GetType().GetProperty("Id").GetValue(entity)}";
-            }
-
-            return updateSql;
-        }
-
-        // 获取字段的默认值
-        private static string GetDefaultValue(Type propertyType)
-        {
-            if (propertyType == typeof(int) || propertyType == typeof(int?))
-            {
-                return "0";
-            }
-            else if (propertyType == typeof(string))
-            {
-                return "NULL";
-            }
-            else if (propertyType == typeof(DateTime) || propertyType == typeof(DateTime?))
-            {
-                return "NULL";
-            }
-            else
-            {
-                return "NULL";
-            }
-        }
-
         private static bool TryGetNonEmptyStringProperty(JsonElement root, string propertyName, out string value)
         {
             value = null;
@@ -6565,7 +6489,7 @@ FROM
         {
             var data = await _groupRepository.GetCrmByGroupId(dto);
 
-            return Ok(JsonView(true, data.Code != 0 ? "暂无信息" : "操作成功", data.Data));
+            return Ok(JsonView(data.Code == 0, data.Code != 0 ? "暂无信息" : "操作成功", data.Data));
         }
 
 

+ 39 - 13
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,5 +1,6 @@
 using Aspose.Cells;
 using Dm.util;
+using EyeSoft.Runtime.InteropServices;
 using FluentValidation;
 using k8s.KubeConfigModels;
 using Markdig;
@@ -1052,6 +1053,9 @@ namespace OASystem.API.Controllers
                 groupArr = groupNames.Split(',').Select(part => part.Trim()).ToArray();
             }
 
+            var taskUserId1 = await _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.SubUserId == dto.UserId).Select(x => x.PrimaryUserId).FirstAsync();
+            var taskUserIds1 = await _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(it => it.IsDel == 0 && it.PrimaryUserId == taskUserId1).Select(x => x.SubUserId).ToListAsync();
+
             //任务人员限定 发布者可看范围内的人员,接受者只能看自己的任务
             var taskPublisher = await _taskAllocationRep.ValidateTaskPublisher(dto.UserId);
             var taskUserIds = new List<int>();
@@ -1068,7 +1072,7 @@ namespace OASystem.API.Controllers
 
             RefAsync<int> total = 0;
             var view = await _sqlSugar.Queryable<Pm_TaskAllocation>()
-                .LeftJoin<Sys_Department>((ta, d) => ta.DepId == d.Id)
+                .LeftJoin<Sys_SetData>((ta, d) => ta.DepId == d.Id)
                 .LeftJoin<Grp_DelegationInfo>((ta, d, di) => ta.DiId == di.Id)
                 .LeftJoin<Sys_Users>((ta, d, di, u) => ta.CreateUserId == u.Id)
                 .LeftJoin<Sys_SetData>((ta, d, di, u, sd) => ta.TaskType == sd.Id)
@@ -1092,7 +1096,7 @@ namespace OASystem.API.Controllers
                     TaskContent = ta.TaskContent,
                     TaskTypeName = sd.Name,
                     TaskPriority = ta.TaskPriority,
-                    DepName = d.DepName,
+                    DepName = d.Name,
                     TeamName = di.TeamName,
                     Status = (int)ta.Status,
                     PredictBeginTime = ta.PredictBeginTime,
@@ -1106,29 +1110,51 @@ namespace OASystem.API.Controllers
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
 
             int index = 1;
+            var taskCompletedPerm = _sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(x => x.IsDel == 0 && x.PrimaryUserId == dto.UserId).Any(); 
             foreach (var item in view)
             {
                 item.RowNumber = index;
                 //设置参与人
-                var userNames = await _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
+                var userNames = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
                     .LeftJoin<Sys_Users>((tru, u) => tru.UserId == u.Id)
                     .Where((tru, u) => tru.IsDel == 0 && tru.TAId == item.Id)
                     .Select((tru, u) => u.CnName)
-                    .ToListAsync();
+                    .ToList();
                 item.Participant = string.Join("、", userNames);
 
-                //设置编辑权限
-                (bool editPerm, string msg1) = _taskAllocationRep.EditPerm(item.Id, dto.UserId);
-                item.EditPerm = editPerm;
                 //设置任务确认权限
-                if (item.CreateUserId == dto.UserId) item.TaskCompletedPerm = true;
+                item.TaskCompletedPerm = taskCompletedPerm;
+
+                //设置编辑权限
+                if (item.TaskCompletedPerm || item.CreateUserId == dto.UserId)
+                {
+                    item.EditPerm = true;
+                }
+
+                if (item.Status == (int)TaskEnum.Finished && taskUserIds1.Contains(dto.UserId))
+                {
+                    item.EditPerm = false;
+                }
+
                 //设置已知晓权限
-                (bool havePerm, string msg3) = _taskAllocationRep.TaskHavePerm(item.Id, dto.UserId);
-                item.TaskHavePerm = havePerm;
+                if (item.Status == (int)TaskEnum.NotStarted || userNames.Count > 1)
+                {
+                    item.TaskHavePerm = true;
+                }
+
+                if (taskCompletedPerm)
+                {
+                    item.TaskHavePerm = false;
+                }
+
                 //设置详情权限
-                item.TaskDetailsPerm = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
-                    .Where(it => it.IsDel == 0 && it.TAId == item.Id && (it.UserId == dto.UserId || it.CreateUserId == dto.UserId))
-                    .Any();
+                if (item.TaskCompletedPerm) item.TaskDetailsPerm = true;
+                else
+                {
+                    item.TaskDetailsPerm = _sqlSugar.Queryable<Pm_TaskRelevanceUser>()
+                        .Where(it => it.IsDel == 0 && it.TAId == item.Id && (it.UserId == dto.UserId || it.CreateUserId == dto.UserId))
+                        .Any();
+                }
 
                 index++;
             }

+ 24 - 0
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/GrpNodeAlert.cs

@@ -0,0 +1,24 @@
+using OASystem.API.OAMethodLib.QiYeWeChatAPI;
+using OASystem.Infrastructure.Repositories.Groups;
+
+namespace OASystem.API.OAMethodLib.Quartz.Business
+{
+    /// <summary>
+    /// 团组流程节点预警
+    /// </summary>
+    public static class GrpNodeAlert
+    {
+        private readonly static DelegationInfoRepository _grpDeleRep = AutofacIocManager.Instance.GetService<DelegationInfoRepository>();
+        private static readonly IQiYeWeChatApiService _qiYeWeChatApiService = AutofacIocManager.Instance.GetService<IQiYeWeChatApiService>();
+
+        /// <summary>
+        /// 商邀流程节点预警消息推送
+        /// 
+        /// </summary>
+        public static async void PostMessage() 
+        {
+
+        }
+
+    }
+}

+ 2 - 1
OASystem/OASystem.Infrastructure/Repositories/Groups/DelegationInfoRepository.cs

@@ -6,6 +6,7 @@ using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Entities.Customer;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.ViewModels.Groups;
+using OASystem.Domain.ViewModels.JuHeExchangeRate;
 using OASystem.Infrastructure.Repositories.System;
 using OASystem.Infrastructure.Tools;
 using System.Diagnostics;
@@ -1326,12 +1327,12 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                 if (view.Count > 0)
                 {
-
                     result.Msg = "成功!";
                     result.Data = view;
                 }
                 else
                 {
+                    result.Code = 1;
                     result.Msg = "暂无数据!";
                 }
                 result.Code = 0;

+ 79 - 47
OASystem/OASystem.Infrastructure/Repositories/Groups/ProcessOverviewRepository.cs

@@ -99,25 +99,12 @@ namespace OASystem.Infrastructure.Repositories.Groups
             processs.Add(
                 Grp_ProcessOverview.Create(groupId, 1, GroupProcessType.Invitation, ProcessStatus.InProgress, currUserId,
                 new List<Grp_ProcessNode>()
-                    //{
-                    //    Grp_ProcessNode.Create(1, "报批基础资料准备",oaNode1Tips,ProcessStatus.InProgress, true,false,false,false,currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(2, "报批邀请函资料准备",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(2, "具体名单下放",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(3, "获得批件",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(3, "提交客户所需报件材料完毕",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(4, "对接公务",oaNode4Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(5, "参与翻译对接",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(5, "参与公务翻译人员落实",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(6, "商邀文案配合",oaNode6Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
-                    //    //Grp_ProcessNode.Create(7, "票据上传(相关票据)",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
-                    //    Grp_ProcessNode.Create(7, "公务邀请数据有效录入",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
-                    //}
                     {
-                        Grp_ProcessNode.Create(1, "报批基础资料准备",oaNode1Tips,ProcessStatus.InProgress, true,false,false,false,currUserId,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(2, "具体名单下放",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(3, "提交客户所需报件材料完毕",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(4, "对接公务",oaNode4Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
-                        Grp_ProcessNode.Create(5, "参与公务翻译人员落实",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(1, "初期报批文字材料",oaNode1Tips,ProcessStatus.InProgress, true,false,false,false,currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(2, "第一轮对接",oaNode2Tips, ProcessStatus.InProgress, false,false,false,false,currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(3, "第二轮对接",oaNode3Tips,ProcessStatus.InProgress, false,false,false,false, currUserId ,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(4, "取得邀请函",oaNode4Tips,ProcessStatus.InProgress, false,false,false,false, currUserId,oaNodeOpUsers),
+                        Grp_ProcessNode.Create(5, "公务等事项确认",oaNode5Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
                         Grp_ProcessNode.Create(6, "公务邀请数据有效录入",oaNode6Tips,ProcessStatus.InProgress, false,false,false,true, currUserId,oaNodeOpUsers),
                         Grp_ProcessNode.Create(7, "文件上传",oaNode7Tips,ProcessStatus.InProgress, false,false,true,false, currUserId,oaNodeOpUsers),
                     }
@@ -484,6 +471,43 @@ namespace OASystem.Infrastructure.Repositories.Groups
             return new Result { Code = 200, Data = processes, Msg = "查询成功!" };
         }
 
+        /// <summary>
+        /// 指定日期增加工作日
+        /// </summary>
+        /// <param name="startDate"></param>
+        /// <param name="days"></param>
+        /// <returns></returns>
+        private static DateTime AddWeekdays(DateTime startDate, int days)
+        {
+            DateTime currentDate = startDate;
+            if (days >= 0)
+            {
+                while (days > 0)
+                {
+                    currentDate = currentDate.AddDays(1);
+                    DayOfWeek day = currentDate.DayOfWeek;
+                    if (day != DayOfWeek.Saturday && day != DayOfWeek.Sunday)
+                    {
+                        days--;
+                    }
+                }
+            }
+            else
+            {
+                days = Math.Abs(days);
+                while (days > 0)
+                {
+                    currentDate = currentDate.AddDays(-1);
+                    DayOfWeek day = currentDate.DayOfWeek;
+                    if (day != DayOfWeek.Saturday && day != DayOfWeek.Sunday)
+                    {
+                        days--;
+                    }
+                }
+            }
+            return currentDate;
+        }
+
         /// <summary>
         /// 节点提示消息
         /// </summary>
@@ -495,44 +519,52 @@ namespace OASystem.Infrastructure.Repositories.Groups
         {
             string msg = string.Empty;
             int groupId = groupInfo.Id;
+            groupInfo.VisitDate = groupInfo.VisitDate.AddDays(1); //第二天开始计算
             switch (procType)
             {
                 case GroupProcessType.Invitation:
                     switch (nodeOrder)
                     {
                         case 1:
-                            msg = "更新报批行程和请示,提供其他报批所需材料,4个工作日内完成。";
+                            msg = "“完成基础请示、报批日程初稿”,4个工作日(仍需根据客户意见和联系情况及时修改补充所需其他材料,例如印证文件、成果表等,直至终稿)";
+
+                            if (groupInfo.Step == 1 || groupInfo.Step == 2)
+                            {
+                                if (groupInfo.StepOperationTime.HasValue)
+                                {
+                                    msg = $"请于{AddWeekdays(groupInfo.StepOperationTime.Value, 4):yyyy年MM月dd日}内完成该项工作(“完成基础请示、报批日程初稿”,4个工作日(仍需根据客户意见和联系情况及时修改补充所需其他材料,例如印证文件、成果表等,直至终稿))";
+                                }
+                            }
+
                             break;
                         case 2:
+                            msg = $"请于{AddWeekdays(groupInfo.VisitDate, 7):yyyy年MM月dd日}内完成该项工作(7个工作日,所有报批机构前部联系,邀请机构一个国家不少于4家进行重点对接(4家机构中,其中3家机构需有效对接,其中1家可为付费机构备选))";
+                            break;
+                        case 3:
+                            msg = "10个工作日,根据最新情况,联系公务机构1/3取得回应;邀请机构基本明确。";
+                            break;
+                        case 4:
                             var custInfo = _sqlSugar.Queryable<Grp_TourClientList>()
                                 .Where(c => c.DiId == groupId && c.IsDel == 0)
                                 .OrderByDescending(c => c.CreateTime)
                                 .First();
-                            //msg = "客户提供完整名单后,2周内取得邀请函(翻译件)。";
-                            //if (custInfo != null)
-                            //{
-                            //    msg = $"请于{custInfo.CreateTime.AddDays(14):yyyy年MM月dd日}内完成该项工作(客户提供完整名单后,2周内取得邀请函(翻译件))";
-                            //}
-                            msg = "下放后两周取得邀请函";
+
+                            msg = $"正式名单下放后2周内(含非工作日)。如团组前期准备时间已经较长,则按客户要求尽快提供。 加急团组备注特殊情况。";
+
                             if (custInfo != null)
                             {
-                                msg = $"请于{custInfo.CreateTime.AddDays(14):yyyy年MM月dd日}内完成该项工作(下放后两周取得邀请函)";
+                                msg = $"请于{custInfo.CreateTime.AddDays(14):yyyy年MM月dd日}内完成该项工作(正式名单下放后2周内(含非工作日)。如团组前期准备时间已经较长,则按客户要求尽快提供。 加急团组备注特殊情况。)";
                             }
-
-                            break;
-                        case 3:
-                            msg = "提供完整的报批全套资源。";
-                            break;
-                        case 4:
-                            msg = $"请于{groupInfo.VisitDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(按进度实际公务活动落实情况,出发前5日落实公务)";
                             break;
                         case 5:
+                            groupInfo.VisitDate = groupInfo.VisitDate.AddDays(-1); //时间倒推,调整回原始出发日期
+                            msg = $"请于{AddWeekdays(groupInfo.VisitDate,-5):yyyy年MM月dd日}内完成该项工作(团组出发前,5个工作日完成所有公务确认工作。";
+
                             break;
                         case 6:
                             break;
                         case 7:
-                            //msg = $"请于{groupInfo.VisitEndDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(团组结束前完成)";
-                            msg = $"请于{groupInfo.VisitEndDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(如果需要上传请在团组结束前完成)";
+                            msg = $"请于{groupInfo.VisitEndDate:yyyy年MM月dd日}内完成该项工作(如果需要上传请在团组结束前完成)";
                             break;
                     }
                     break;
@@ -567,15 +599,15 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         case 4:
                             break;
                         case 5:
-                            msg = $"请于{groupInfo.VisitDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(团组出发前5日)";
+                            msg = $"请于{AddWeekdays(groupInfo.VisitDate,2):yyyy年MM月dd日}内完成该项工作(团组出发前2个工作日)";
                             break;
                         case 6:
                             break;
                         case 7:
-                            msg = $"请于{groupInfo.VisitEndDate.AddDays(5):yyyy年MM月dd日}内完成该项工作(机票蓝联打票及上传机票超支费用账单,团组归国后5个工作日内)";
+                            msg = $"请于{AddWeekdays(groupInfo.VisitEndDate,5):yyyy年MM月dd日}内完成该项工作(机票蓝联打票及上传机票超支费用账单,团组归国后5个工作日内)";
                             break;
                         case 8:
-                            msg = $"1. 票据上传(机票报销蓝联、行程单及机票说明) \r\n 2. 请于{groupInfo.VisitEndDate.AddDays(10):yyyy年MM月dd日}内完成该项工作(团组归国后10个工作日内) *按机票报价*0.999折扣出具机票报销蓝联、行程单及机票说明";
+                            msg = $"1. 票据上传(机票报销蓝联、行程单及机票说明) \r\n 2. 请于{AddWeekdays(groupInfo.VisitEndDate,10):yyyy年MM月dd日}内完成该项工作(团组归国后10个工作日内) *按机票报价*0.999折扣出具机票报销蓝联、行程单及机票说明";
                             break;
                     }
                     break;
@@ -588,7 +620,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             {
                                 if (groupInfo.StepOperationTime.HasValue)
                                 {
-                                    msg = $"请于{groupInfo.StepOperationTime.Value.AddDays(2):yyyy年MM月dd日}内完成该项工作(建团后打勾确认出团的时候开始2个工作日)";
+                                    msg = $"请于{AddWeekdays(groupInfo.StepOperationTime.Value, 2):yyyy年MM月dd日}内完成该项工作(建团后打勾确认出团的时候开始2个工作日)";
                                 }
                             }
                             break;
@@ -597,10 +629,10 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         case 3:
                             break;
                         case 4:
-                            msg = $"1.行前再次确认酒店订单、付款状态及入住安排 \r\n 2.请于{groupInfo.VisitDate.AddDays(-5):yyyy年MM月dd日}内完成该项工作(团组出发前5天)";
+                            msg = $"1.行前再次确认酒店订单、付款状态及入住安排 \r\n 2.请于{AddWeekdays(groupInfo.VisitDate,-2):yyyy年MM月dd日}内完成该项工作(团组出发前2个工作日)";
                             break;
                         case 5:
-                            msg = $"1.行程结束后整理酒店发票(含超支费用发票)与结算 \r\n 2.请于{groupInfo.VisitEndDate.AddDays(5):yyyy年MM月dd日}内完成该项工作(团组结束后5天内)";
+                            msg = $"1.行程结束后整理酒店发票(含超支费用发票)与结算 \r\n 2.请于{AddWeekdays(groupInfo.VisitEndDate,5):yyyy年MM月dd日}内完成该项工作(团组结束后5个工作日内)";
                             break;
                     }
                     break;
@@ -615,17 +647,17 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             msg = $"机票行程代码最后一段录入后1个工作日内。";
                             if (airTripCodeInfo != null)
                             {
-                                msg = $"请于{airTripCodeInfo.CreateTime.AddDays(1):yyyy年MM月dd日}内完成该项工作(机票行程代码最后一段录入后1个工作日内)";
+                                msg = $"请于{AddWeekdays(airTripCodeInfo.CreateTime, 1):yyyy年MM月dd日}内完成该项工作(机票行程代码最后一段录入后1个工作日内)";
                             }
                             break;
                         case 2:
-                            msg = $"1.联系并询价地接、餐厅、用车、景点等供应商 \r\n 2. 请于{groupInfo.CreateTime.AddDays(7):yyyy年MM月dd日}内完成该项工作(建团完成后7个工作日内)";
+                            msg = $"1.联系并询价地接、餐厅、用车、景点等供应商 \r\n 2. 请于{AddWeekdays(groupInfo.VisitDate, 20):yyyy年MM月dd日}内完成该项工作(团组出行前20个工作日)";
                             break;
                         case 3:
-                            msg = $"请于{groupInfo.CreateTime.AddDays(10):yyyy年MM月dd日}内完成该项工作(上一步往后3个工作日内)";
+                            msg = $"请于{AddWeekdays(groupInfo.CreateTime, 10):yyyy年MM月dd日}内完成该项工作(上一步往后3个工作日内)";
                             break;
                         case 4:
-                            msg = $"请于{groupInfo.CreateTime.AddDays(12):yyyy年MM月dd日}内完成该项工作(上一步往后2个工作日内)";
+                            msg = $"请于{AddWeekdays(groupInfo.CreateTime, 12):yyyy年MM月dd日}内完成该项工作(上一步往后2个工作日内)";
                             break;
                         case 5:
                             var backListInfo = _sqlSugar.Queryable<Grp_InvertedList>().Where(x => x.DiId == groupId && x.IsDel == 0).First();
@@ -641,7 +673,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         case 6:
                             break;
                         case 7:
-                            msg = $"请于{groupInfo.VisitEndDate.AddDays(5):yyyy年MM月dd日}内完成该项工作(团组归国后5个工作日内) *上传最终报批行程,确定城市间交通最终版报价分配;地接账单(清楚标注超时及其他项超支费用)、地接交通费用原始票据、城市间交通明细表;";
+                            msg = $"请于{AddWeekdays( groupInfo.VisitEndDate,5):yyyy年MM月dd日}内完成该项工作(团组归国后5个工作日内) *上传最终报批行程,确定城市间交通最终版报价分配;地接账单(清楚标注超时及其他项超支费用)、地接交通费用原始票据、城市间交通明细表;";
                             break;
                     }
                     break;
@@ -655,7 +687,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                             msg = "团组报批前三公费用表";
                             break;
                         case 3:
-                            msg = $"1.整理统计团组超支费用、三公报销资料给到各单位 \r\n 2. 请于{groupInfo.VisitEndDate.AddDays(12):yyyy年MM月dd日}内完成该项工作(团组归国后12个工作日内)";
+                            msg = $"1.整理统计团组超支费用、三公报销资料给到各单位 \r\n 2. 请于{AddWeekdays(groupInfo.VisitEndDate,12):yyyy年MM月dd日}内完成该项工作(团组归国后12个工作日内)";
                             break;
                         case 4:
                             break;

+ 49 - 32
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/TaskAllocationRepository.cs

@@ -106,9 +106,12 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 groupNameInfos.Insert(0, new ValueInfo() { Id = -1, Name = "未选择" });
 
                 //部门名称
-                var departmentNameInfos = _sqlSugar.Queryable<Sys_Users, Sys_Department>((u, d) => new JoinQueryInfos(JoinType.Left, u.DepId == d.Id))
+                var depName = _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 })
+                    .Select((u, d) => d.DepName)
+                    .First();
+                var departmentNameInfos = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.IsDel == 0 && x.STid == 135 && x.Name.Equals(depName))
+                    .Select(x => new ValueInfo() { Id = x.Id, Name = x.Name })
                     .First();
 
                 //执行任务人员信息 1 公司总经理/副总 可分配 所有人的任务 2 公司 部门经理/主管 可分配 部门下的人员的任务
@@ -136,7 +139,16 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                         taskOpertionAudit.IsStopPerm = true;
                     //}
 
-                    var userIds = taskAudits.Select(it => it.SubUserId).ToList();
+                    List<int> userIds = new List<int>();
+                    if (taskAudits.Where(x => x.PrimaryUserId == userId).Any())
+                    {
+                        userIds = taskAudits.Select(it => it.SubUserId).ToList();
+                    }
+                    else
+                    {
+                        userIds = taskAudits.Where(x => x.SubUserId == userId).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
@@ -166,7 +178,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
         }
 
         /// <summary>
-        /// 任务发布者验证
+        /// 任务发布者/分管UserId验证
         /// </summary>
         /// <returns></returns>
         public async Task<(bool isTaskPublisher, List<int> userIds)> ValidateTaskPublisher(int userId)
@@ -278,23 +290,23 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
             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 => "当前任务状态为“任务终止”结束状态,不可编辑!",
-                        _ => "当前任务状态不可编辑!"
-                    });
+            //// 定义结束状态集合
+            //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);
         }
@@ -375,10 +387,10 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 return (false, "只有任务归属者可设置“已知晓”状态!");
 
             // 检查当前状态是否设置已知晓
-            //if (taskerInfo.TaskStatus == TaskerEnum.HaveKnown)
-            //{
-            //    return (false, "当前状态已设置,无需重复操作!");
-            //}
+            if (taskerInfo.TaskStatus == TaskEnum.UnderWay)
+            {
+                return (false, "当前状态已设置,无需重复操作!");
+            }
 
             //if (taskInfo.Status == TaskEnum.UnFinished)
             //{
@@ -439,6 +451,12 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
 
                 #endregion
 
+                //任务参与这包含创建者本人 则状态为 进行中
+                if (dto.UserIds.Contains(dto.UserId) && _TaskAllocation.Status == TaskEnum.NotStarted)
+                {
+                    _TaskAllocation.Status = TaskEnum.UnderWay;
+                }
+
                 var createUserName = _sqlSugar.Queryable<Sys_Users>().Where(x => x.Id == dto.UserId).First()?.CnName ?? "-";
 
                 if (dto.Id == 0) //添加
@@ -487,8 +505,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 {
                     _sqlSugar.BeginTran();
 
-                   
-                    #region 编辑验证 1. 仅创建者可以修改 
+                    #region 编辑验证 1. 仅创建者可以修改 2.分管人员领导可修改
 
                     var taskInfo = await _sqlSugar
                         .Queryable<Pm_TaskAllocation>()
@@ -712,7 +729,6 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
             _result.Code = 0;
             _sqlSugar.CommitTran();
 
-
             return _result;
         }
 
@@ -854,6 +870,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
             _sqlSugar.BeginTran();
             var taskName = await _sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.IsDel == 0 && it.Id == id).Select(it => it.TaskName).FirstAsync();
             var operatorName = await _sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0 && it.Id == userId).Select(it => it.CnName).FirstAsync();
+            
             var update1 = await _sqlSugar.Updateable<Pm_TaskRelevanceUser>()
                 .SetColumns(it => it.TaskStatus == TaskEnum.UnderWay)
                 .Where(it => it.TAId == id && it.UserId == userId)
@@ -935,10 +952,10 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 int mainTaskId = subTaskInfo.TAId;
                 int taskerId = subTaskInfo.Id;
 
-                //只有创建人可以审批完成状态
-                if (subTaskInfo.CreateUserId != userId)
+                //只有分管人员可以审批完成状态
+                if (!_sqlSugar.Queryable<Pm_TaskJobRelevancy>().Where(x => x.IsDel == 0 && x.PrimaryUserId == userId).Any() )
                 {
-                    _result.Msg = string.Format("只有任务创建者可审批'已完成'状态!");
+                    _result.Msg = string.Format("只有任务分管者可审批'已完成'状态!");
                     _taskTextFileLogger.LogInformation("任务完成设置[尝试审批],任务名称:{TaskName},操作者:{OperatorName}", taskName, operatorName);
                     return _result;
                 }
@@ -1004,7 +1021,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                         .Select(x => x.CnName)
                         .ToList();
 
-                    string userLabel = string.Join("、",names);
+                    string userLabel = string.Join("、", names);
 
                     _result.Msg = string.Format($"{userLabel} 未点击已知晓,不可设置任务完成。");
                     _sqlSugar.RollbackTran();