1623 lines
74 KiB
C#
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相关接口
|
|
}
|
|
} |