Merge remote-tracking branch 'origin/Insight' into Insight

Insight
陈伟 2024-12-17 14:33:17 +08:00
commit 2924d15477
6 changed files with 420 additions and 43 deletions

View File

@ -52,7 +52,7 @@ namespace OpenAuth.App.ServiceApp
insTaskInfo.CreateUser = user == null ? "" : user.Id.ToString();
insTaskInfo.UpdateTime = DateTime.Now;
insTaskInfo.UpdateUser = user == null ? "" : user.Id.ToString();
insTaskInfo.State = 0;
insTaskInfo.State = 3;//未发布
insTaskInfo.IsCompleted = false;
insTaskInfo.CreateUserName = user == null ? "" : user.Name;
insTaskInfo.UpdateUserName = user == null ? "" : user.Name;
@ -128,29 +128,11 @@ namespace OpenAuth.App.ServiceApp
// 提交事务
if (db.Commit())
{
var content = new
return new Response<string>
{
queryid = insTaskInfo.Id,
message = "有新创建的任务"
Result = "添加成功",
Message = "添加成功"
};
var contents = Json.ToJson(content);
try
{
await _immsgApp.SendMsgAll("InsTask", contents, insTaskInfo.Id);
return new Response<string>
{
Result = "添加成功",
Message = "添加成功"
};
}
catch
{
return new Response<string>
{
Result = "添加成功",
Message = "数据存储成功,推送失败"
};
}
}
else
{
@ -163,7 +145,7 @@ namespace OpenAuth.App.ServiceApp
/// 任务列表
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<InsTaskForAdminResp>>>> GteTaskListForAdmin(string taskName, int page, int limit)
public async Task<Response<PageInfo<List<InsTaskForAdminResp>>>> GteTaskListForAdmin(string taskName, int state, DateTime beginTime, DateTime endTime, int page, int limit)
{
using (var db = base.UnitWork.CreateContext())
{
@ -171,6 +153,9 @@ namespace OpenAuth.App.ServiceApp
var tsakList = await db.InsTask.AsQueryable()
.LeftJoin<InsAishp>((a, b) => a.ShpId == b.Id)
.WhereIF(!string.IsNullOrEmpty(taskName), (a, b) => a.TaskName.Contains(taskName))
.WhereIF(beginTime.Year != 0001, (a, b) => a.CreateTime >= beginTime && a.CreateTime <= endTime)
.WhereIF(state != 4, (a, b) => a.State == state)
.WhereIF(state == 4, (a, b) => a.IsCompleted == true)
.Select((a, b) => new InsTaskForAdminResp()
{
Id = a.Id.SelectAll(),
@ -282,7 +267,7 @@ namespace OpenAuth.App.ServiceApp
{
var insTaskInfo = await db.InsTask.GetFirstAsync(r => r.Id == req.Id);
//判断是否存在或者是否已被领取
if (insTaskInfo == null || insTaskInfo.State != 0)
if (insTaskInfo == null || insTaskInfo.State != 3)
throw new Exception("任务已被领取,无法修改");
var user = _auth.GetCurrentUser().User;
//删除任务分组表,任务前后时相表
@ -382,6 +367,65 @@ namespace OpenAuth.App.ServiceApp
}
}
/// <summary>
/// 手动发布任务
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<Response<string>> ReleaseTask(string id)
{
using (var db = base.UnitWork.CreateContext())
{
var insTaskInfo = await db.InsTask.GetFirstAsync(r => r.Id == id);
//判断是否存在或者是否已被领取
if (insTaskInfo == null || insTaskInfo.State != 3)
throw new Exception("任务已发布");
var user = _auth.GetCurrentUser().User;
// 插入任务和任务组以及前后时相
await db.InsTask.UpdateAsync(r => new InsTask
{
State = 0,
UpdateTime = DateTime.Now,
UpdateUser = user.Id.ToString(),
UpdateUserName = user.Name,
}, r => r.Id == id); ;
// 提交事务
if (db.Commit())
{
var content = new
{
queryid = insTaskInfo.Id,
message = "有新发布的任务"
};
var contents = Json.ToJson(content);
try
{
await _immsgApp.SendMsgAll("InsTask", contents, insTaskInfo.Id);
return new Response<string>
{
Result = "发布成功",
Message = "发布成功"
};
}
catch
{
return new Response<string>
{
Result = "发布成功",
Message = "数据存储成功,推送失败"
};
}
}
else
{
throw new Exception("发布失败");
}
}
}
/// <summary>
/// 获取单个任务信息
/// </summary>
/// <param name="id"></param>
@ -437,13 +481,15 @@ namespace OpenAuth.App.ServiceApp
/// 选择AI解译成果
/// </summary>
/// <returns></returns>
public async Task<Response<List<AiShpForTaskResp>>> GteAiShp()
public async Task<Response<List<AiShpForTaskResp>>> GteAiShp(string name, DateTime beginTime, DateTime endTime)
{
using (var db = base.UnitWork.CreateContext())
{
var aiShp = await db.InsAishp.AsQueryable()
.LeftJoin<InsTask>((r, b) => r.Id == b.ShpId)
.Where((r, b) => b.ShpId == null)
.WhereIF(!string.IsNullOrEmpty(name), (r, b) => r.ShpName.Contains(name))
.WhereIF(beginTime.Year != 0001, (r, b) => r.CreateTime >= beginTime && r.CreateTime <= endTime)
.Select(r => new AiShpForTaskResp()
{
Id = r.Id,
@ -462,11 +508,14 @@ namespace OpenAuth.App.ServiceApp
/// 选择前后时相
/// </summary>
/// <returns></returns>
public async Task<Response<List<AreaGroup>>> GteTif()
public async Task<Response<List<AreaGroup>>> GteTif(string name, DateTime beginTime, DateTime endTime)
{
using (var db = base.UnitWork.CreateContext())
{
var tif = await db.InsTif.AsQueryable().ToListAsync();
var tif = await db.InsTif.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(name), (r) => r.TifName.Contains(name))
.WhereIF(beginTime.Year != 0001, (r) => r.CreateTime >= beginTime && r.CreateTime <= endTime)
.ToListAsync();
// 构建树形结构
var areaGroups = tif
.GroupBy(x => x.AreaName) // 按 AreaName 分组
@ -495,5 +544,29 @@ namespace OpenAuth.App.ServiceApp
}
}
/// <summary>
/// 选择前后时相
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<InsTif>>>> GteTifByTime(string name, DateTime beginTime, DateTime endTime, int page, int limit)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> totalCount = 0;
var tif = await db.InsTif.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(name), (r) => r.TifName.Contains(name))
.WhereIF(beginTime.Year != 0001, (r) => r.CreateTime >= beginTime && r.CreateTime <= endTime)
.ToPageListAsync(page, limit, totalCount);
return new Response<PageInfo<List<InsTif>>>
{
Result = new PageInfo<List<InsTif>>
{
Items = tif,
Total = totalCount
}
};
}
}
}
}

View File

@ -1,4 +1,6 @@
using Infrastructure;
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Wordprocessing;
using Infrastructure;
using Microsoft.Extensions.Configuration;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
@ -11,6 +13,7 @@ using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -380,7 +383,252 @@ namespace OpenAuth.App.ServiceApp
return new Response<List<UserOrGroupTaskResp>>(); // 默认返回空列表
}
/// <summary>
/// 查看各组及人员任务信息
/// </summary>
/// <param name="beginTime"></param>
/// <param name="endTime"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<UserOrGroupTaskResp>>>> GetGroupOrUserTaskStatisticsByTime(DateTime beginTime, DateTime endTime, int page = 1, int limit = 10)
{
var user = _auth.GetCurrentUser().User;
var role = _auth.GetCurrentUser().Roles;
int skipCount = (page - 1) * limit;
using (var db = base.UnitWork.CreateContext())
{
// 管理员角色
if (role.Any(r => r.Name.Contains("管理员")) || user.Id == -1)
{
// 获取所有小组信息
var groupInfo = await db.SysGroup.AsQueryable().ToListAsync();
// 获取任务和图斑信息
var taskInfo = await db.InsTaskgroup.AsQueryable()
.LeftJoin<SysGroupuser>((a, b) => a.ReciveUserId == b.UserId)
.LeftJoin<SysGroup>((a, b, c) => b.GroupId == c.Id)
.WhereIF(beginTime.Year != 0001, a => a.CreateTime >= beginTime && a.CreateTime <= endTime)
.Where((a, b) => !string.IsNullOrEmpty(a.ReciveUserId))
.Select((a, b, c) => new
{
a.Id,
a.ReciveUserId,
c.Name,
a.IsComplate,
a.EndNum,
a.BeginNum,
groupId = c.Id,
})
.ToListAsync();
// 组织任务信息
var groupTaskStats = groupInfo.Select(group =>
{
var groupTaskInfo = taskInfo.Where(t => t.Name == group.Name).ToList();
var taskCount = groupTaskInfo.Count;
var taskComplateCount = groupTaskInfo.Count(t => t.IsComplate);
var taskNoComplateCount = taskCount - taskComplateCount;
var tuBanCount = groupTaskInfo.Sum(t => t.EndNum - t.BeginNum + 1);
var tuBanComplateCount = groupTaskInfo.Where(t => t.IsComplate).Sum(t => t.EndNum - t.BeginNum + 1);
var tuBanNoComplateCount = tuBanCount - tuBanComplateCount;
//人员任务数据
var userList = db.SysGroupuser.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.UserId == b.Id.ToString())
.Where((a, b) => a.GroupId == group.Id)
.Select((a, b) => new
{
a.UserId,
b.Name,
a.GroupId
}).ToList();
var userTaskCount = userList.Select(user =>
{
var userTaskInfo = taskInfo.Where(t => t.ReciveUserId == user.UserId).ToList();
var userTaskCount = userTaskInfo.Count;
var userComplateCount = userTaskInfo.Count(t => t.IsComplate);
var userNoComplateCount = userTaskCount - userComplateCount;
var userTuBanCount = userTaskInfo.Sum(t => t.EndNum - t.BeginNum + 1);
var userTuBanComplateCount = userTaskInfo.Where(t => t.IsComplate).Sum(t => t.EndNum - t.BeginNum + 1);
var userTuBanNoComplateCount = userTuBanCount - userTuBanComplateCount;
//任务列表
var userTaskList = db.InsTaskgroup.AsQueryable()
.LeftJoin<InsTask>((a, b) => a.TaskId == b.Id)
.Where((a, b) => a.ReciveUserId == user.UserId)
.WhereIF(beginTime.Year != 0001, (a, b) => b.CreateTime >= beginTime && b.CreateTime <= endTime)
.Select<dynamic>((a, b) => new
{
Id = a.Id.SelectAll(),
TaskName = b.TaskName,
})
.ToList();
return new UserOrGroupTaskResp
{
UserName = user.Name,
TaskCount = userTaskCount,
TaskComplateCount = userComplateCount,
TaskNoComplateCount = userNoComplateCount,
TuBanCount = userTuBanCount,
TuBanComplateCount = userTuBanComplateCount,
TuBanNoComplateCount = userTuBanNoComplateCount,
UserInsTaskList = userTaskList
};
}).ToList();
return new UserOrGroupTaskResp
{
UserName = group.Name,
TaskCount = taskCount,
TaskComplateCount = taskComplateCount,
TaskNoComplateCount = taskNoComplateCount,
TuBanCount = tuBanCount,
TuBanComplateCount = tuBanComplateCount,
TuBanNoComplateCount = tuBanNoComplateCount,
UserOrGroupTask = userTaskCount
};
}).ToList();
return new Response<PageInfo<List<UserOrGroupTaskResp>>>
{
Result = new PageInfo<List<UserOrGroupTaskResp>>
{
Items = groupTaskStats.OrderByDescending(r => r.TaskCount).Skip(skipCount).Take(limit).ToList(),
Total = groupTaskStats.Count,
}
};
}
else
{
// 获取所有小组信息
var groupInfo = await db.SysGroup.AsQueryable().Where(r => r.GroupLeaderId == user.Id.ToString()).ToListAsync();
// 获取任务和图斑信息
var taskInfo = await db.InsTaskgroup.AsQueryable()
.LeftJoin<SysGroupuser>((a, b) => a.ReciveUserId == b.UserId)
.LeftJoin<SysGroup>((a, b, c) => b.GroupId == c.Id)
.WhereIF(beginTime.Year != 0001, a => a.CreateTime >= beginTime && a.CreateTime <= endTime)
.Where((a, b) => !string.IsNullOrEmpty(a.ReciveUserId))
.Select((a, b, c) => new
{
a.Id,
a.ReciveUserId,
c.Name,
a.IsComplate,
a.EndNum,
a.BeginNum,
groupId = c.Id,
})
.ToListAsync();
// 组织任务信息
var groupTaskStats = groupInfo.Select(group =>
{
var groupTaskInfo = taskInfo.Where(t => t.Name == group.Name).ToList();
var taskCount = groupTaskInfo.Count;
var taskComplateCount = groupTaskInfo.Count(t => t.IsComplate);
var taskNoComplateCount = taskCount - taskComplateCount;
var tuBanCount = groupTaskInfo.Sum(t => t.EndNum - t.BeginNum + 1);
var tuBanComplateCount = groupTaskInfo.Where(t => t.IsComplate).Sum(t => t.EndNum - t.BeginNum + 1);
var tuBanNoComplateCount = tuBanCount - tuBanComplateCount;
//人员任务数据
var userList = db.SysGroupuser.AsQueryable()
.LeftJoin<SysUser>((a, b) => a.UserId == b.Id.ToString())
.Where((a, b) => a.GroupId == group.Id)
.Select((a, b) => new
{
a.UserId,
b.Name,
a.GroupId
}).ToList();
var userTaskCount = userList.Select(user =>
{
var userTaskInfo = taskInfo.Where(t => t.ReciveUserId == user.UserId).ToList();
var userTaskCount = userTaskInfo.Count;
var userComplateCount = userTaskInfo.Count(t => t.IsComplate);
var userNoComplateCount = userTaskCount - userComplateCount;
var userTuBanCount = userTaskInfo.Sum(t => t.EndNum - t.BeginNum + 1);
var userTuBanComplateCount = userTaskInfo.Where(t => t.IsComplate).Sum(t => t.EndNum - t.BeginNum + 1);
var userTuBanNoComplateCount = userTuBanCount - userTuBanComplateCount;
//任务列表
var userTaskList = db.InsTaskgroup.AsQueryable()
.LeftJoin<InsTask>((a, b) => a.TaskId == b.Id)
.Where((a, b) => a.ReciveUserId == user.UserId)
.Select<dynamic>((a, b) => new
{
Id = a.Id.SelectAll(),
TaskName = b.TaskName,
})
.ToList();
return new UserOrGroupTaskResp
{
UserName = user.Name,
TaskCount = userTaskCount,
TaskComplateCount = userComplateCount,
TaskNoComplateCount = userNoComplateCount,
TuBanCount = userTuBanCount,
TuBanComplateCount = userTuBanComplateCount,
TuBanNoComplateCount = userTuBanNoComplateCount,
UserInsTaskList = userTaskList
};
}).ToList();
return new UserOrGroupTaskResp
{
UserName = group.Name,
TaskCount = taskCount,
TaskComplateCount = taskComplateCount,
TaskNoComplateCount = taskNoComplateCount,
TuBanCount = tuBanCount,
TuBanComplateCount = tuBanComplateCount,
TuBanNoComplateCount = tuBanNoComplateCount,
UserOrGroupTask = userTaskCount
};
}).OrderByDescending(r => r.TaskCount).Skip(skipCount).Take(limit).ToList();
return new Response<PageInfo<List<UserOrGroupTaskResp>>>
{
Result = new PageInfo<List<UserOrGroupTaskResp>>
{
Items = groupTaskStats.OrderByDescending(r => r.TaskCount).Skip(skipCount).Take(limit).ToList(),
Total = groupTaskStats.Count,
}
};
}
}
}
/// <summary>
/// 任务列表
/// </summary>
/// <returns></returns>
public async Task<Response<PageInfo<List<InsTaskForAdminResp>>>> GteTaskListByTime(DateTime beginTime, DateTime endTime, string taskName, int page, int limit)
{
using (var db = base.UnitWork.CreateContext())
{
RefAsync<int> totalCount = 0;
var tsakList = await db.InsTaskgroup.AsQueryable()
.LeftJoin<InsTask>((a, b) => a.TaskId == b.Id)
.Where((a, b) => a.CreateTime >= beginTime && a.CreateTime <= endTime)
.WhereIF(!string.IsNullOrEmpty(taskName), (a, b) => b.TaskName.Contains(taskName))
.Select((a, b) => new InsTaskForAdminResp()
{
Id = a.Id.SelectAll(),
}).OrderByDescending((a) => a.CreateTime).ToPageListAsync(page, limit, totalCount);
return new Response<PageInfo<List<InsTaskForAdminResp>>>
{
Result = new PageInfo<List<InsTaskForAdminResp>>
{
Items = tsakList,
Total = totalCount
}
};
}
}
//public async Task<Response<List<AiShpDataExpenseAccountingTableResp>>> GetAiShpDataExpenseAccountingTableOld(DateTime beginTime, DateTime endTime)
//{
@ -678,7 +926,7 @@ namespace OpenAuth.App.ServiceApp
SetCellStyle(row21, headerStyle24);
// 合并单元格
sheet2.AddMergedRegion(new CellRangeAddress(0, 0, 0, 11)); // 合并标题行
sheet2.AddMergedRegion(new CellRangeAddress(1, 1, 9, 11));
sheet2.AddMergedRegion(new CellRangeAddress(1, 1, 9, 11));
int[] normalColumns2 = { 1, 2, 3, 4, 5, 6, 10 };
foreach (var index in normalColumns2) sheet2.SetColumnWidth(index, 11 * 256); // 设置列宽
sheet2.SetColumnWidth(0, 6 * 256);

View File

@ -33,7 +33,7 @@ namespace OpenAuth.App.ServiceApp.InsTaskHallManager
/// <returns></returns>
public async Task<List<dynamic>> GetTaskList()
{
var query = await client.Queryable<InsTask>().Where(r => r.State!=2)
var query = await client.Queryable<InsTask>().Where(r => r.State!=2&&r.State!=3)
.LeftJoin<InsAishp>((r, p) => r.ShpId == p.Id)
.OrderByDescending(r=>r.CreateTime)
.Select<dynamic>((r, p) => new

View File

@ -16,6 +16,7 @@ namespace OpenAuth.App.ServiceApp.Response
public int TaskNoComplateCount { get; set; }
public int TuBanComplateCount { get; set; }
public int TuBanNoComplateCount { get; set; }
public List<UserOrGroupTaskResp> UserOrGroupTask { get; set; }
public List<dynamic> UserInsTaskList { get; set; }
}
}

View File

@ -23,17 +23,20 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
/// <summary>
/// 管理员获取任务列表
/// </summary>
/// <param name="taskName"></param>
/// <param name="taskName">任务名称</param>
/// <param name="state">状态: 0未领取 1领取中 2已领完3 未发布, 4 已完成</param>
/// <param name="beginTime"></param>
/// <param name="endTime"></param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <returns></returns>
[HttpGet]
public async Task<Response<PageInfo<List<InsTaskForAdminResp>>>> GteTaskListForAdmin(string taskName, int page, int limit)
public async Task<Response<PageInfo<List<InsTaskForAdminResp>>>> GteTaskListForAdmin(string taskName,int state, DateTime beginTime, DateTime endTime, int page, int limit)
{
Response<PageInfo<List<InsTaskForAdminResp>>> response = new Response<PageInfo<List<InsTaskForAdminResp>>>();
try
{
return await _app.GteTaskListForAdmin(taskName, page, limit);
return await _app.GteTaskListForAdmin(taskName, state, beginTime, endTime, page, limit);
}
catch (Exception ex)
{
@ -102,6 +105,27 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
}
return response;
}
/// <summary>
/// 手动发布任务
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public async Task<Response<string>> ReleaseTask(string id)
{
Response<string> response = new Response<string>();
try
{
return await _app.ReleaseTask(id);
}
catch (Exception ex)
{
response.Code = 500;
response.Message = ex.InnerException?.Message ?? ex.Message;
}
return response;
}
/// <summary>
/// 获取单个任务信息
/// </summary>
@ -125,14 +149,17 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
/// <summary>
/// 选择AI解译成果
/// </summary>
/// <param name="name">名称</param>
/// <param name="beginTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
[HttpGet]
public async Task<Response<List<AiShpForTaskResp>>> GteAiShp()
public async Task<Response<List<AiShpForTaskResp>>> GteAiShp(string name, DateTime beginTime, DateTime endTime)
{
Response<List<AiShpForTaskResp>> response = new Response<List<AiShpForTaskResp>>();
try
{
return await _app.GteAiShp();
return await _app.GteAiShp(name, beginTime, endTime);
}
catch (Exception ex)
{
@ -144,14 +171,40 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
/// <summary>
/// 选择前后时相
/// </summary>
/// <param name="name">名称</param>
/// <param name="beginTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
[HttpGet]
public async Task<Response<List<AreaGroup>>> GteTif()
[NonAction]
public async Task<Response<List<AreaGroup>>> GteTifOld(string name, DateTime beginTime, DateTime endTime)
{
Response<List<AreaGroup>> response = new Response<List<AreaGroup>>();
try
{
return await _app.GteTif();
return await _app.GteTif(name, beginTime, endTime);
}
catch (Exception ex)
{
response.Code = 500;
response.Message = ex.InnerException?.Message ?? ex.Message;
}
return response;
}
/// <summary>
/// 选择前后时相
/// </summary>
/// <param name="name">名称</param>
/// <param name="beginTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
[HttpGet]
public async Task<Response<PageInfo<List<InsTif>>>> GteTifByTime(string name, DateTime beginTime, DateTime endTime, int page, int limit)
{
Response<PageInfo<List<InsTif>>> response = new Response<PageInfo<List<InsTif>>>();
try
{
return await _app.GteTifByTime(name, beginTime, endTime, page, limit);
}
catch (Exception ex)
{

View File

@ -43,16 +43,18 @@ namespace OpenAuth.WebApi.Controllers.ServiceControllers
/// <summary>
/// 根据时间统计小组和个人任务及图斑
/// </summary>
/// <param name="beginTime"></param>
/// <param name="endTime"></param>
/// <param name="beginTime">开始时间</param>
/// <param name="endTime">结束</param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <returns></returns>
[HttpGet]
public async Task<Response<List<UserOrGroupTaskResp>>> GetGroupOrUserTaskAndTuBanByTime(DateTime beginTime, DateTime endTime)
public async Task<Response<PageInfo<List<UserOrGroupTaskResp>>>> GetGroupOrUserTaskAndTuBanByTime(DateTime beginTime, DateTime endTime, int page = 1, int limit = 10)
{
Response<List<UserOrGroupTaskResp>> response = new Response<List<UserOrGroupTaskResp>>();
Response<PageInfo<List<UserOrGroupTaskResp>>> response = new Response<PageInfo<List<UserOrGroupTaskResp>>>();
try
{
return await _app.GetGroupOrUserTaskAndTuBanByTime(beginTime, endTime);
return await _app.GetGroupOrUserTaskStatisticsByTime(beginTime, endTime);
}
catch (Exception ex)
{