using Confluent.Kafka; using Crm.Core.Common.Helpers; using Crm.Core.Entity; using Crm.Core.Entity.MsgTool; using Crm.Core.Entity.MsgTool.ResultView; using Crm.Core.Entity.PcWework; using Crm.Core.MsgTool.Domain.Dto; using Microsoft.Extensions.DependencyInjection; using MySqlConnector; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Diagnostics.Metrics; using System.Drawing; using System.Linq; using System.Net; using System.Numerics; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using static DG.Oracle.EntityFramework.Enums; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace Crm.Core.MsgTool.Domain { internal class MsgToolDomain : IMsgToolDomain { private readonly IConfiguration _configuration; private readonly IHttpClient _httpClient; private readonly ICacheDomain _cacheDomain; private readonly SystemConfig _systemConfig; private readonly IOracleRepository _crmRepository; private readonly IBaseRepository _weworkRepository; private readonly IBaseRepository _pcweworkRepository; private readonly IBaseRepository _hgRepository; private readonly IEventBus _eventBus; private readonly MsgToolTaskEventSingleton _msgToolTaskEvent; public MsgToolDomain( IConfiguration configuration, IHttpClient httpClient, ICacheDomain cacheDomain, IOracleRepository crmRepository, IBaseRepository weworkRepository, IBaseRepository pcweworkRepository, IEventBus eventBus, MsgToolTaskEventSingleton msgToolTaskEvent, IBaseRepository hgRepository) { _configuration = configuration; _httpClient = httpClient; _cacheDomain = cacheDomain; _crmRepository = crmRepository; _weworkRepository = weworkRepository; _pcweworkRepository = pcweworkRepository; _systemConfig = configuration.GetSection("SystemConfig").Get(); _eventBus = eventBus; _msgToolTaskEvent = msgToolTaskEvent; _hgRepository = hgRepository; } public async Task Test() { var userlist = await _crmRepository.GetRepository().Query().ToListAsync(); var cmd = await _crmRepository.GetRepository().Query().ToListAsync(); var cmddetail = await _crmRepository.GetRepository().Query().ToListAsync(); var plan = await _crmRepository.GetRepository().Query().ToListAsync(); var rece = await _crmRepository.GetRepository().Query().ToListAsync(); return true; } public async Task GetMsgToolTaskCmd(GetTaskCmdDto dto) { var cmd = await _crmRepository.GetRepository().Query().ToListAsync(); return cmd.FirstOrDefault(m => m.PKID == dto.TaskId); } public async Task ChangeTaskStatus(ChangeTaskStatusDto dto) { var db_task = await _crmRepository.GetRepository().Query().ToListAsync(); var db_taskcmd = await _crmRepository.GetRepository().Query().ToListAsync(); var task = db_task.FirstOrDefault(m => m.PKID == dto.TaskId); var taskcmd = db_taskcmd.Where(m => m.TASKID == dto.TaskId); if (task != null) { if (task.SENDTYPE?.ToLower() == "now") { if (dto.Status == MsgToolTaskExeStatus.已完成 && taskcmd.Any(m => m.STATUS != MsgToolTaskCmdStatus.已执行)) { dto.Status = task.EXESTATUS;//保持状态不变 } else { task.EXESTATUS = dto.Status; } } else {//循环类型的不立即修改状态 if (dto.Status == MsgToolTaskExeStatus.已完成) { dto.Status = task.EXESTATUS;//保持状态不变 } else { task.EXESTATUS = dto.Status; } } await _crmRepository.GetRepository().UpdateAsync(task); } } public async Task GetOSSAccess() { var help = new AliHelper("LTAI5tERfeaQymj1CD7eycnw", "WScg5brbLlKWJvfRofCGnjso6Wi0Rx", "2015-04-01"); Dictionary ditParam = new Dictionary(); ditParam.Add("Action", "AssumeRole"); ditParam.Add("DurationSeconds", 3600); ditParam.Add("RoleArn", "acs:ram::1497042271361001:role/oss-cms"); ditParam.Add("RoleSessionName", "test"); var res = help.HttpGetUrl("https://sts.aliyuncs.com/", ditParam); Credentials credentials = new Credentials(); if (res.IndexOf("Credentials") > -1) { credentials = JsonHelper.FromJson(res.Substring(res.IndexOf("Credentials") + 13).Replace("}}", "}")); } return credentials; } public async Task CreateTask(MsgToolTaskCreateDto model) { CheckDateTime(model); var Pkid = await GetMasterId(); MsgToolTask task = new MsgToolTask { PKID = Pkid, PLANNAME = model.PLANNAME, //GROUPID = model.GROUPID, RECEIVERID = model.Eid, CORPIDS = model.CORPIDS, GROUPID = model.GROUPID, GROUPMEMO = model.GROUPMEMO, GROUPNAME = model.GROUPNAME, JSONDATA = model.JSONDATA, SENDTYPE = model.SENDTYPE, PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME, PLANEXECYCLE = model.PLANEXECYCLE, DUEDATE = model.DUEDATE, CTIME = DateTime.Now, CREATOR = model.Eid, REMARK = model.REMARK, TASKTYPE = model.TaskType, STATUS = model.Type == 2 ? MsgToolTaskStatus.未分发 : MsgToolTaskStatus.草稿 }; using var transaction = await _crmRepository.BeginTransactionAsync(); try { bool hasKfDetail = false; if (task.TASKTYPE == 2 && !string.IsNullOrWhiteSpace(model.QiWeiPostJson)) { //先删除所有的任务关系 // var oldLabDetail = _crmRepository.GetRepository().Query().Where(m=>m.TASKID==task.PKID).ToList(); await _crmRepository.ExecuteSqlCommandAsync(CommandType.Text, "delete from MSGTOOL_TASK_LABDETAIL where TASKID=" + task.PKID); var qwJson = JsonHelper.FromJson>(model.QiWeiPostJson); foreach (var item in qwJson) { foreach (var outuser in item.outuserList) { MsgToolTaskLabDetail labDetail = new MsgToolTaskLabDetail { CORPID = item.corpid, KFUSERID = item.userid, EXTUSERID = outuser.userid, NICKNAME = outuser.name, KFNICKNAME = item.kfnickname, CORPNAME = item.corpname, PAGETYPE = item.pagetype, CTIME = DateTime.Now, TASKID = task.PKID, PKID = await GetMasterId() }; await _crmRepository.GetRepository().InsertAsync(labDetail); } hasKfDetail = true; } } if (task.TASKTYPE == 1 && !string.IsNullOrWhiteSpace(model.QiWeiPostJson)) { await _crmRepository.ExecuteSqlCommandAsync(CommandType.Text, "delete from MSGTOOL_TASK_KFDETAIL where TASKID=" + task.PKID); var qwJson = JsonHelper.FromJson>(model.QiWeiPostJson); foreach (var item in qwJson) { MsgToolTaskKFDetail labDetail = new MsgToolTaskKFDetail { CORPID = item.corpid, KFUSERID = item.userid, KFNICKNAME = item.kfnickname, CORPNAME = item.corpname, CTIME = DateTime.Now, TASKID = task.PKID, PKID = await GetMasterId() }; await _crmRepository.GetRepository().InsertAsync(labDetail); hasKfDetail = true; } } await _crmRepository.GetRepository().InsertAsync(task); await transaction.CommitAsync(); } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); Log.Error(ex, "任务创建失败!"); throw new Exception("任务创建失败!", ex); } return task; } private void CheckDateTime(MsgToolTaskCreateDto model) { model.PLANEXETIME = model.SENDTYPE == "now" ? DateTime.Now : model.PLANEXETIME; if (model.Type == 2 && model.SENDTYPE == "tim" && model.SENDTYPE != "daily" && !model.PLANEXETIME.HasValue) { throw new Exception("预计开始时间必填"); } switch (model.SENDTYPE) { case "now": model.DUEDATE = null; break; case "tim": case "daily": model.PLANEXECYCLE = null; break; } if (model.SENDTYPE != "now" && model.SENDTYPE != "tim") { if (model.Type == 2 && (!model.PLANEXEDATE.HasValue || string.IsNullOrWhiteSpace(model.PLANEXEHOUR))) { throw new Exception("预计开始日期和开始时间必填"); } if (model.PLANEXEDATE.HasValue && !string.IsNullOrWhiteSpace(model.PLANEXEHOUR)) { model.PLANEXETIME = Convert.ToDateTime(model.PLANEXEDATE.Value.ToString("yyyy-MM-dd ") + model.PLANEXEHOUR); } else { model.PLANEXETIME = null; } } if (model.PLANEXETIME.HasValue) { model.PLANEXEHOUR = model.PLANEXETIME.Value.ToString("HH:mm:ss"); } if (model.PLANEXETIME.HasValue && model.DUEDATE.HasValue && model.PLANEXETIME.Value > model.DUEDATE.Value) { throw new Exception("截止时间不能小于预计开始时间"); } if (model.SENDTYPE != "month" && model.SENDTYPE != "week") { model.PLANEXECYCLE = ""; } } public async Task> GetMsgToolTaskSendLog(MsgToolTaskSendLogDto dto) { IList res = new List(); var taskList= _crmRepository.GetRepository().Query(); var kfDetailList = _crmRepository.GetRepository().Query(); var labDetailList = _crmRepository.GetRepository().Query(); if (dto.eid.HasValue) { taskList = taskList.Where(m => m.CREATOR == dto.eid); } else { throw new Exception("缺少创建人Eid!"); } if (dto.stime.HasValue) { taskList = taskList.Where(m => m.CTIME <= dto.stime); } if (dto.etime.HasValue) { taskList = taskList.Where(m => m.CTIME >= dto.etime); } var data=await taskList.OrderByDescending(m=>m.CTIME).Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); foreach (var item in data) { MsgToolSendLog log=new MsgToolSendLog (); log.msgToolTask = item; log.msgToolTaskKFDetail = kfDetailList.Where(m => m.TASKID == item.PKID).ToList(); log.msgToolTaskLabDetail = labDetailList.Where(m => m.TASKID == item.PKID).ToList(); res.Add(log); } return res.ToList(); } public async Task GetMasterId() { OracleParameter[] p = { new OracleParameter("pkid", OracleDbType.Int64) }; p[0].Direction = ParameterDirection.ReturnValue; await _hgRepository.ExecuteSqlCommandAsync(CommandType.StoredProcedure, "PACK_BASE.Seq_master_get", p); return decimal.Parse(p[0].Value.ToString() ?? ""); } public async Task UpdateTaskStatus(PushTaskResDto dto) { Log.Information($"刷新任务上报实体{dto.ToJson()}"); var cmdQuery = _crmRepository.GetRepository().Query(); var cmd = await cmdQuery.FirstOrDefaultAsync(n => n.PKID == dto.TaskId); if (cmd == null) { throw new Exception("找不到对应指令任务"); } var cmdDetailList = await _crmRepository.GetRepository().Query().Where(n => n.CMDID == cmd.PKID).ToListAsync(); var task = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PKID == cmd.TASKID); if (task == null) { throw new Exception("找不到对应任务"); } cmd.STARTTIME = dto.StartTime; cmd.ENDTIME = dto.EndTime; cmd.SENDNUM = dto.SendNum; cmd.FAILNUM = dto.FailNum; cmd.SUCCEEDNUM = dto.SucceedNum; cmd.STATUS = (MsgToolTaskCmdStatus)dto.Status; var transaction = await _crmRepository.BeginTransactionAsync(); foreach (var item in dto.TaskDetalRes) { var de = cmdDetailList.FirstOrDefault(m => m.EXTUSERID == item.ExtuserId); if (de != null) { de.STATUS = (MsgToolTaskCmdDetailStatus)item.Status; de.EXETIME = item.Exetime; } } var otherCmdList = await cmdQuery.Where(n => n.TASKID == task.PKID && n.PKID != dto.TaskId).Include(n => n.MsgToolTaskCmdDetails).ToListAsync(); otherCmdList = otherCmdList.Where(n => n.MsgToolTaskCmdDetails.Where(n => n.UNENABLED != 1).Count() > 0).ToList(); //只有一条指令 if (otherCmdList.Count == 0 || otherCmdList.All(n => n.STATUS == MsgToolTaskCmdStatus.已执行)) { switch (dto.Status) { case (int)MsgToolTaskCmdStatus.已执行: task.STATUS = MsgToolTaskStatus.已完成; task.EXESTATUS = MsgToolTaskExeStatus.已完成; break; case (int)MsgToolTaskCmdStatus.执行错误: if (otherCmdList.Count == 0) { //只有一条执行且执行错误 为执行错误 task.STATUS = MsgToolTaskStatus.失败; task.EXESTATUS = MsgToolTaskExeStatus.执行错误; } else { task.EXESTATUS = MsgToolTaskExeStatus.进行中; } break; case (int)MsgToolTaskCmdStatus.暂停: case (int)MsgToolTaskCmdStatus.待执行: task.EXESTATUS = MsgToolTaskExeStatus.进行中; break; } } else { //多条指令 if (otherCmdList.Exists(n => n.STATUS == MsgToolTaskCmdStatus.待执行)) { task.EXESTATUS = MsgToolTaskExeStatus.进行中; } if (otherCmdList.All(n => n.STATUS == MsgToolTaskCmdStatus.执行错误) && dto.Status == (int)MsgToolTaskCmdStatus.执行错误) { //只有一条执行且执行错误 为执行错误 task.STATUS = MsgToolTaskStatus.失败; task.EXESTATUS = MsgToolTaskExeStatus.执行错误; } } try { await _crmRepository.GetRepository().UpdateAsync(cmd); await _crmRepository.GetRepository().BatchUpdateAsync(cmdDetailList); await _crmRepository.GetRepository().UpdateAsync(task); await transaction.CommitAsync(); } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw new ApiException($"执行创建命令任务报错{ex.Message}"); } } public async Task> GetMsgToolTaskCmdDetail(decimal? cmdId) { var cmd = await _crmRepository.GetRepository().Query().ToListAsync(); return cmd.Where(m => m.CMDID == cmdId && m.UNENABLED != 1).ToList(); } public async Task> GetMsgConfig() { List res = new List(); var param = await _crmRepository.GetRepository().Query().ToListAsync(); var config = param.FirstOrDefault(m => m.PARAKEY == "TaskTimeConfig"); if (config != null) { res = JsonHelper.FromJson>(config.PARAVALUE ?? "[{}]"); } return res; } /// /// 获取人群包列表 /// /// /// public async Task> GetUserGroupList(decimal? eid) { //return new List //{ // new UserGroupDto // { // Id = 16, // Name = "", // Description = "个人标签,基础,基础标签类型1,基础标签类型1,包括客户ID-大于等于-22,任意时间-2020-02-02~2023-02-01-关注企微客服-大于等于-1,", // CustomerCount = 0, // ShareWay = 0, // UserCount = 0 // } //}; var businessLineDeptId = await _cacheDomain.GetDeptmentIds(eid.Value); //var busineeMap = await _cacheDomain.GetEmployeeBusinessMap(); //var businessLineDeptId = busineeMap.Where(n => businessLines.Contains(n.id.Value)).Select(n => n.rootId.Value).ToList(); businessLineDeptId.Add(0); var orgIds = string.Join(",", businessLineDeptId.Distinct().ToList()); var url = $"{_systemConfig.GetUserGroupList()}?deptIds={orgIds}&cateKey=9&page=1&limit=100000"; var response = await _httpClient.GetAsync>>(url); if (response.Ret == 0) { return response.Data.TableData; } else { Log.Error($"获取分群列表接口报错:{response.Message}"); throw new ApiException($"获取分群列表接口报错:{response.Message}"); } } /// /// 获取人群包列表 /// /// /// public async Task GetUserGroup(decimal? id) { var url = $"{_systemConfig.GetUserGroupList()}?id={id}"; var response = await _httpClient.GetAsync>>(url); if (response.Ret == 0) { return response.Data.TableData.FirstOrDefault(); } else { Log.Error($"获取分群列表接口报错:{response.Message}"); throw new ApiException($"获取分群列表接口报错:{response.Message}"); } } public async Task CreateTaskCmd() { var minutes = await _cacheDomain.GetParameter(ParameterEnums.MSG_TOOL_ADVANCED_NOTIFICATION_TIME_MINUTES); var sendTypes = new List { "now", "tim" }; var time = DateTime.Now.AddMinutes(minutes); //await _crmRepository.GetRepository().Query() // .Where(x => sendTypes.Contains(x.SENDTYPE) && x.PLANEXETIME >= time) // .Select(x => new CreateTaskCmdEvent { TaskId = x.PKID }) // .ToListAsync(); } /// /// 获取人群包 /// /// /// /// /// /// public async Task> GetUserList(decimal groupid, string? appid, string? appuserid) { var data = new List(); // 测试使用 //data = CreateAppData(data); //return data; var url = $"{_systemConfig.GetUserQuery()}"; var param = new Dictionary(); var pageSize = 100; var currentPage = 1; param.Add("currentPage", currentPage); param.Add("pageSize", pageSize); param.Add("group_ids", groupid); param.Add("appid", appid); param.Add("userid", appuserid); param.Add("fields", "_appid,_appuserid,_nickname"); var result = await _httpClient.GetAsync>>(url, param); if (result.Code != 0) { throw new ApiException("计划不存在或已删除!"); } data.AddRange(result.Data.TableData); if (result.Data.Total <= pageSize) { return data; } var maxIndex = (result.Data.Total / pageSize) + 1; //从第二页开始 for (var page = 2; page <= maxIndex; page++) { param["currentPage"] = page; result = await _httpClient.GetAsync>>(url, param); if (result.Code == 0) { data.AddRange(result.Data.TableData); } } return data; } public async Task CreateTasksByPlan(CreateTasksByPlanDto dto) { var planId = dto.PlanId; var appid = _cacheDomain.GetApp(); var plan = await _crmRepository.GetRepository() .QueryIncluding(x => x.MsgToolPlanReceives) .FirstOrDefaultAsync(x => x.PKID == planId); if (plan == null) { throw new ApiException("计划不存在或已删除!"); } var tasks = new List(); foreach (var receive in plan.MsgToolPlanReceives) { var eids = await GetEids(receive); foreach (var eid in eids) { var task = new MsgToolTask { PKID = await _cacheDomain.GetMasterId(), PLANID = planId, PLANNAME = plan.PLANNAME, GROUPID = plan.GROUPID, GROUPNAME = plan.GROUPNAME, GROUPMEMO = plan.GROUPMEMO, CORPIDS = plan.CORPIDS, JSONDATA = plan.JSONDATA, SENDTYPE = plan.SENDTYPE, PLANEXETIME = plan.PLANEXETIME, PLANEXECYCLE = plan.PLANEXECYCLE, PLANEXEHOUR = plan.PLANEXEHOUR, CYCLENUMBER = plan.CYCLENUMBER, DUEDATE = plan.DUEDATE, STATUS = MsgToolTaskStatus.未分发, CTIME = DateTime.Now, RECEIVERID = eid, CREATOR = plan.CREATOR, ISNOTICE = 0, REMARK = plan.REMARK }; tasks.Add(task); await CreateTaskCmdBus(appid, task); } } tasks = await _crmRepository.GetRepository().BatchInsertAsync(tasks); plan.STATUS = MsgToolPlanStatus.已分发; plan.SENDTIME = DateTime.Now; await _crmRepository.GetRepository().UpdateAsync(plan); } public async Task CancelTasksByPlan(CreateTasksByPlanDto dto) { var planId = dto.PlanId; var plan = await _crmRepository.GetRepository() .QueryIncluding(x => x.MsgToolTasks) .FirstOrDefaultAsync(x => x.PKID == planId); if (plan == null) { throw new ApiException("任务不存在或已删除!"); } if (plan.STATUS == MsgToolPlanStatus.已取消) { throw new ApiException("不可重复取消!"); } /* if (plan.MsgToolTasks.Exists(n => n.STATUS != MsgToolTaskStatus.未分发 && n.STATUS != MsgToolTaskStatus.已取消)) { throw new ApiException("所有任务未分发才能取消!"); }*/ foreach (var task in plan.MsgToolTasks) { task.STATUS = MsgToolTaskStatus.已取消; task.EXESTATUS = MsgToolTaskExeStatus.已取消; } var taskids = plan.MsgToolTasks.Select(n => n.PKID).Distinct().ToList(); var cmdList = await _crmRepository.GetRepository().Query().Where(n => taskids.Contains(n.TASKID)).ToListAsync(); foreach (var cmd in cmdList) { cmd.STATUS = MsgToolTaskCmdStatus.已取消; } await _crmRepository.GetRepository().BatchUpdateAsync(plan.MsgToolTasks, x => new { x.STATUS, x.EXESTATUS }); await _crmRepository.GetRepository().BatchUpdateAsync(cmdList, x => new { x.STATUS }); _msgToolTaskEvent.RemoveTimingTasks(plan.MsgToolTasks); plan.STATUS = MsgToolPlanStatus.已取消; plan.SENDTIME = null; await _crmRepository.GetRepository().UpdateAsync(plan, x => new { x.STATUS, x.SENDTIME }); } public async Task CancelTaskCmd(CancelTaskCmdByTaskDto dto) { var taskId = dto.TaskId; var task = await _crmRepository.GetRepository() .QueryIncluding(x => x.MsgToolTaskCmds) .FirstOrDefaultAsync(x => x.PKID == taskId); if (task == null) { throw new ApiException("计划不存在或已删除!"); } if (task.STATUS == MsgToolTaskStatus.已取消) { throw new ApiException($"不可重复取消!"); } var cmdList = task.MsgToolTaskCmds.ToList(); foreach (var cmd in cmdList) { if (cmd.STATUS == MsgToolTaskCmdStatus.待执行 || cmd.STATUS == MsgToolTaskCmdStatus.暂停) { cmd.STATUS = MsgToolTaskCmdStatus.已取消; } } var transaction = await _crmRepository.BeginTransactionAsync(); try { await _crmRepository.GetRepository().BatchUpdateAsync(cmdList); task.STATUS = MsgToolTaskStatus.已取消; task.EXESTATUS = MsgToolTaskExeStatus.已取消; await _crmRepository.GetRepository().UpdateAsync(task); _msgToolTaskEvent.RemoveTimingTask(task); await transaction.CommitAsync(); } catch { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw new ApiException("执行创建命令任务报错"); } } /// /// 获取对应的工号 /// /// /// private async Task> GetEids(MsgToolPlanReceive task) { var eids = new List(); switch (task.TYPE) { case MsgToolPlanReceiveType.工号: eids.Add(task.RECEIVERID); break; case MsgToolPlanReceiveType.部门: eids = await _crmRepository.GetRepository().Query() .Include(x => x.BAS_INNERUSERGROUP) .Where(x => x.SALEDEPTID == task.RECEIVERID) .Select(x => x.BAS_INNERUSERGROUP.Where(n => n.BAS_INNERUSER.ISDISMISS != 1).Select(y => y.BAS_INNERUSER.EID).ToList()) .FirstOrDefaultAsync(); break; case MsgToolPlanReceiveType.组别: eids = await _crmRepository.GetRepository().Query() .Include(x => x.BAS_INNERUSERGROUP) .Where(x => x.GID == task.RECEIVERID) .Select(x => x.BAS_INNERUSERGROUP.Where(n => n.BAS_INNERUSER.ISDISMISS != 1).Select(y => y.BAS_INNERUSER.EID).ToList()) .FirstOrDefaultAsync(); break; } return eids; } public async Task CreateTaskCmdByTaskId(CreateTaskCmdByTaskIdDto dto) { var appid = _cacheDomain.GetApp(); var task = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.PKID == dto.TaskId); if (task == null) { throw new ApiException($"任务不存在或已删除!"); } await CreateTaskCmdBus(appid, task); await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.STATUS }); } /// /// 创建任务命令 /// /// /// /// private async Task CreateTaskCmdBus(string appid, MsgToolTask task) { if (task.SENDTYPE == "now") { task.STATUS = MsgToolTaskStatus.分发中; var @event = new CreateTaskCmdEvent { Appid = appid, Task = task }; await _eventBus.publicAsync(@event); } else { _msgToolTaskEvent.AddTimingTask(appid, task); } } public async Task CreateTaskCmd(string? appid, MsgToolTask task) { if (task.TASKTYPE == 2) { await CreateTaskCmdByLab(appid, task); return; } try { appid = string.IsNullOrEmpty(appid) ? _cacheDomain.GetApp() : appid; await _cacheDomain.SetApp(_crmRepository, appid); var deptid = _systemConfig.Apps.First(x => x.Appid.Equals(appid)).Deptids?.First(); var userGroup = await GetUserGroup(task.GROUPID); var users = await _crmRepository.GetRepository().Query() .Where(x => x.EID == task.RECEIVERID && task.CorpidList.Contains(x.CORPID)) .ToListAsync(); var kfdetail = await _crmRepository.GetRepository().Query().Where(n => n.TASKID == task.PKID).ToListAsync(); if (kfdetail.Count > 0) { users = await _crmRepository.GetRepository().Query() .Where(x => kfdetail.Select(y => y.KFUSERID + y.CORPID).Distinct().Contains(x.USERID + x.CORPID)) .ToListAsync(); } if (users == null || !users.Any()) { task.STATUS = MsgToolTaskStatus.失败; task.EXESTATUS = MsgToolTaskExeStatus.执行错误; task.ERROR = "找不到对应工号绑定的企微"; await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.ERROR, x.STATUS, x.EXESTATUS }); return; } if (userGroup == null) { throw new ApiException($"执行创建命令任务报错: 人群包不存在或已删除!"); } var corpApps = await _weworkRepository.GetRepository().Query() .Where(x => users.Select(y => y.CORPID).Distinct().Contains(x.Corpid)) .ToListAsync(); var cmds = new List(); var details = new List(); var hhusers = await _weworkRepository.GetRepository().Query() .Where(x => users.Select(y => y.USERID + y.CORPID).Distinct().Contains(x.Userid + x.Corpid)) .ToListAsync(); foreach (var user in users) { var customerList = await GetUserList(task.GROUPID, user.CORPID + "_1", user.USERID); var corpApp = corpApps.FirstOrDefault(x => x.Corpid == user.CORPID); var hhuser = hhusers.FirstOrDefault(x => x.Userid == user.USERID && x.Corpid == user.CORPID); var cmd = new MsgToolTaskCmd { PKID = await _cacheDomain.GetMasterId(), DUEDATE = task.DUEDATE, CORPID = user.CORPID, CORPNAME = corpApp?.Corpname, JSONDATA = task.JSONDATA, PLANID = task.PLANID, TASKID = task.PKID, SENDNUM = customerList.Count, CTIME = DateTime.Now, ISNOTICE = task.ISNOTICE, PLANEXETIME = task.PLANEXETIME, MEMO = "", STATUS = MsgToolTaskCmdStatus.待执行, KFNICKNAME = hhuser?.Uname, KFUSERID = user.USERID }; foreach (var customer in customerList) { details.Add(new MsgToolTaskCmdDetail { PKID = await _cacheDomain.GetMasterId(), CORPID = user.CORPID, KFUSERID = user.USERID, CTIME = DateTime.Now, NICKNAME = customer._nickname, STATUS = MsgToolTaskCmdDetailStatus.待执行, EXTUSERID = customer._appuserid, CMDID = cmd.PKID }); } cmds.Add(cmd); } var transaction = await _crmRepository.BeginTransactionAsync(); try { await _crmRepository.GetRepository().BatchInsertAsync(cmds); await _crmRepository.GetRepository().BatchInsertAsync(details); task.STATUS = MsgToolTaskStatus.已分发; task.EXESTATUS = MsgToolTaskExeStatus.未执行; task.SENDTIME = DateTime.Now; await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.SENDTIME, x.STATUS }); await transaction.CommitAsync(); var settingStr = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == "MsgToolSetting"); var hasNotice = false; if (settingStr != null) { var setting = JsonHelper.FromJson(settingStr.PARAVALUE); hasNotice = setting.HasNotice; } //var minutes = await _cacheDomain.GetParameter(ParameterEnums.MSG_TOOL_ADVANCED_NOTIFICATION_TIME_MINUTES); if (hasNotice) { var data = new { Id = task.PKID, Message = $"你有企微群发任务 [{task.PLANNAME}({task.PKID})]待执行,点击查看详情请进入任务列表。", Eid = task.RECEIVERID, Deptid = deptid, Method = "MsgToolMessage" }; await _cacheDomain.SendCrmMessage(data); } _msgToolTaskEvent.RemoveTimingTask(task); } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw new ApiException($"执行创建命令任务报错:{ex.Message}"); } } catch (Exception ex) { task.STATUS = MsgToolTaskStatus.失败; task.EXESTATUS = MsgToolTaskExeStatus.执行错误; task.ERROR = ex.Message; await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.ERROR, x.STATUS, x.EXESTATUS }); throw; } } public async Task CreateTaskCmdByLab(string? appid, MsgToolTask task) { try { appid = string.IsNullOrEmpty(appid) ? _cacheDomain.GetApp() : appid; await _cacheDomain.SetApp(_crmRepository, appid); var deptid = _systemConfig.Apps.First(x => x.Appid.Equals(appid)).Deptids?.First(); var labDetailList = await _crmRepository.GetRepository().Query().Where(n => n.TASKID == task.PKID).ToListAsync(); if (labDetailList == null) { throw new ApiException($"执行创建命令任务报错: 企微标签不为空!"); } var corpApps = await _weworkRepository.GetRepository().Query() .Where(x => labDetailList.Select(y => y.CORPID).Distinct().Contains(x.Corpid)) .ToListAsync(); var cmds = new List(); var details = new List(); var users = labDetailList.GroupBy(n => new { n.KFUSERID, n.CORPID }).Select(n => new { n.Key.KFUSERID, n.Key.CORPID }).ToList(); var hhusers = await _weworkRepository.GetRepository().Query() .Where(x => users.Select(y => y.KFUSERID + y.CORPID).Distinct().Contains(x.Userid + x.Corpid)) .ToListAsync(); foreach (var user in users) { var customerList = labDetailList.Where(n => n.KFUSERID == user.KFUSERID && n.CORPID == user.CORPID).ToList(); var corpApp = corpApps.FirstOrDefault(x => x.Corpid == user.CORPID); var hhuser = hhusers.FirstOrDefault(x => x.Userid == user.KFUSERID && x.Corpid == user.CORPID); var cmd = new MsgToolTaskCmd { PKID = await _cacheDomain.GetMasterId(), DUEDATE = task.DUEDATE, CORPID = user.CORPID, CORPNAME = corpApp?.Corpname, JSONDATA = task.JSONDATA, PLANID = task.PLANID, TASKID = task.PKID, SENDNUM = customerList.Count, CTIME = DateTime.Now, ISNOTICE = task.ISNOTICE, PLANEXETIME = task.PLANEXETIME, MEMO = "", STATUS = MsgToolTaskCmdStatus.待执行, KFNICKNAME = hhuser?.Uname, KFUSERID = user.KFUSERID }; foreach (var customer in customerList) { details.Add(new MsgToolTaskCmdDetail { PKID = await _cacheDomain.GetMasterId(), CORPID = user.CORPID, KFUSERID = user.KFUSERID, CTIME = DateTime.Now, NICKNAME = customer.NICKNAME, STATUS = MsgToolTaskCmdDetailStatus.待执行, EXTUSERID = customer.EXTUSERID, CMDID = cmd.PKID }); } cmds.Add(cmd); } var transaction = await _crmRepository.BeginTransactionAsync(); try { await _crmRepository.GetRepository().BatchInsertAsync(cmds); await _crmRepository.GetRepository().BatchInsertAsync(details); task.STATUS = MsgToolTaskStatus.已分发; task.EXESTATUS = MsgToolTaskExeStatus.未执行; task.SENDTIME = DateTime.Now; await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.SENDTIME, x.STATUS, x.EXESTATUS }); await transaction.CommitAsync(); var settingStr = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == "MsgToolSetting"); var hasNotice = false; if (settingStr != null) { var setting = JsonHelper.FromJson(settingStr.PARAVALUE); hasNotice = setting.HasNotice; } //var minutes = await _cacheDomain.GetParameter(ParameterEnums.MSG_TOOL_ADVANCED_NOTIFICATION_TIME_MINUTES); if (hasNotice) { var data = new { Id = task.PKID, Message = $"你有企微群发任务 [{task.PLANNAME}({task.PKID})]待执行,点击查看详情请进入任务列表。", Eid = task.RECEIVERID, Deptid = deptid, Method = "MsgToolMessage" }; await _cacheDomain.SendCrmMessage(data); } _msgToolTaskEvent.RemoveTimingTask(task); } catch (Exception ex) { await transaction.RollbackAsync(); await transaction.DisposeAsync(); throw new ApiException($"执行创建命令任务报错:{ex.Message}"); } } catch (Exception ex) { task.STATUS = MsgToolTaskStatus.失败; task.EXESTATUS = MsgToolTaskExeStatus.执行错误; task.ERROR = ex.Message; await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.ERROR, x.STATUS, x.EXESTATUS }); throw; } } public async Task GetMsgToolTask(decimal? planid) { var cmd = await _crmRepository.GetRepository().Query().ToListAsync(); return cmd.FirstOrDefault(m => m.PLANID == planid); } public async Task> SearchExecuteTaskPage(SearchExecuteTaskDto dto) { if (dto.TaskId == null && dto.UserId == null) { throw new ApiException($"条件必填其一!"); } var tasks = await _crmRepository.GetRepository().Query() .If(dto.TaskId != null, x => x.Where(x => x.PKID == dto.TaskId)) .If(dto.UserId != null, x => x.Where(x => x.RECEIVERID == dto.UserId)) .ToListAsync(); if (tasks == null || !tasks.Any()) { throw new ApiException($"任务不存在或已删除!"); } var users = await _crmRepository.GetRepository().Query() .Where(x => tasks.Select(y => y.RECEIVERID).Contains(x.EID)) .ToListAsync(); var corpidList = new List(); tasks.ForEach(x => { corpidList.AddRange(x.CorpidList); }); var wwHhusers = await _crmRepository.GetRepository().Query() .Where(x => tasks.Select(y => y.RECEIVERID).Contains(x.EID) && corpidList.Contains(x.CORPID)) .ToListAsync(); var query = _crmRepository.GetRepository().Query() .Where(x => tasks.Select(y => y.PKID).Contains(x.TASKID)); var dataquery = query .Include(x => x.MsgToolTaskCmdDetails) .Include(x => x.MsgToolTask) .OrderByDescending(x => x.CTIME) .Select(x => new MsgToolExecuteDto { PKID = x.PKID, Count = x.MsgToolTaskCmdDetails.Count(), EnableCount = x.MsgToolTaskCmdDetails.Where(n => n.UNENABLED != 1).Count(), SuccessCount = x.MsgToolTaskCmdDetails.Where(n => n.UNENABLED != 1 && n.STATUS == MsgToolTaskCmdDetailStatus.已执行).Count(), FailCount = x.MsgToolTaskCmdDetails.Where(n => n.UNENABLED != 1 && n.STATUS == MsgToolTaskCmdDetailStatus.执行错误).Count(), UnExecCount = x.MsgToolTaskCmdDetails.Where(n => n.UNENABLED != 1 && n.STATUS == MsgToolTaskCmdDetailStatus.待执行).Count(), NotFoundCount = x.MsgToolTaskCmdDetails.Where(n => n.UNENABLED != 1 && n.STATUS == MsgToolTaskCmdDetailStatus.找不到人).Count(), Status = x.STATUS, WeworkName = x.CORPNAME, Nickname = x.KFNICKNAME, Userid = x.KFUSERID, Corpid = x.CORPID, TaskStatus = x.MsgToolTask.STATUS, CanRun = x.MsgToolTask.DUEDATE.HasValue && DateTime.Compare(x.MsgToolTask.DUEDATE.Value, DateTime.Now) < 0 ? false : true, JsonData = x.MsgToolTask.JSONDATA, Eid = x.MsgToolTask.RECEIVERID }) .If(dto.Status != null, x => x.Where(x => x.Status == dto.Status)) .Where(n => n.EnableCount > 0); var data = await dataquery .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var total = await dataquery.CountAsync(); var hhusers = await _weworkRepository.GetRepository().Query() .Where(x => data.Select(y => y.Userid + y.Corpid).Distinct().Contains(x.Userid + x.Corpid)) .ToListAsync(); foreach (var item in data) { var user = users.FirstOrDefault(x => x.EID == item.Eid); var hhuser = hhusers.FirstOrDefault(x => x.Userid == item.Userid && x.Corpid == item.Corpid); var wwHhuser = wwHhusers.FirstOrDefault(x => x.CORPID == item.Corpid); item.Email = hhuser?.Email; item.Phone = hhuser?.Mobile; item.Nickname = hhuser?.Uname; item.Euser = $"{user?.EID}-{user?.UNAME}"; item.AssignStatus = wwHhuser?.ASSIGNSTATUS == null ? null : (AssignStatus)wwHhuser.ASSIGNSTATUS; } return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task> SearchMsgToolTaskPage(SearchMsgToolTaskDto dto) { var query = _crmRepository.GetRepository().Query().Include(x => x.MsgToolTaskCmds).AsQueryable(); var userFilter = new List(); if (dto.UserId.HasValue) { var user = _crmRepository.GetRepository().Query().FirstOrDefault(n => n.PKID == dto.UserId || n.EID == dto.UserId); if (user != null) { userFilter.Add(user.EID); } } else if (!string.IsNullOrEmpty(dto.GroupIds)) { var groupids = dto.GroupIds.Split(',').Select(x => decimal.Parse(x)); var groupList = _crmRepository.GetRepository().Query().Where(n => groupids.Contains(n.GID.Value)).ToList(); userFilter = _crmRepository.GetRepository().Query().Where(x => groupList.Select(n => n.INNERUSERID).Contains(x.PKID)).Select(n => n.EID).ToList(); } else if (!string.IsNullOrEmpty(dto.DeptId)) { var ALLdeptIDS = new List(); var ALLgidS = new List(); if (!string.IsNullOrEmpty(dto.DeptId)) { var depts = dto.DeptId.Split(',').Select(x => decimal.Parse(x)); foreach (var item in depts) { List deptIDS = new List(); List gidS = new List(); _cacheDomain.GetAllDeptIDOrGidByDeptId(item, ref deptIDS, ref gidS);//获取所有的组别和gid ALLdeptIDS.AddRange(deptIDS); ALLgidS.AddRange(gidS); } } var groupList = _crmRepository.GetRepository().Query().Where(b => ALLdeptIDS.Contains(b.DEPTID.Value) || ALLgidS.Contains(b.GID.Value)).ToList(); userFilter = _crmRepository.GetRepository().Query().Where(x => groupList.Select(n => n.INNERUSERID).Contains(x.PKID)).Select(n => n.EID).ToList(); } if (!string.IsNullOrWhiteSpace(dto.Creator)) { var creatorFilter = _crmRepository.GetRepository().Query().Where(x => x.UNAME.Contains(dto.Creator) || x.EID.ToString().Contains(dto.Creator)).Select(n => n.EID).ToList(); query = query.Where(n => n.RECEIVERID != null && (creatorFilter.Contains(n.RECEIVERID.Value) || creatorFilter.Contains(n.CREATOR.Value))); } if (userFilter.Count > 0) { query = query.Where(n => n.RECEIVERID != null && userFilter.Contains(n.RECEIVERID.Value)); } if (dto.Status.HasValue) { if (dto.Status == MsgToolTaskExeStatus.已取消) { query = query.Where(n => n.STATUS == MsgToolTaskStatus.已取消); } else { query = query.Where(n => n.EXESTATUS == dto.Status); } } var nowTypeList = new List { "now", "tim" }; query = query.If(!string.IsNullOrEmpty(dto.PlanName), x => x.Where(x => x.PLANNAME.Contains(dto.PlanName))) //.If(dto.Creator.HasValue, x => x.Where(x => x.CREATOR == dto.Creator)) .If(dto.IndexType == 1, x => x.Where(x => nowTypeList.Contains(x.SENDTYPE))) .If(dto.IndexType != 1, x => x.Where(x => !nowTypeList.Contains(x.SENDTYPE))) .If(!string.IsNullOrEmpty(dto.SendType), x => x.Where(n => n.SENDTYPE == dto.SendType)) .If(dto.Stime.HasValue, x => x.Where(n => n.CTIME >= dto.Stime)) .If(dto.Etime.HasValue, x => x.Where(n => n.CTIME <= dto.Etime.Value.AddDays(1).AddSeconds(-1))) .OrderByDescending(x => x.CTIME); var total = await query.CountAsync(); var data = await query .Select(x => new MsgToolTaskDto { PKID = x.PKID, PlanName = x.PLANNAME, ReceiverEid = x.RECEIVERID.Value, CreateEid = x.CREATOR.Value, Ctime = x.CTIME, Status = x.STATUS, ExeStatus = x.EXESTATUS, Cycle = x.PLANEXECYCLE, PLANEXETIME = x.PLANEXETIME, MsgToolTaskCmds = x.MsgToolTaskCmds, Remark = x.REMARK, SendType = x.SENDTYPE, DUEDATE = x.DUEDATE, JsonData = x.JSONDATA, GroupName = x.GROUPNAME, TaskType = x.TASKTYPE }) .Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var cmdsList = await _crmRepository.GetRepository() .QueryIncluding(x => x.MsgToolTaskCmdDetails) .Where(x => data.Select(x => x.PKID).Contains(x.TASKID)).ToListAsync(); /* .GroupBy(x => new { x.TASKID }) .Select(x => new { taskid = x.Key.TASKID, count = x.Count() }) .ToListAsync();*/ foreach (var item in data) { if (item.Status == MsgToolTaskStatus.已取消) { item.ExeStatus = MsgToolTaskExeStatus.已取消; } var cmdList = item.MsgToolTaskCmds.Where(n => n.STARTTIME.HasValue).OrderByDescending(n => n.PKID); if (item.SendType == "now" || item.SendType == "daily") { item.ExecTime = cmdList.Min(n => n.STARTTIME); item.ExitTime = cmdList.Max(n => n.ENDTIME); } else { item.ExecTime = cmdList.FirstOrDefault()?.STARTTIME; item.ExitTime = cmdList.FirstOrDefault()?.ENDTIME; } item.GroupName = item.TaskType == 2 ? "企微标签" : item.GroupName; item.Creator = $"{item.CreateEid}-{await _cacheDomain.GetUserNameByEid(item.CreateEid)}"; item.Receiver = $"{item.ReceiverEid}-{await _cacheDomain.GetUserNameByEid(item.ReceiverEid)}"; item.Count = cmdsList.Where(x => x.TASKID == item.PKID).Sum(n => n.MsgToolTaskCmdDetails.Count()); item.SuccessCount = cmdsList.Where(x => x.TASKID == item.PKID).Sum(n => n.MsgToolTaskCmdDetails.Where(x => x.STATUS == MsgToolTaskCmdDetailStatus.已执行).Count()); item.FailCount = cmdsList.Where(x => x.TASKID == item.PKID).Sum(n => n.MsgToolTaskCmdDetails.Where(x => x.STATUS == MsgToolTaskCmdDetailStatus.执行错误 || x.STATUS == MsgToolTaskCmdDetailStatus.找不到人).Count()); } return new PageResult(dto.PageIndex, dto.PageSize, total, data); } public async Task> GetTimingTasks() { return _msgToolTaskEvent.GetMsgToolTaskEvents(); } public async Task CreateTaskCmdBusByTaskid(string? appid, decimal taskid) { appid = string.IsNullOrEmpty(appid) ? _cacheDomain.GetApp() : appid; await _cacheDomain.SetApp(_crmRepository, appid); var task = await _crmRepository.GetRepository().Query().FirstOrDefaultAsync(x => x.PKID == taskid); if (task == null) { throw new ApiException($"任务不存在或已删除!"); } task.STATUS = MsgToolTaskStatus.分发中; var @event = new CreateTaskCmdEvent { Appid = appid, Task = task }; await _eventBus.publicAsync(@event); await _crmRepository.GetRepository().UpdateAsync(task, x => new { x.STATUS }); } public async Task> GetMsgToolTimingTask(string? appid) { var now = DateTime.Now; var sendTypes = new string[] { "daily", "week", "month" }; if (string.IsNullOrEmpty(appid)) { return new List(); } await _cacheDomain.SetApp(_crmRepository, appid); return await _crmRepository.GetRepository().Query() .Where(x => (sendTypes.Contains(x.SENDTYPE) && x.DUEDATE > now && x.STATUS == MsgToolTaskStatus.未分发) || (x.SENDTYPE == "tim" && x.PLANEXETIME > now && x.STATUS == MsgToolTaskStatus.未分发)) .ToListAsync(); } public async Task> RefreshTimingTaskStatus(string? appid) { var now = DateTime.Now; var sendTypes = new string[] { "daily", "week", "month" }; await _cacheDomain.SetApp(_crmRepository, appid); var tasks = await _crmRepository.GetRepository().Query() .Where(x => sendTypes.Contains(x.SENDTYPE) && x.DUEDATE > now && x.PLANEXETIME <= now && x.STATUS == MsgToolTaskStatus.已分发 && x.SENDTIME < now) .ToListAsync(); foreach (var task in tasks) { task.STATUS = MsgToolTaskStatus.未分发; } await _crmRepository.GetRepository().BatchUpdateAsync(tasks, x => new { x.STATUS }); return tasks; } public async Task> GetTaskCmdDetail(SearchMsgToolCmdDetailDto dto) { var cmd = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PKID == dto.CmdId); if (cmd == null) { throw new Exception("找不到该任务"); } var query = _crmRepository.GetRepository().Query() .Where(x => x.CMDID == dto.CmdId); if (!string.IsNullOrWhiteSpace(dto.Name)) { query = query.Where(n => n.NICKNAME.Contains(dto.Name)); } var total = await query.CountAsync(); List res = new List(); if (dto.PageSize > 0) { res = await query.Select(x => new CmdDetailDto { Pkid = x.PKID, Nickname = x.NICKNAME, Userid = x.EXTUSERID, KfUserId = x.KFUSERID, Corpid = x.CORPID, UnEnabled = x.UNENABLED }).Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); } else { res = await query.Select(x => new CmdDetailDto { Pkid = x.PKID, Nickname = x.NICKNAME, Userid = x.EXTUSERID, KfUserId = x.KFUSERID, Corpid = x.CORPID, UnEnabled = x.UNENABLED }) .ToListAsync(); dto.PageSize = total; } var exuserList = await _weworkRepository.GetRepository().Query() .Where(x => x.Corpid == cmd.CORPID && x.Userid == cmd.KFUSERID && res.Select(y => y.Userid).Distinct().Contains(x.Extuserid)) .ToListAsync(); var hhuserList = await _weworkRepository.GetRepository().Query() .Where(x => x.Corpid == cmd.CORPID && res.Select(y => y.Userid).Distinct().Contains(x.Userid)) .ToListAsync(); foreach (var detail in res) { var hhuser = hhuserList.FirstOrDefault(n => n.Userid == detail.Userid && n.Corpid == detail.Corpid); var remarkUser = exuserList.FirstOrDefault(n => n.Extuserid == detail.Userid && n.Userid == detail.KfUserId && n.Corpid == detail.Corpid); if (hhuser != null) { detail.Avatar = hhuser.Avatar; detail.Name = hhuser.Name; detail.Remark = remarkUser == null ? "" : remarkUser.Remark; } } return new PageResult(dto.PageIndex, dto.PageSize, total, res); } public async Task SetCmdDetailEnable(SetCmdDetailEnableDto model) { var cmd = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PKID == model.CmdId); if (cmd == null) { throw new Exception("找不到该任务"); } if (cmd.STATUS != MsgToolTaskCmdStatus.待执行 && cmd.STATUS != MsgToolTaskCmdStatus.暂停) { throw new Exception("只有待执行和暂停的任务可以修改发送人员变动"); } var allCmdIds = model.allpostData.Split(';').Where(n => !string.IsNullOrWhiteSpace(n)).Select(n => Convert.ToDecimal(n)).ToList(); var cmddetailList = await _crmRepository.GetRepository().Query() .Where(n => n.CMDID == model.CmdId && allCmdIds.Contains(n.PKID)).ToListAsync(); List cmdIds = new List(); if (model.cmdDetailIds != null) { cmdIds = model.cmdDetailIds.Split(';').Where(n => !string.IsNullOrWhiteSpace(n)).Select(n => Convert.ToDecimal(n)).ToList(); } foreach (var item in cmddetailList) { if (cmdIds.Contains(item.PKID)) { item.UNENABLED = 0; } else { item.UNENABLED = 1; } } await _crmRepository.GetRepository().BatchUpdateAsync(cmddetailList); cmd.SENDNUM = cmddetailList.Where(n => n.UNENABLED != 1).Count(); await _crmRepository.GetRepository().UpdateAsync(cmd, x => new { x.SENDNUM }); return true; } /// /// 获取命令是否能执行 /// /// /// public async Task GetExecCmdEnable(SerachCmdEnableDto dto) { var cmd = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PKID == dto.CmdId); if (cmd == null) { throw new Exception("找不到该任务"); } if (cmd.STATUS == MsgToolTaskCmdStatus.已执行) { throw new Exception("该任务已执行"); } var task = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PKID == cmd.TASKID); if (task == null) { throw new Exception("找不到该任务"); } if (task.STATUS == MsgToolTaskStatus.已取消) { throw new Exception("任务已取消!"); } if (task.DUEDATE < DateTime.Now) { throw new Exception("任务已截止!"); } var nowExecCmd = await _crmRepository.GetRepository() .QueryIncluding(x => x.MsgToolTask) .Where(n => n.MsgToolTask.RECEIVERID == task.RECEIVERID && n.STARTTIME >= DateTime.Now.Date && n.STARTTIME.HasValue).ToListAsync(); var hasPasstask = nowExecCmd.GroupBy(n => n.MsgToolTask).Select(n => n).ToList(); var settingStr = await _crmRepository.GetRepository().FirstOrDefaultAsync(n => n.PARAKEY == "MsgToolSetting"); var limitCount = 5; if (settingStr != null) { var setting = JsonHelper.FromJson(settingStr.PARAVALUE); limitCount = setting.TaskLimit; } if (hasPasstask.Count() > limitCount) { throw new Exception($"当天执行任务数量已经超过{limitCount}"); } return true; } public async Task GetMsgToolVersion() { return await _cacheDomain.GetMsgToolVersion(); } public async Task SetMsgToolVersion(MsgToolVersionModel model) { return await _cacheDomain.SetMsgToolVersion(model); } #region app相关接口 /// /// 获取企微账户 /// /// /// public async Task> GetWxWorkUser(EidQueryDto model) { List res = new List(); var users = await _crmRepository.GetRepository().Query().Where(x => x.EID == model.Eid).ToListAsync(); var hhusers = await _weworkRepository.GetRepository().Query() .Where(x => users.Select(y => y.USERID + y.CORPID).Distinct().Contains(x.Userid + x.Corpid)) .ToListAsync(); var corpApps = await _weworkRepository.GetRepository().Query().Where(x => users.Select(y => y.CORPID).Distinct().Contains(x.Corpid)).ToListAsync(); foreach (var item in users) { var hhuser = hhusers.FirstOrDefault(n => n.Corpid == item.CORPID && n.Userid == item.USERID); Exinfo exinfo = new Exinfo(); try { exinfo = JsonHelper.FromJson(hhuser.Exinfo); } catch { exinfo = new Exinfo(); } WxWorkModel user = new WxWorkModel { CropId = item.CORPID, CropName = corpApps.FirstOrDefault(n => n.Corpid == item.CORPID)?.Corpname, UserId = item.USERID, UserName = hhuser?.Uname, Mobile = hhuser?.Mobile, Avatar= exinfo.avatar }; res.Add(user); } return res; } public async Task GetOutWorkUser(OutExtuserQueryDto model) { wwExtuserModel res = new wwExtuserModel(); Dictionary customTags = new Dictionary(); var list = await GetExtUserList(model.CropId, model.UserId, res); Dictionary> diclist = new Dictionary>(); var tagList = GetGroupTagList(model.CropId);//获取所有标签 res.TagList = tagList;//所有标签 foreach (var item in list) { if (item.type != 2) { string yearStr = item.createtime2.Year.ToString(); if (diclist.ContainsKey(yearStr)) { if (diclist[yearStr].Where(m => m == item.cmonth).Count() > 0) { continue; } else { diclist[yearStr].Add(item.cmonth); } } else { diclist.Add(yearStr, new List() { item.cmonth }); } } } res.YearMonthList = diclist; res.DataList = list; return res; } /// /// 获取某个企业号下所有的企业标签 /// /// /// private List GetGroupTagList(string corpid) { var list = _pcweworkRepository.GetRepository().Query().Where(m => m.corpid == corpid).OrderBy(m => m.order).ToList(); List viewList = new List(); foreach (var item in list) { try { var info = JsonHelper.FromJson>(item.tag); if (info != null) viewList.Add(new wwGroupTagView() { corpid = item.corpid, order = item.order, tags = item.tag, create_time = item.create_time, group_id = item.group_id, group_name = item.group_name, tagNumbers = info.ToList() }); } catch { } } return viewList; } public async Task> GetExtUserList(string corpid, string userid, wwExtuserModel res) { Dictionary customTags = new Dictionary(); var hhuserQuery = _pcweworkRepository.GetRepository().Query().Where(n => n.corpid == corpid && n.userid == userid).ToList(); var extUserQuery = _pcweworkRepository.GetRepository().Query(); var userExtQuery = _pcweworkRepository.GetRepository().Query().Where(n => n.corpid == corpid && n.userid == userid).ToList(); var sql = $@"select b.userid,b.corpid,a.createtime,a.extuserid,c.name,a.remark,c.avatar thumb_avatar,a.description,a.deleted,a.tags_type1,a.tags_type2, a.remark_corp_name,a.add_type,a.add_way from ww_user_extuser a join ww_extuser c on a.corpid = c.corpid and a.extuserid = c.userid join ww_hhuser b on a.corpid = b.corpid and a.userid = b.userid where b.corpid = @corpid and b.userid = @userid and a.deleted =0 order by a.createtime desc"; MySqlParameter[] param = new MySqlParameter[] { new MySqlParameter(){ DbType=System.Data.DbType.String,Value= corpid,ParameterName="corpid"}, new MySqlParameter(){ DbType=System.Data.DbType.String,Value=userid,ParameterName="userid"} }; var dd = await _pcweworkRepository.ExecuteSqlToListAsync(sql, param.ToArray()); int xuhao = 0; List monthGroupBy = new List(); Dictionary dic = new Dictionary(); foreach (var item in dd) { item.tagInfos = new List(); if (string.IsNullOrWhiteSpace(item.remark_corp_name)) { item.remark_corp_name = ""; } try//企业标签 { var tag1 = JsonHelper.FromJson>(item.tags_type1); item.tagInfos.AddRange(tag1); } catch (Exception ex) { } try//自定义标签 { var tag2 = JsonHelper.FromJson>(item.tags_type2); foreach (var mytag in tag2) { if (!customTags.ContainsKey(mytag.tag_name)) { customTags.Add(mytag.tag_name, mytag.tag_name); } } item.tagInfos.AddRange(tag2); } catch (Exception ex) { } xuhao++; item.createtime2 = DateTimeTool.GetTimeFromLinuxShortTime(item.createtime); item.cdate = item.createtime2.ToString("yyyy-MM-dd"); item.type = 1; item.cmonth = item.createtime2.ToString("yyyy-MM"); item.chours = item.createtime2.ToString("HH:mm:ss"); item.xuhao = xuhao;//赋值序号 } dd.AddRange(monthGroupBy); res.customTags = customTags; return dd.OrderBy(m => m.xuhao).ToList(); } #endregion app相关接口 } }