Преглед на файлове

重构任务管理和数据查询逻辑

在 `GroupsController.cs` 中,移除原有 SQL 查询,改为使用 LINQ 查询 `Grp_DelegationInfo`,并添加条件过滤和排序逻辑,简化数据处理流程。

在 `PersonnelModuleController.cs` 中,支持通过逗号分隔的字符串获取多个组名,并优化任务分配和消息通知逻辑。

在 `Config.cs` 和 `Library.cs` 中,新增任务创建推送功能,定义相关数据模型和发送消息的方法。

在 `TaskAllocationDto.cs` 和 `EnterExitCostView.cs` 中,新增 `GroupNames` 和 `IsAssignPerm` 属性,以支持新的业务需求。

在 `GroupOrderPreInfoRepository.cs` 和 `TaskAllocationRepository.cs` 中,优化数据插入和查询逻辑,确保正确序列化和存储数据。

在 `OrderPreInfoView.cs` 中,调整 JSON 处理逻辑,确保正确解析和返回数据。

在 `PersonnelModuleController.cs` 中,增加任务状态更新的消息通知逻辑,确保及时通知相关用户。
LEIYI преди 2 месеца
родител
ревизия
e9acda42a6

+ 63 - 64
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -9212,69 +9212,21 @@ FROM
             int diId = 0;
             var status = int.TryParse(dto.GroupName, out diId);
 
-            string sql = string.Format(@"SELECT
-  Id,
-  TeamName GroupName,
-  CASE WHEN EXISTS (
-    SELECT
-      1
-    FROM
-      Grp_EnterExitCost
-    WHERE
-      IsDel = 0
-      AND DiId = di.Id
-  ) THEN 1 ELSE 0 END AS [IsNull],
-  CASE WHEN EXISTS(
-    SELECT
-      TOP 1 *
-    FROM
-      Grp_EnterExitCost
-    WHERE
-      IsDel = 0
-      AND DiId = di.Id
-      AND CreateUserId = {0}
-    ORDER BY
-      CreateTime DESC
-  ) THEN 1 ELSE 0 END AS [IsEdit],
-  CASE WHEN EXISTS(
-    SELECT
-      TOP 1 *
-    FROM
-      Grp_EnterExitCost
-    WHERE
-      IsDel = 0
-      AND DiId = di.Id
-      AND CreateUserId = {0}
-    ORDER BY
-      CreateTime DESC
-  ) THEN 1 WHEN EXISTS(
-    SELECT
-      TOP 1 *
-    FROM
-      Grp_EnterExitCostPermission
-    WHERE
-      IsDel = 0
-      AND GroupId = di.Id
-      AND Permission = 1
-      AND UserId = {0}
-    ORDER BY
-      CreateTime DESC
-  ) THEN 1 ELSE 0 END AS [IsView]
-FROM
-  Grp_DelegationInfo di
-WHERE
-  di.Isdel = 0 
-  ORDER BY di.VisitStartDate DESC", dto.CurrUserId);
+            var basicUserId = await _enterExitCostRep.PermissionViewUsersAsync();
 
-            var data = await _sqlSugar.SqlQueryable<EnterExitCostMobileGroupView>(sql)
-                .Where(x => !string.IsNullOrEmpty(x.GroupName))
+            var data = await _sqlSugar.Queryable<Grp_DelegationInfo>()
+                .Where(x => x.IsDel == 0 && !string.IsNullOrEmpty(x.TeamName))
                 .WhereIF(!string.IsNullOrEmpty(dto.GroupName) && diId > 0, x => x.Id == diId)
-                .WhereIF(!string.IsNullOrEmpty(dto.GroupName) && !status, x => x.GroupName.Contains(dto.GroupName))
-                .OrderByDescending(x => x.Id)
+                .WhereIF(!string.IsNullOrEmpty(dto.GroupName) && !status, x => x.TeamName.Contains(dto.GroupName))
+                .OrderByDescending(x => x.VisitStartDate)
+                .Select(x => new EnterExitCostMobileGroupView() {
+                    Id = x.Id,
+                    GroupName = x.TeamName,
+                    IsNull = SqlFunc.Subqueryable<Grp_EnterExitCost>().Where(x1 => x1.DiId == x.Id && x1.IsDel == 0 ).Any(),
+                    IsView = SqlFunc.Subqueryable<Grp_EnterExitCostPermission>().Where(x1 => x1.GroupId == x.Id && x1.UserId == dto.CurrUserId).Any()
+                })
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total);
 
-            var basicUserId = await _enterExitCostRep.PermissionViewUsersAsync();
-
             if (basicUserId.Any(x => x.Id == dto.CurrUserId))
             {
                 foreach (var item in data)
@@ -9454,11 +9406,11 @@ WHERE
             if (eecInfo == null) return Ok(mobileInfo);
 
             //验证查看权限
-            //(bool isView, string msg) = await _enterExitCostRep.MobilePermissionsValidationAsync(dto.DiId, dto.CurrUserId);
-            //if (!isView) return Ok(JsonView(false, msg));
+            (bool isView, bool isSet) = await _enterExitCostRep.PermissionValidationAsync(dto.DiId, dto.CurrUserId);
+            if (!isView) return Ok(JsonView(false, "没有查看权限!"));
 
             mobileInfo = _mapper.Map<EnterExitCostMobileParentInfoView>(eecInfo);
-
+            mobileInfo.IsAssignPerm = isSet;
             var dayAndCostData = _sqlSugar.Queryable<Grp_DayAndCost>()
                 .LeftJoin<Grp_NationalTravelFee>((dac, ntf) => dac.NationalTravelFeeId == ntf.Id)
                 .LeftJoin<Sys_SetData>((dac, ntf, sd) => dac.Currency == sd.Id)
@@ -12306,7 +12258,6 @@ WHERE
             return Ok(await _enterExitCostQuoteRep.ItemDelAsync(dto));
         }
 
-
         /// <summary>
         /// 团组模块 - 出入境费用报价表 - 导出
         /// </summary>
@@ -12394,6 +12345,55 @@ WHERE
             }
             #endregion
 
+            #region 餐饮费 
+            designer.SetDataSource("MealTitle", mealCosts.ItemName);
+            if (mealCosts.Infos.Any())
+            {
+                string currencyName = string.Empty;
+                decimal rate = 1.0000M;
+                string label = "全程酒店含早,\r\n若因航班过早,\r\n酒店准备路早。\r\n\r\n";
+                foreach (var item in mealCosts.Infos)
+                {
+                    string name = string.Empty;
+                    if (item.FeeName.Contains("-"))
+                    {
+                        var feeName = item.FeeName.Split('-');
+                        name = $"\r\n{feeName[0]}:\r\n{feeName[1]}:";
+                    }
+                    else name = $"\r\n{item.FeeName}:";
+
+                    var rateInfo = rates.FirstOrDefault(x => item.Currency.Equals(x.CurrencyCode));
+                    currencyName = rateInfo?.CurrencyName ?? "UnKnow";
+                    rate = rateInfo?.Rate ?? 1.0000M;
+
+                    label += $"{name}{item.UnitPrice.TruncDecimals(2)}{currencyName}/天*{item.Quantity.ToString("#0")}*{item.PplNum}人\r\n";
+                }
+                label += $"\r\n以上小计:{accomCosts.TotalAmt.TruncDecimals(2)}元\r\n({currencyName}汇率:{rate.TruncDecimals(4)})";
+                designer.SetDataSource("MealLabel", label);
+            }
+            #endregion
+
+            #region 车辆安排 
+            designer.SetDataSource("VehArrangeTitle", vehArranges.ItemName);
+            if (vehArranges.Infos.Any())
+            {
+                string currencyName = string.Empty;
+                decimal rate = 1.0000M;
+                string label = $"";
+                foreach (var item in vehArranges.Infos)
+                {
+                    label += $"{item.Remark}\r\n\r\n{item.FeeName}\r\n\r\n费用:{item.TotalAmt.TruncDecimals(2)}元";
+                }
+
+                designer.SetDataSource("VehArrangeLabel", label);
+            }
+            #endregion
+
+            #region 邀请函发放对象
+            designer.SetDataSource("InviteToTitle", inviteTo.ItemName);
+            #endregion
+
+
             designer.Process();
 
             //文件名
@@ -12403,7 +12403,6 @@ WHERE
             return Ok(JsonView(true, "成功", url));
         }
 
-
         #endregion
 
         #region 签证费用录入

+ 51 - 19
OASystem/OASystem.Api/Controllers/PersonnelModuleController.cs

@@ -1,10 +1,12 @@
 using Aspose.Cells;
 using FluentValidation;
 using Microsoft.AspNetCore.SignalR;
+using NPOI.OpenXmlFormats.Dml.Chart;
 using OASystem.API.OAMethodLib;
 using OASystem.API.OAMethodLib.Hub.HubClients;
 using OASystem.API.OAMethodLib.Hub.Hubs;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
+using OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice;
 using OASystem.API.OAMethodLib.Quartz.Business;
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Dtos.PersonnelModule;
@@ -19,6 +21,7 @@ using System.Data;
 using System.Diagnostics;
 using System.Globalization;
 using static OASystem.API.OAMethodLib.JWTHelper;
+using static OpenAI.GPT3.ObjectModels.SharedModels.IOpenAiModels;
 
 namespace OASystem.API.Controllers
 {
@@ -1034,6 +1037,8 @@ namespace OASystem.API.Controllers
 
             #endregion
 
+            var groupArr = dto.GroupNames.Split(',').Select(part => part.Trim()).ToArray();
+
             string whereSql = "" ,currUserName = "";
             #region 分页参数处理
 
@@ -1079,6 +1084,7 @@ From
     Select
       ta.Id,
       ta.TaskName,
+      ta.TaskContent,
       ta.TaskPriority,
       d.DepName,
       di.TeamName,
@@ -1137,7 +1143,9 @@ WHERE
   OR [Participant] like '%{2}%' ", whereSql, currUserName, currUserName);
 
             RefAsync<int> total = 0;
-            var _view = await _taskAllocationRep._sqlSugar.SqlQueryable<TaskListView>(pageSql).ToPageListAsync(dto.PageIndex, dto.PageSize, total);//ToPageAsync
+            var _view = await _sqlSugar.SqlQueryable<TaskListView>(pageSql)
+                .WhereIF(groupArr.Any(), x => groupArr.Contains(x.TeamName))
+                .ToPageListAsync(dto.PageIndex, dto.PageSize, total);//ToPageAsync
 
             List<int> taskIds = new List<int>();
             taskIds = _view.Select(it => it.Id).ToList();
@@ -1148,7 +1156,7 @@ WHERE
                                                   Left Join Sys_Users u On tau.UserId = u.Id
                                                   Where tau.IsDel = 0");
 
-            var taskerData = _taskAllocationRep._sqlSugar.SqlQueryable<TaskerDetailsView>(taskerSql).Where(it => taskIds.Contains(it.TAId)).ToList();
+            var taskerData = _sqlSugar.SqlQueryable<TaskerDetailsView>(taskerSql).Where(it => taskIds.Contains(it.TAId)).ToList();
             foreach (var item in _view)
             {
                 //任务接收者显示自己任务状态
@@ -1162,8 +1170,6 @@ WHERE
                     item.TaskerDetails = taskerData.Where(it => it.TAId == item.Id).ToList();
                 }
 
-
-
                 ////处理任务总状态 And 任务人状态
                 //var taskerStatusData = taskerData.Where(it => it.TAId == item.Id && it.TaskCreateUserId != dto.UserId && it.UserId == dto.UserId).FirstOrDefault();
                 //if (taskerStatusData != null)
@@ -1251,6 +1257,10 @@ WHERE
                     string content = $"[{dto.TaskName}] 任务新建成功,请前往任务页面查看详情!";
 
                     await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, dto.UserIds);
+
+                    var userIds = dto.UserIds.Select(x => x.ToString()).ToList();
+
+                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(userIds, dto.DiId, title, dto.UserId);
                 }
 
                 return Ok(JsonView(true, "操作成功!"));
@@ -1304,16 +1314,19 @@ WHERE
                     string title_createUser = $"[{taskData.TaskName}] 进度更新!";
                     string conten_createUser = $"[{UserName}] 已开始任务,请注意该工作人员任务进度!";
 
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title_createUser, conten_createUser, new List<int>() { taskData.CreateUserId }); //创建人发送消息
+                    //创建人发送消息
+                    List<int> createUserIds = new List<int>() { 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); //其他人发送消息
-
-
-                    string content1 = $"任务已开始,请在规定时间完成!若需查看,请前往任务页面查看详情!";
-                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content1, new List<int>() { dto.UserId }); //设置任务人 发送消息
+                    await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, taskUserIds); 
+                    
+                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(taskUserIds.Select(x => x.ToString()).ToList(), taskData.DiId, content, dto.UserId);
 
                 }
 
@@ -1336,31 +1349,33 @@ WHERE
             if (_view.Code == 0)
             {
                 //发送消息
-                var taskData = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskAllocation>().Where(it => it.Id == dto.Id).First();
+                var taskData = _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();
+                    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, "操作成功!"));
@@ -1394,11 +1409,17 @@ WHERE
 
                         string title = $"[{taskData.TaskName}] 进度更新!";
                         string conten_createUser = $"[{UserName}] 已知晓任务.若需查看,请前往任务页面查看详情!";
+                        string qw_conten_createUser = $"[{UserName}] 已知晓任务!";
 
                         await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, conten_createUser, new List<int>() { taskData.CreateUserId }); //创建人发送消息
 
+                        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 }); //设置任务人 发送消息
+                                                                                                                                                                                   await AppNoticeLibrary.SendUserMsg_Task_ToUser(new List<string>() { taskUserData.UserId.ToString() }, taskData.DiId, yw_content, taskUserData.UserId);
 
                     }
                 }
@@ -1431,8 +1452,11 @@ WHERE
                     {
                         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);
+
                     }
                 }
 
@@ -1464,7 +1488,9 @@ WHERE
                     {
                         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);
 
                     }
                 }
@@ -1592,8 +1618,12 @@ WHERE
                     {
                         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);
+
                     }
                 }
 
@@ -1637,11 +1667,13 @@ WHERE
                     var taskUserIds = _taskAllocationRep._sqlSugar.Queryable<Pm_TaskRelevanceUser>().Where(it => it.Id == dto.Id).Select(it => it.UserId).ToList();
                     taskUserIds.Add(taskData.CreateUserId);
 
-
                     string title = $"[{taskData.TaskName}] 进度更新!";
                     string content = $"任务已终止!若需查看,请前往任务页面查看详情!";
+                    string yw_content = $"任务已终止!";
                     await GeneralMethod.MessageIssueAndNotification(MessageTypeEnum.TaskProgressUpdate, title, content, taskUserIds); //设置任务人 发送消息
 
+                    await AppNoticeLibrary.SendUserMsg_Task_ToUser(taskUserIds.Select(x => x.ToString()).ToList(), taskData.DiId, yw_content, taskData.CreateUserId);
+
                 }
 
                 return Ok(JsonView(true, "操作成功!"));

+ 33 - 0
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/AppNotice/Config.cs

@@ -547,11 +547,44 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
             return result;
         }
+
+        /// <summary>
+        /// 任务创建推送给归属人
+        /// </summary>
+        /// <returns></returns>
+        public static string TaskAssignment_Create_ToUser(TaskAssignment_Create_ToUserModel dto)
+        {
+            string result = string.Format(@" `任务分配通知` 
+
+>团组:<font color='info'>{0}</font>  
+
+<font color='info'>{1}</font>
+
+>操作人员:{2}
+>操作时间:<font color='comment'>{3}</font> 
+
+[详细信息请前往OA系统查看](http://oa.pan-american-intl.com:4399/) 
+
+ ", dto.GroupName, dto.Title, dto.CreateUser, dto.RefreshDate);
+
+            return result;
+        }
+
     }
 
 
     #region 实体类
 
+    public class TaskAssignment_Create_ToUserModel
+    {
+        public string GroupName { get; set; }
+
+        public string Title { get; set; }
+        public string RefreshDate { get; set; }
+
+        public string CreateUser { get; set; }
+    }
+
     public class GroupShare_ToGMModel : GroupShare_ToUserModel
     {
         public string CreateUser { get; set; }

+ 38 - 3
OASystem/OASystem.Api/OAMethodLib/QiYeWeChatAPI/AppNotice/Library.cs

@@ -880,7 +880,6 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
         #endregion
 
-
         #region 费用保存发送消息
         #region 三公费用更改通知
 
@@ -1043,8 +1042,6 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
         #endregion
 
-
-
         #region 成本通知
 
         /// <summary>
@@ -1147,6 +1144,44 @@ namespace OASystem.API.OAMethodLib.QiYeWeChatAPI.AppNotice
 
         #endregion
 
+        #region 任务通知
+
+        /// <summary>
+        /// 任务通知
+        /// </summary>
+        /// <param name="userIds"></param>
+        /// <param name="groupId"></param>
+        /// <param name="title"></param>
+        /// <param name="currUserId"></param>
+        /// <returns></returns>
+        public static async Task<bool> SendUserMsg_Task_ToUser(List<string> userIds, int groupId, string title, int currUserId)
+        {
+            List<string> qwUserIdList = GetQiyeChatUserIdList(userIds);
+
+            if (qwUserIdList.Any())
+            {
+                var groupName = _grpDeleRep.Query<Grp_DelegationInfo>(s => s.IsDel == 0 && s.Id == groupId).First()?.TeamName ?? "未选择";
+                var userName = _grpDeleRep.Query<Sys_Users>(s => s.IsDel == 0 && s.Id == currUserId).First()?.CnName ?? "Unknown";
+                var model = new TaskAssignment_Create_ToUserModel()
+                {
+                    GroupName = groupName,
+                    Title = title,
+                    CreateUser = userName,
+                    RefreshDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm")
+                };
+
+                ResponseBase result = await _qiYeWeChatApiService.GroupStatus_SendMessage_ToUser_Markdown(qwUserIdList, MarkdownLib.TaskAssignment_Create_ToUser(model));
+                if (result.errcode != 0)
+                {
+                    //抄送日志 
+                    return false;
+                }
+            }
+
+            return true;
+        }
+        #endregion
+
         #region Helper
 
         private static string getClientNameStr(List<SimplClientInfo> list, string origin)

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

@@ -45,6 +45,8 @@ namespace OASystem.Domain.Dtos.PersonnelModule
         /// 任务名称
         /// </summary>
         public string? TaskName { get; set; }
+
+        public string GroupNames { get; set; }
     }
 
     /// <summary>

+ 4 - 1
OASystem/OASystem.Domain/ViewModels/Groups/EnterExitCostView.cs

@@ -506,7 +506,7 @@ namespace OASystem.Domain.ViewModels.Groups
         public int Id { get; set; }
         public string GroupName { get; set; }
         public bool IsNull { get; set; }
-        public bool IsEdit { get; set; }
+        //public bool IsEdit { get; set; }
         public bool IsView { get; set; }
     }
 
@@ -904,6 +904,9 @@ namespace OASystem.Domain.ViewModels.Groups
 
         public int DiId { get; set; }
 
+        public bool IsAssignPerm { get; set; }
+
+
         #region 汇率币种
 
         /// <summary>

+ 24 - 9
OASystem/OASystem.Domain/ViewModels/Groups/OrderPreInfoView.cs

@@ -1,7 +1,9 @@
-using Newtonsoft.Json;
+using NetTaste;
+using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using OASystem.Domain.Entities.Groups;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -54,19 +56,32 @@ namespace OASystem.Domain.ViewModels.Groups
                 else if (FieldTypeName.Equals("搜索框"))
                 {
 
-                    var val = Array.Empty<string>();
-
-                    string regexPattern = @"^\s*\{[\s\S]*\}\s*$";
-                    bool isValid = Regex.IsMatch(OriginVal, regexPattern);
 
-                    try
+                    if (_newValue != null)
                     {
-                        if (isValid)
+
+                        if (_newValue is Array)
+                        {
+                            return (Array)_newValue;
+                        }
+                        else if (_newValue is string[])
+                        {
+                            return (string[])_newValue;
+                        }
+                        else if (_newValue is IEnumerable)
                         {
-                            val = JsonConvert.DeserializeObject<string[]>(OriginVal);
+                            return ((IEnumerable)_newValue).Cast<object>().Select(x => x.ToString()).ToArray();
                         }
+                        else
+                        {
+                            return _newValue;
+                        }
+                    }
 
-                        return val;
+                    var val = Array.Empty<string>();
+                    try
+                    {
+                        return JsonConvert.DeserializeObject<string[]>(OriginVal);
 
                     }
                     catch (Exception)

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

@@ -129,6 +129,8 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
         /// </summary>
         public string? TaskName { get; set; }
 
+        public string TaskContent { get; set; }
+
         /// <summary>
         /// 任务等级
         /// </summary>

+ 9 - 1
OASystem/OASystem.Infrastructure/Repositories/Groups/GroupOrderPreInfoRepository.cs

@@ -1,5 +1,6 @@
 using AutoMapper;
 using EyeSoft.Collections.Generic;
+using Newtonsoft.Json;
 using OASystem.Domain;
 using OASystem.Domain.Dtos.Groups;
 using OASystem.Domain.Entities.Groups;
@@ -176,12 +177,19 @@ namespace OASystem.Infrastructure.Repositories.Groups
             var items = new List<Grp_OrderPreItem>();
             foreach (var item in dto.Items)
             {
+                var val = "";
+                if (item.NewValue is Array obj)
+                {
+                    val =  JsonConvert.SerializeObject( (string[])item.NewValue);
+                }
+                else val = item.NewValue.ToString();
+
                 items.Add(new Grp_OrderPreItem()
                 {
                     Id = item.Id,
                     ParentId = item.ParentId,
                     FormTempId = item.FieldTempId,
-                    Value = item.NewValue == null ? string.Empty: item.NewValue.ToString() ,
+                    Value = val,
                     CreateUserId = currUserId,
                     Remark = item.Remark
                 });

+ 11 - 8
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/TaskAllocationRepository.cs

@@ -268,13 +268,13 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
 
                 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;
-                    }
+                    //// 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();
 
@@ -410,6 +410,9 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                     _result.Msg = string.Format("请传入有效的Id参数!");
                     return _result;
                 }
+
+
+
             }
             else
             {
@@ -564,7 +567,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 return _result;
             }
             
-            if (selectData.TaskStatus >= TaskerEnum.UnderWay)
+            if (selectData.TaskStatus >= TaskerEnum.WaitConfirm)
             {
                 _result.Msg = string.Format("该任务已提交待审核状态,不可重复提交!");
                 return _result;