crm.core/code/Crm.Core.MsgTool.Domain/MsgToolDomain.cs

1623 lines
74 KiB
C#

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<CrmDbContext> _crmRepository;
private readonly IBaseRepository<WeworkDbContext> _weworkRepository;
private readonly IBaseRepository<PcWeworkDbContext> _pcweworkRepository;
private readonly IBaseRepository<HgDbContext> _hgRepository;
private readonly IEventBus<CreateTaskCmdEvent> _eventBus;
private readonly MsgToolTaskEventSingleton _msgToolTaskEvent;
public MsgToolDomain(
IConfiguration configuration,
IHttpClient httpClient,
ICacheDomain cacheDomain,
IOracleRepository<CrmDbContext> crmRepository,
IBaseRepository<WeworkDbContext> weworkRepository,
IBaseRepository<PcWeworkDbContext> pcweworkRepository,
IEventBus<CreateTaskCmdEvent> eventBus,
MsgToolTaskEventSingleton msgToolTaskEvent,
IBaseRepository<HgDbContext> hgRepository)
{
_configuration = configuration;
_httpClient = httpClient;
_cacheDomain = cacheDomain;
_crmRepository = crmRepository;
_weworkRepository = weworkRepository;
_pcweworkRepository = pcweworkRepository;
_systemConfig = configuration.GetSection("SystemConfig").Get<SystemConfig>();
_eventBus = eventBus;
_msgToolTaskEvent = msgToolTaskEvent;
_hgRepository = hgRepository;
}
public async Task<bool> Test()
{
var userlist = await _crmRepository.GetRepository<MsgToolTask>().Query().ToListAsync();
var cmd = await _crmRepository.GetRepository<MsgToolTaskCmd>().Query().ToListAsync();
var cmddetail = await _crmRepository.GetRepository<MsgToolTaskCmdDetail>().Query().ToListAsync();
var plan = await _crmRepository.GetRepository<MsgToolPlan>().Query().ToListAsync();
var rece = await _crmRepository.GetRepository<MsgToolPlanReceive>().Query().ToListAsync();
return true;
}
public async Task<MsgToolTaskCmd> GetMsgToolTaskCmd(GetTaskCmdDto dto)
{
var cmd = await _crmRepository.GetRepository<MsgToolTaskCmd>().Query().ToListAsync();
return cmd.FirstOrDefault(m => m.PKID == dto.TaskId);
}
public async Task ChangeTaskStatus(ChangeTaskStatusDto dto)
{
var db_task = await _crmRepository.GetRepository<MsgToolTask>().Query().ToListAsync();
var db_taskcmd = await _crmRepository.GetRepository<MsgToolTaskCmd>().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<MsgToolTask>().UpdateAsync(task);
}
}
public async Task<Credentials> GetOSSAccess() {
var help = new AliHelper("LTAI5tERfeaQymj1CD7eycnw", "WScg5brbLlKWJvfRofCGnjso6Wi0Rx", "2015-04-01");
Dictionary<string, object> ditParam = new Dictionary<string, object>();
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<Credentials>(res.Substring(res.IndexOf("Credentials") + 13).Replace("}}", "}"));
}
return credentials;
}
public async Task<MsgToolTask> 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<MsgToolTaskLabDetail>().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<List<QiWeiPostJson>>(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<MsgToolTaskLabDetail>().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<List<QiWeiPostJson>>(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<MsgToolTaskKFDetail>().InsertAsync(labDetail);
hasKfDetail = true;
}
}
await _crmRepository.GetRepository<MsgToolTask>().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<List<MsgToolSendLog>> GetMsgToolTaskSendLog(MsgToolTaskSendLogDto dto) {
IList<MsgToolSendLog> res = new List<MsgToolSendLog>();
var taskList= _crmRepository.GetRepository<MsgToolTask>().Query();
var kfDetailList = _crmRepository.GetRepository<MsgToolTaskKFDetail>().Query();
var labDetailList = _crmRepository.GetRepository<MsgToolTaskLabDetail>().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<decimal> 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<MsgToolTaskCmd>().Query();
var cmd = await cmdQuery.FirstOrDefaultAsync(n => n.PKID == dto.TaskId);
if (cmd == null)
{
throw new Exception("找不到对应指令任务");
}
var cmdDetailList = await _crmRepository.GetRepository<MsgToolTaskCmdDetail>().Query().Where(n => n.CMDID == cmd.PKID).ToListAsync();
var task = await _crmRepository.GetRepository<MsgToolTask>().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<MsgToolTaskCmd>().UpdateAsync(cmd);
await _crmRepository.GetRepository<MsgToolTaskCmdDetail>().BatchUpdateAsync(cmdDetailList);
await _crmRepository.GetRepository<MsgToolTask>().UpdateAsync(task);
await transaction.CommitAsync();
}
catch (Exception ex)
{
await transaction.RollbackAsync();
await transaction.DisposeAsync();
throw new ApiException($"执行创建命令任务报错{ex.Message}");
}
}
public async Task<IList<MsgToolTaskCmdDetail>> GetMsgToolTaskCmdDetail(decimal? cmdId)
{
var cmd = await _crmRepository.GetRepository<MsgToolTaskCmdDetail>().Query().ToListAsync();
return cmd.Where(m => m.CMDID == cmdId && m.UNENABLED != 1).ToList();
}
public async Task<IList<ConfigItem>> GetMsgConfig()
{
List<ConfigItem> res = new List<ConfigItem>();
var param = await _crmRepository.GetRepository<BAS_PARAMETER>().Query().ToListAsync();
var config = param.FirstOrDefault(m => m.PARAKEY == "TaskTimeConfig");
if (config != null)
{
res = JsonHelper.FromJson<List<ConfigItem>>(config.PARAVALUE ?? "[{}]");
}
return res;
}
/// <summary>
/// 获取人群包列表
/// </summary>
/// <returns></returns>
/// <exception cref="ApiException"></exception>
public async Task<List<UserGroupDto>> GetUserGroupList(decimal? eid)
{
//return new List<UserGroupDto>
//{
// 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<RetResult<GroupPageDto<UserGroupDto>>>(url);
if (response.Ret == 0)
{
return response.Data.TableData;
}
else
{
Log.Error($"获取分群列表接口报错:{response.Message}");
throw new ApiException($"获取分群列表接口报错:{response.Message}");
}
}
/// <summary>
/// 获取人群包列表
/// </summary>
/// <returns></returns>
/// <exception cref="ApiException"></exception>
public async Task<UserGroupDto> GetUserGroup(decimal? id)
{
var url = $"{_systemConfig.GetUserGroupList()}?id={id}";
var response = await _httpClient.GetAsync<RetResult<LivePageDto<UserGroupDto>>>(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<int>(ParameterEnums.MSG_TOOL_ADVANCED_NOTIFICATION_TIME_MINUTES);
var sendTypes = new List<string>
{
"now", "tim"
};
var time = DateTime.Now.AddMinutes(minutes);
//await _crmRepository.GetRepository<MsgToolTask>().Query()
// .Where(x => sendTypes.Contains(x.SENDTYPE) && x.PLANEXETIME >= time)
// .Select(x => new CreateTaskCmdEvent { TaskId = x.PKID })
// .ToListAsync();
}
/// <summary>
/// 获取人群包
/// </summary>
/// <param name="groupid"></param>
/// <param name="appid"></param>
/// <param name="appuserid"></param>
/// <returns></returns>
/// <exception cref="ApiException"></exception>
public async Task<List<UserAppDto>> GetUserList(decimal groupid, string? appid, string? appuserid)
{
var data = new List<UserAppDto>();
// 测试使用
//data = CreateAppData(data);
//return data;
var url = $"{_systemConfig.GetUserQuery()}";
var param = new Dictionary<string, object>();
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<ApiResult<LivePageDto<UserAppDto>>>(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<ApiResult<LivePageDto<UserAppDto>>>(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<MsgToolPlan>()
.QueryIncluding(x => x.MsgToolPlanReceives)
.FirstOrDefaultAsync(x => x.PKID == planId);
if (plan == null)
{
throw new ApiException("计划不存在或已删除!");
}
var tasks = new List<MsgToolTask>();
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<MsgToolTask>().BatchInsertAsync(tasks);
plan.STATUS = MsgToolPlanStatus.;
plan.SENDTIME = DateTime.Now;
await _crmRepository.GetRepository<MsgToolPlan>().UpdateAsync(plan);
}
public async Task CancelTasksByPlan(CreateTasksByPlanDto dto)
{
var planId = dto.PlanId;
var plan = await _crmRepository.GetRepository<MsgToolPlan>()
.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<MsgToolTaskCmd>().Query().Where(n => taskids.Contains(n.TASKID)).ToListAsync();
foreach (var cmd in cmdList)
{
cmd.STATUS = MsgToolTaskCmdStatus.;
}
await _crmRepository.GetRepository<MsgToolTask>().BatchUpdateAsync(plan.MsgToolTasks, x => new
{
x.STATUS,
x.EXESTATUS
});
await _crmRepository.GetRepository<MsgToolTaskCmd>().BatchUpdateAsync(cmdList, x => new
{
x.STATUS
});
_msgToolTaskEvent.RemoveTimingTasks(plan.MsgToolTasks);
plan.STATUS = MsgToolPlanStatus.;
plan.SENDTIME = null;
await _crmRepository.GetRepository<MsgToolPlan>().UpdateAsync(plan, x => new
{
x.STATUS,
x.SENDTIME
});
}
public async Task CancelTaskCmd(CancelTaskCmdByTaskDto dto)
{
var taskId = dto.TaskId;
var task = await _crmRepository.GetRepository<MsgToolTask>()
.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<MsgToolTaskCmd>().BatchUpdateAsync(cmdList);
task.STATUS = MsgToolTaskStatus.;
task.EXESTATUS = MsgToolTaskExeStatus.;
await _crmRepository.GetRepository<MsgToolTask>().UpdateAsync(task);
_msgToolTaskEvent.RemoveTimingTask(task);
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
await transaction.DisposeAsync();
throw new ApiException("执行创建命令任务报错");
}
}
/// <summary>
/// 获取对应的工号
/// </summary>
/// <param name="task"></param>
/// <returns></returns>
private async Task<List<decimal>> GetEids(MsgToolPlanReceive task)
{
var eids = new List<decimal>();
switch (task.TYPE)
{
case MsgToolPlanReceiveType.:
eids.Add(task.RECEIVERID);
break;
case MsgToolPlanReceiveType.:
eids = await _crmRepository.GetRepository<BAS_SALESDEPARTMENT>().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<BAS_INNERGROUP>().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<MsgToolTask>().Query().FirstOrDefaultAsync(x => x.PKID == dto.TaskId);
if (task == null)
{
throw new ApiException($"任务不存在或已删除!");
}
await CreateTaskCmdBus(appid, task);
await _crmRepository.GetRepository<MsgToolTask>().UpdateAsync(task, x => new { x.STATUS });
}
/// <summary>
/// 创建任务命令
/// </summary>
/// <param name="appid"></param>
/// <param name="task"></param>
/// <returns></returns>
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<WW_HHUSER_EID>().Query()
.Where(x => x.EID == task.RECEIVERID && task.CorpidList.Contains(x.CORPID))
.ToListAsync();
var kfdetail = await _crmRepository.GetRepository<MsgToolTaskKFDetail>().Query().Where(n => n.TASKID == task.PKID).ToListAsync();
if (kfdetail.Count > 0)
{
users = await _crmRepository.GetRepository<WW_HHUSER_EID>().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<MsgToolTask>().UpdateAsync(task, x => new
{
x.ERROR,
x.STATUS,
x.EXESTATUS
});
return;
}
if (userGroup == null)
{
throw new ApiException($"执行创建命令任务报错: 人群包不存在或已删除!");
}
var corpApps = await _weworkRepository.GetRepository<WwCorp>().Query()
.Where(x => users.Select(y => y.CORPID).Distinct().Contains(x.Corpid))
.ToListAsync();
var cmds = new List<MsgToolTaskCmd>();
var details = new List<MsgToolTaskCmdDetail>();
var hhusers = await _weworkRepository.GetRepository<WwHhuser>().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<MsgToolTaskCmd>().BatchInsertAsync(cmds);
await _crmRepository.GetRepository<MsgToolTaskCmdDetail>().BatchInsertAsync(details);
task.STATUS = MsgToolTaskStatus.;
task.EXESTATUS = MsgToolTaskExeStatus.;
task.SENDTIME = DateTime.Now;
await _crmRepository.GetRepository<MsgToolTask>().UpdateAsync(task, x => new
{
x.SENDTIME,
x.STATUS
});
await transaction.CommitAsync();
var settingStr = await _crmRepository.GetRepository<BAS_PARAMETER>().FirstOrDefaultAsync(n => n.PARAKEY == "MsgToolSetting");
var hasNotice = false;
if (settingStr != null)
{
var setting = JsonHelper.FromJson<MsgToolSetting>(settingStr.PARAVALUE);
hasNotice = setting.HasNotice;
}
//var minutes = await _cacheDomain.GetParameter<int>(ParameterEnums.MSG_TOOL_ADVANCED_NOTIFICATION_TIME_MINUTES);
if (hasNotice)
{
var data = new
{
Id = task.PKID,
Message = $"你有企微群发任务 [{task.PLANNAME}({task.PKID})]待执行,点击<a onclick='openTaskList()' style='color:#1E9FFF;cursor:pointer;'>查看详情</a>请进入任务列表。",
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<MsgToolTask>().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<MsgToolTaskLabDetail>().Query().Where(n => n.TASKID == task.PKID).ToListAsync();
if (labDetailList == null)
{
throw new ApiException($"执行创建命令任务报错: 企微标签不为空!");
}
var corpApps = await _weworkRepository.GetRepository<WwCorp>().Query()
.Where(x => labDetailList.Select(y => y.CORPID).Distinct().Contains(x.Corpid))
.ToListAsync();
var cmds = new List<MsgToolTaskCmd>();
var details = new List<MsgToolTaskCmdDetail>();
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<WwHhuser>().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<MsgToolTaskCmd>().BatchInsertAsync(cmds);
await _crmRepository.GetRepository<MsgToolTaskCmdDetail>().BatchInsertAsync(details);
task.STATUS = MsgToolTaskStatus.;
task.EXESTATUS = MsgToolTaskExeStatus.;
task.SENDTIME = DateTime.Now;
await _crmRepository.GetRepository<MsgToolTask>().UpdateAsync(task, x => new
{
x.SENDTIME,
x.STATUS,
x.EXESTATUS
});
await transaction.CommitAsync();
var settingStr = await _crmRepository.GetRepository<BAS_PARAMETER>().FirstOrDefaultAsync(n => n.PARAKEY == "MsgToolSetting");
var hasNotice = false;
if (settingStr != null)
{
var setting = JsonHelper.FromJson<MsgToolSetting>(settingStr.PARAVALUE);
hasNotice = setting.HasNotice;
}
//var minutes = await _cacheDomain.GetParameter<int>(ParameterEnums.MSG_TOOL_ADVANCED_NOTIFICATION_TIME_MINUTES);
if (hasNotice)
{
var data = new
{
Id = task.PKID,
Message = $"你有企微群发任务 [{task.PLANNAME}({task.PKID})]待执行,点击<a onclick='openTaskList()' style='color:#1E9FFF;cursor:pointer;'>查看详情</a>请进入任务列表。",
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<MsgToolTask>().UpdateAsync(task, x => new
{
x.ERROR,
x.STATUS,
x.EXESTATUS
});
throw;
}
}
public async Task<MsgToolTask> GetMsgToolTask(decimal? planid)
{
var cmd = await _crmRepository.GetRepository<MsgToolTask>().Query().ToListAsync();
return cmd.FirstOrDefault(m => m.PLANID == planid);
}
public async Task<PageResult<MsgToolExecuteDto>> SearchExecuteTaskPage(SearchExecuteTaskDto dto)
{
if (dto.TaskId == null && dto.UserId == null)
{
throw new ApiException($"条件必填其一!");
}
var tasks = await _crmRepository.GetRepository<MsgToolTask>().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<BAS_INNERUSER>().Query()
.Where(x => tasks.Select(y => y.RECEIVERID).Contains(x.EID))
.ToListAsync();
var corpidList = new List<string>();
tasks.ForEach(x =>
{
corpidList.AddRange(x.CorpidList);
});
var wwHhusers = await _crmRepository.GetRepository<WW_HHUSER_EID>().Query()
.Where(x => tasks.Select(y => y.RECEIVERID).Contains(x.EID) && corpidList.Contains(x.CORPID))
.ToListAsync();
var query = _crmRepository.GetRepository<MsgToolTaskCmd>().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<WwHhuser>().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<MsgToolExecuteDto>(dto.PageIndex, dto.PageSize, total, data);
}
public async Task<PageResult<MsgToolTaskDto>> SearchMsgToolTaskPage(SearchMsgToolTaskDto dto)
{
var query = _crmRepository.GetRepository<MsgToolTask>().Query().Include(x => x.MsgToolTaskCmds).AsQueryable();
var userFilter = new List<decimal>();
if (dto.UserId.HasValue)
{
var user = _crmRepository.GetRepository<BAS_INNERUSER>().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<BAS_INNERUSERGROUP>().Query().Where(n => groupids.Contains(n.GID.Value)).ToList();
userFilter = _crmRepository.GetRepository<BAS_INNERUSER>().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<decimal>();
var ALLgidS = new List<decimal>();
if (!string.IsNullOrEmpty(dto.DeptId))
{
var depts = dto.DeptId.Split(',').Select(x => decimal.Parse(x));
foreach (var item in depts)
{
List<decimal> deptIDS = new List<decimal>();
List<decimal> gidS = new List<decimal>();
_cacheDomain.GetAllDeptIDOrGidByDeptId(item, ref deptIDS, ref gidS);//获取所有的组别和gid
ALLdeptIDS.AddRange(deptIDS);
ALLgidS.AddRange(gidS);
}
}
var groupList = _crmRepository.GetRepository<BAS_INNERUSERGROUP>().Query().Where(b => ALLdeptIDS.Contains(b.DEPTID.Value) || ALLgidS.Contains(b.GID.Value)).ToList();
userFilter = _crmRepository.GetRepository<BAS_INNERUSER>().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<BAS_INNERUSER>().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<string> { "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<MsgToolTaskCmd>()
.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<MsgToolTaskDto>(dto.PageIndex, dto.PageSize, total, data);
}
public async Task<List<MsgToolTaskEventDto>> 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<MsgToolTask>().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<MsgToolTask>().UpdateAsync(task, x => new { x.STATUS });
}
public async Task<List<MsgToolTask>> GetMsgToolTimingTask(string? appid)
{
var now = DateTime.Now;
var sendTypes = new string[] { "daily", "week", "month" };
if (string.IsNullOrEmpty(appid))
{
return new List<MsgToolTask>();
}
await _cacheDomain.SetApp(_crmRepository, appid);
return await _crmRepository.GetRepository<MsgToolTask>().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<List<MsgToolTask>> RefreshTimingTaskStatus(string? appid)
{
var now = DateTime.Now;
var sendTypes = new string[] { "daily", "week", "month" };
await _cacheDomain.SetApp(_crmRepository, appid);
var tasks = await _crmRepository.GetRepository<MsgToolTask>().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<MsgToolTask>().BatchUpdateAsync(tasks, x => new
{
x.STATUS
});
return tasks;
}
public async Task<PageResult<CmdDetailDto>> GetTaskCmdDetail(SearchMsgToolCmdDetailDto dto)
{
var cmd = await _crmRepository.GetRepository<MsgToolTaskCmd>().FirstOrDefaultAsync(n => n.PKID == dto.CmdId);
if (cmd == null)
{
throw new Exception("找不到该任务");
}
var query = _crmRepository.GetRepository<MsgToolTaskCmdDetail>().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<CmdDetailDto> res = new List<CmdDetailDto>();
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<WwUserExtuser>().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<WwExtuser>().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<CmdDetailDto>(dto.PageIndex, dto.PageSize, total, res);
}
public async Task<bool> SetCmdDetailEnable(SetCmdDetailEnableDto model)
{
var cmd = await _crmRepository.GetRepository<MsgToolTaskCmd>().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<MsgToolTaskCmdDetail>().Query()
.Where(n => n.CMDID == model.CmdId && allCmdIds.Contains(n.PKID)).ToListAsync();
List<decimal> cmdIds = new List<decimal>();
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<MsgToolTaskCmdDetail>().BatchUpdateAsync(cmddetailList);
cmd.SENDNUM = cmddetailList.Where(n => n.UNENABLED != 1).Count();
await _crmRepository.GetRepository<MsgToolTaskCmd>().UpdateAsync(cmd, x => new
{
x.SENDNUM
});
return true;
}
/// <summary>
/// 获取命令是否能执行
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<bool> GetExecCmdEnable(SerachCmdEnableDto dto)
{
var cmd = await _crmRepository.GetRepository<MsgToolTaskCmd>().FirstOrDefaultAsync(n => n.PKID == dto.CmdId);
if (cmd == null)
{
throw new Exception("找不到该任务");
}
if (cmd.STATUS == MsgToolTaskCmdStatus.)
{
throw new Exception("该任务已执行");
}
var task = await _crmRepository.GetRepository<MsgToolTask>().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<MsgToolTaskCmd>()
.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<BAS_PARAMETER>().FirstOrDefaultAsync(n => n.PARAKEY == "MsgToolSetting");
var limitCount = 5;
if (settingStr != null)
{
var setting = JsonHelper.FromJson<MsgToolSetting>(settingStr.PARAVALUE);
limitCount = setting.TaskLimit;
}
if (hasPasstask.Count() > limitCount)
{
throw new Exception($"当天执行任务数量已经超过{limitCount}");
}
return true;
}
public async Task<MsgToolVersionModel> GetMsgToolVersion()
{
return await _cacheDomain.GetMsgToolVersion();
}
public async Task<bool> SetMsgToolVersion(MsgToolVersionModel model)
{
return await _cacheDomain.SetMsgToolVersion(model);
}
#region app相关接口
/// <summary>
/// 获取企微账户
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<List<WxWorkModel>> GetWxWorkUser(EidQueryDto model)
{
List<WxWorkModel> res = new List<WxWorkModel>();
var users = await _crmRepository.GetRepository<WW_HHUSER_EID>().Query().Where(x => x.EID == model.Eid).ToListAsync();
var hhusers = await _weworkRepository.GetRepository<WwHhuser>().Query()
.Where(x => users.Select(y => y.USERID + y.CORPID).Distinct().Contains(x.Userid + x.Corpid))
.ToListAsync();
var corpApps = await _weworkRepository.GetRepository<WwCorp>().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<Exinfo>(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<wwExtuserModel> GetOutWorkUser(OutExtuserQueryDto model)
{
wwExtuserModel res = new wwExtuserModel();
Dictionary<string, string> customTags = new Dictionary<string, string>();
var list = await GetExtUserList(model.CropId, model.UserId, res);
Dictionary<string, List<string>> diclist = new Dictionary<string, List<string>>();
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<string>() { item.cmonth });
}
}
}
res.YearMonthList = diclist;
res.DataList = list;
return res;
}
/// <summary>
/// 获取某个企业号下所有的企业标签
/// </summary>
/// <param name="corpid"></param>
/// <returns></returns>
private List<wwGroupTagView> GetGroupTagList(string corpid)
{
var list = _pcweworkRepository.GetRepository<ww_grouptag>().Query().Where(m => m.corpid == corpid).OrderBy(m => m.order).ToList();
List<wwGroupTagView> viewList = new List<wwGroupTagView>();
foreach (var item in list)
{
try
{
var info = JsonHelper.FromJson<List<wwGroupTagInfo>>(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<List<wwExtuserView>> GetExtUserList(string corpid, string userid, wwExtuserModel res)
{
Dictionary<string, string> customTags = new Dictionary<string, string>();
var hhuserQuery = _pcweworkRepository.GetRepository<PcWwHhuser>().Query().Where(n => n.corpid == corpid && n.userid == userid).ToList();
var extUserQuery = _pcweworkRepository.GetRepository<PcWwExtuser>().Query();
var userExtQuery = _pcweworkRepository.GetRepository<PcWwUserExtuser>().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<wwExtuserView>(sql, param.ToArray());
int xuhao = 0;
List<wwExtuserView> monthGroupBy = new List<wwExtuserView>();
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var item in dd)
{
item.tagInfos = new List<TagInfo>();
if (string.IsNullOrWhiteSpace(item.remark_corp_name))
{
item.remark_corp_name = "";
}
try//企业标签
{
var tag1 = JsonHelper.FromJson<List<TagInfo>>(item.tags_type1);
item.tagInfos.AddRange(tag1);
}
catch (Exception ex) { }
try//自定义标签
{
var tag2 = JsonHelper.FromJson<List<TagInfo>>(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相关接口
}
}