using Microsoft.Extensions.DependencyInjection; using MySqlConnector; using Newtonsoft.Json; using System.Reflection; using Zxd.Core.Domain.Dto.TodoItem; using Zxd.Entity.Action; namespace Zxd.Core.Domain { public class TodoItemDomain : ITodoItemDomain { private readonly IServiceProvider _serviceProvider; private readonly IBaseRepository _hgActionRepository; private readonly IBaseRepository _zxdRepository; private readonly IConfiguration _configuration; private readonly IDeptmentDomain _deptDomain; private readonly IBaseRepository _dncmsBaseRepository; private readonly SystemConfig _systemConfig; private readonly IEarlyWarningDomain _earlyWarningDomain; private readonly ICacheDomain _cacheDomain; public TodoItemDomain( IServiceProvider serviceProvider, IBaseRepository hgActionRepository, IBaseRepository zxdRepository, IConfiguration configuration, IDeptmentDomain deptDomain, IEarlyWarningDomain earlyWarningDomain, IBaseRepository dncmsBaseRepository, ICacheDomain cacheDomain) { _systemConfig = configuration.GetSection("SystemConfig").Get(); _serviceProvider = serviceProvider; _hgActionRepository = hgActionRepository; _zxdRepository = zxdRepository; _configuration = configuration; _deptDomain = deptDomain; _earlyWarningDomain = earlyWarningDomain; _dncmsBaseRepository = dncmsBaseRepository; _cacheDomain = cacheDomain; } public async Task> GetListNewAsync(GetListRequest request) { var depts = await _deptDomain.GetDeptments(); var tableFilter = ""; var filter = new List(); var ps = new List(); var setting = await _cacheDomain.GetValueParameter("ToDoItemSetting"); var sets = new List(); if (!string.IsNullOrWhiteSpace(setting)) { sets = JsonHelper.FromJson(setting).setting; } if (!string.IsNullOrEmpty(request.lineid)) { var lineids = GetIds(request.lineid); if (lineids.Count > 0) { filter.Add($"t1.deptid in ({string.Join(",", lineids)})"); } } if (request.eid.HasValue) { filter.Add($"t1.eid = @eid"); ps.Add(new MySqlParameter("eid", request.eid)); } else { if (request.deptid.HasValue) { tableFilter = $"{Environment.NewLine}JOIN employee_department_detail t3 on t3.eid = t1.eid"; filter.Add($"t3.department_id = @deptid"); filter.Add($"t3.is_deleted = 0"); ps.Add(new MySqlParameter("deptid", request.deptid)); } } if (!string.IsNullOrEmpty(request.resid)) { filter.Add($"(t1.resid = @resid or t1.umid = @resid)"); ps.Add(new MySqlParameter("resid", request.resid)); } if (request.customerid.HasValue) { filter.Add($"t1.customerid = @customerid"); ps.Add(new MySqlParameter("customerid", request.customerid)); } if (!string.IsNullOrEmpty(request.cname)) { filter.Add($"t1.Nickname like @cname"); ps.Add(new MySqlParameter("cname", $"%{request.cname}%")); } if (!string.IsNullOrEmpty(request.eventtypename)) { var eventids = GetIds(request.eventtypename); if (eventids.Count > 0) { filter.Add($"t1.neweventid in ({string.Join(",", eventids)})"); } } else { if (!string.IsNullOrEmpty(request.eventid)) { var eventids = GetIds(request.eventid); if (eventids.Count > 0) { filter.Add($"t1.neweventid in ({string.Join(",", eventids)})"); } } } if (!string.IsNullOrEmpty(request.eventmemo)) { filter.Add($"t1.Content like @eventmemo"); ps.Add(new MySqlParameter("eventmemo", $"%{request.eventmemo}%")); } if (request.noticetimeBegin.HasValue) { var dt = request.noticetimeBegin.GetValueOrDefault().Date; filter.Add($"t1.act_date >= @noticetimeBegin"); ps.Add(new MySqlParameter("noticetimeBegin", dt)); } if (request.noticetimeEnd.HasValue) { var dt = request.noticetimeEnd.GetValueOrDefault().Date.AddDays(1); filter.Add($"t1.act_date < @noticetimeEnd"); ps.Add(new MySqlParameter("noticetimeEnd", dt)); } if (request.isread.HasValue) { filter.Add($"t1.isread = {request.isread}"); } if (request.readtimeBegin.HasValue) { var dt = request.readtimeBegin.GetValueOrDefault().Date; filter.Add($"t1.readtime >= @readtimeBegin"); ps.Add(new MySqlParameter("readtimeBegin", dt)); } if (request.readtimeEnd.HasValue) { var dt = request.readtimeEnd.GetValueOrDefault().Date.AddDays(1); filter.Add($"t1.readtime < @readtimeEnd"); ps.Add(new MySqlParameter("readtimeEnd", dt)); } var where = ""; if (filter.Count > 0) { where = $"{Environment.NewLine}where {string.Join(" and ", filter)}"; } var tables = $@" ac_employee_todoitem t1{tableFilter}"; var fields = $@" t1.id, t1.deptid, t1.eid, t1.ename, t1.resid, t1.umid, t1.customerid, t1.Nickname cname, t1.eventid, t1.neweventid, t1.neweventname eventname, t1.Content eventmemo, t1.ctime noticetime, t1.eventtypename, t1.isread, t1.readtime, t1.appid, t1.appuserid, t1.sceneid"; var skip = (request.PageIndex - 1) * request.PageSize; var take = request.PageSize; using (var scope = _serviceProvider.CreateAsyncScope()) { var repository = scope.ServiceProvider.GetRequiredService>(); var sql = $"select count(1) from {tables}{where}"; var total = await repository.ExecuteSqlToCountLongAsync(sql, ps.ToArray()); sql = $"select {fields} from {tables}{where} order by t1.id desc limit {skip},{take}"; if (!string.IsNullOrEmpty(request.eventmemo))// 如果包含了模糊查找,那么就需要进行子查询,会快一点 { sql = $"select {fields} from ac_employee_todoitem t1 where t1.id in( select t1.id from {tables}{where} ) order by t1.id desc limit {skip},{take}"; } var items = await repository.ExecuteSqlToListAsync(sql, ps.ToArray()); foreach (var item in items) { //这里要关联Id而不是DepartmentId var dept = depts.Where(w => w.Id == item.deptid).FirstOrDefault(); if (dept != null) { item.deptname = dept.Title; } var set = sets.FirstOrDefault(x => x.neweventid == item.neweventid); if (set != null && !string.IsNullOrWhiteSpace(set.linkUrl)) { item.linkurl = GetContent(item, set.linkUrl); } } return new PageResult(request.PageIndex, request.PageSize, Convert.ToInt32(total), items); } } private string GetContent(TodoItemDto item, string linkUrl) { var content = linkUrl; Type type = typeof(TodoItemDto); PropertyInfo[] propertyInfo = type.GetProperties(); foreach (var property in propertyInfo) { var value = property.GetValue(item); var setValue = value == null ? "" : value.ToString(); var name = "{" + property.Name + "}"; if (name == "{act_date}" && content.Contains(name)) { content = content.Replace(name, Convert.ToDateTime(setValue).ToString("yyyy-MM-dd")); continue; } if (content.Contains(name)) { content = content.Replace(name, setValue); } } content = content.Replace("----", "-").Replace("---", "-").Replace("--", "-").Trim('-'); return content; } private List GetIds(string input) { var ids = new List(); var parts = input.Split(','); var t = typeof(T); if (t == typeof(int)) { foreach (var part in parts) { if (!int.TryParse(part, out int temp)) { throw new Exception("无效的输入"); } ids.Add((T)(object)temp); } } else { throw new Exception("无效的类型T"); } return ids; } public async Task> GetEventTypeSelectAsync(GetEventTypeSelectRequest request) { var items = new List(); var setting = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "ToDoItemSetting"); if (setting != null && !string.IsNullOrWhiteSpace(setting.PARAVALUE)) { var config = JsonConvert.DeserializeObject(setting.PARAVALUE); if (config != null && config.setting != null && config.setting.Count > 0) { if (!string.IsNullOrEmpty(request.eventid)) { var ids = GetIds(request.eventid); items.AddRange(config.setting.Where(w => ids.Contains(w.neweventid.GetValueOrDefault())).Select(o => new SelectItem(o.memo, o.neweventid))); } else { var groups = config.setting.GroupBy(g => new { g.remark, g.Sort }); groups = groups.OrderBy(n => n.Key.Sort); foreach (var group in groups) { items.Add(new SelectItem(group.Key.remark, string.Join(",", group.Select(o => o.neweventid.GetValueOrDefault())))); } } } } return items; } /// /// 修改已读 /// /// /// public async Task EditReadAsync(EditReadRequest request) { var model = await _hgActionRepository.GetRepository().FirstOrDefaultAsync(f => f.id == request.Id); if (model != null && model.isread != 1 && model.readtime.HasValue == false) { model.isread = 1; model.readtime = DateTime.Now; await _hgActionRepository.GetRepository().UpdateAsync(model); } return "修改成功"; } /// /// 重要线索消息通知 /// /// public async Task NoticeAsync() { try { var now = DateTime.Now; if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday) return; //获取参数配置中的消息可通知时间段 var todoItemNotice = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "ToDoItemNotice"); if (todoItemNotice != null && !string.IsNullOrWhiteSpace(todoItemNotice.PARAVALUE)) { var noticeDto = JsonConvert.DeserializeObject(todoItemNotice.PARAVALUE); if (!noticeDto.IsNotice) return; DateTime.TryParse($"{now.Date.ToString("yyyy-MM-dd")} {noticeDto.StartTime}", out DateTime startTime); DateTime.TryParse($"{now.Date.ToString("yyyy-MM-dd")} {noticeDto.EndTime}", out DateTime endTime); if (now >= startTime && now <= endTime) { //获取重要线索 var todoItems = await _hgActionRepository.GetRepository().Query() .Where(x => x.ctime >= now.Date && x.isread == 0) .GroupBy(x => new { x.eid, x.deptid }) .Select(x => new { Eid = x.Key.eid, DeptId = x.Key.deptid, Items = x.Select(y => y.eventtypename), Count = x.Count() }) .ToListAsync(); //企微应用的ID var weworkAgents = await _dncmsBaseRepository.GetRepository().Query().Where(x => x.name == "客服达量通知").ToListAsync(); //获取员工的信息 var weworks = await _dncmsBaseRepository.GetRepository().Query().ToListAsync(); foreach (var todoItem in todoItems) { var weworkUsers = weworks.Where(x => x.eid == todoItem.Eid && x.deptid == todoItem.DeptId); if (!weworkUsers.Any()) continue; //重要线索列表页路径 var app = _systemConfig.Apps.Where(x => x.Deptids.Contains(weworkUsers.FirstOrDefault().deptid.Value)).FirstOrDefault(); var toDoItemListUrl = $"{app?.CrmUrl}Csvr/ToDoItem/ImportantNew?urlTitle=我的重要线索客户"; var message = $"有{todoItem.Count}条重要线索未读 {now},【点击更多】"; var items = todoItem.Items.GroupBy(x => x).Select(x => new { Name = x.Key, Count = x.Count() }); foreach (var item in items) { message += $"\n{item.Name}:{item.Count}条"; } foreach (var weworkUser in weworkUsers) { var weworkAgent = weworkAgents.FirstOrDefault(x => x.appid == weworkUser.appid); if (weworkAgent == null) continue; await _earlyWarningDomain.WeworkSend(weworkUser.userid, weworkUser.appid, weworkAgent.agentid.ToString(), message); //await _earlyWarningDomain.WeworkSend("chenshidong", "ww89347c2378b6e050", "1000028", message); } } } } } catch (Exception ex) { Log.Error($"重要线索消息通知报错", ex); } } } public class ToDoItemSetting { public int delaytime { get; set; } public List setting { get; set; } } public class ToDoItemSettingItem { public int? eventid { get; set; } public string remark { get; set; } public string memo { get; set; } public string template { get; set; } public bool? allNotice { get; set; } public bool? firstCtime { get; set; } public bool? is_wework { get; set; } public bool? is_mobile { get; set; } public bool? is_belong { get; set; } public List scenetype { get; set; } public List sceneid { get; set; } public List deptids { get; set; } public int? neweventid { get; set; } public int? Sort { get; set; } public string? linkUrl { get; set; } } }