using MySqlConnector; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Zxd.Crm.Domain.Dto.AssignRule; using Zxd.Crm.Domain.Impl.AssignRule; using Zxd.Entity.Dncms; namespace Zxd.Crm.Domain { /// /// 客服分配规则 /// public class AssignRuleDomain : IAssignRuleDomain { private readonly IBaseRepository _cmsRepository; private readonly IMapper _mapper; public AssignRuleDomain(IBaseRepository cmsRepository, IMapper mapper) { _cmsRepository = cmsRepository; _mapper = mapper; } /// /// 列表 /// /// /// public async Task> GetList(AssignRuleQueryDto dto) { var filter = new List(); var ps = new List(); var tableFilter = ""; if (!string.IsNullOrWhiteSpace(dto.allsgids)) { filter.Add($" t1.salegroupid in( {dto.allsgids} )"); } if (dto.UserId.HasValue) { filter.Add($" t1.inneruserid = @userid "); ps.Add(new MySqlParameter("userid", dto.UserId)); } if (dto.sgid.HasValue) { filter.Add($" t1.salegroupid = @sgid"); ps.Add(new MySqlParameter("sgid", dto.sgid)); } if (!string.IsNullOrWhiteSpace(dto.name)) { filter.Add($" (t2.employee_name like @cname or t1.eid like @cname)"); ps.Add(new MySqlParameter("cname", $"%{dto.name}%")); } if (dto.departmentId.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", dto.departmentId)); } if (dto.Level.HasValue) { filter.Add($" t1.levelno = @level"); ps.Add(new MySqlParameter("level", dto.Level)); } if (dto.isvalid.HasValue) { filter.Add($" t1.isvalid = @isvalid"); ps.Add(new MySqlParameter("isvalid", dto.isvalid)); } var weworkUserJoinSql = " left join"; if (!string.IsNullOrWhiteSpace(dto.AppUserId)) { weworkUserJoinSql = " join "; filter.Add($" b.userid = @AppUserId"); ps.Add(new MySqlParameter("AppUserId", dto.AppUserId)); } if (!string.IsNullOrWhiteSpace(dto.NickName)) { weworkUserJoinSql = " join "; filter.Add($" b.name like @NickName"); ps.Add(new MySqlParameter("NickName", $"%{dto.NickName}%")); } if (!string.IsNullOrWhiteSpace(dto.ResId)) { weworkUserJoinSql = " join "; filter.Add($" b.ResId = @ResId"); ps.Add(new MySqlParameter("ResId", dto.ResId)); } var where = ""; if (filter.Count > 0) { where = $"{Environment.NewLine}where {string.Join(" and ", filter)}"; } var fields = " t1.*,we.name as AppName,b.name as nickName,b.resid as Phone "; var tables = $@"AssignRules t1 {tableFilter} join db_company_base_conf.employee t2 on t1.eid =t2.employee_id left join Wework we on t1.appid = we.appid {weworkUserJoinSql} WeworkUser as b on t1.appid=b.appid and t1.userid=b.userid "; var sql = $"select count(1) from {tables}{where}"; var total = await _cmsRepository.ExecuteSqlToCountLongAsync(sql, ps.ToArray()); var skip = (dto.PageIndex - 1) * dto.PageSize; var take = dto.PageSize; sql = $"select {fields} from {tables}{where} order by t1.id desc limit {skip},{take}"; var res = await _cmsRepository.ExecuteSqlToListAsync(sql, ps.ToArray()); foreach (var item in res) { item.nickName = System.Web.HttpUtility.UrlDecode(item.nickName, System.Text.Encoding.UTF8); } return new PageResult(dto.PageIndex, dto.PageSize, Convert.ToInt32(total), res); } /// /// 创建编辑 /// /// /// public async Task Create(List ruleList) { //校验 todo using var transaction = await _cmsRepository.BeginTransactionAsync(); var group = ruleList.GroupBy(n => new { n.salegroupid, n.eid }) .Select(n => new { n.Key.salegroupid, n.Key.eid, count = n.Count() }).ToList(); if (group.Exists(n => n.count > 1)) { throw new Exception($"同个规则组不能存在多条相同工号的记录,重复工号为【{string.Join(",", group.Where(n => n.count > 1).Select(n => n.eid))}】"); } var eids = ruleList.Select(n => n.eid).Distinct().ToList(); var gid = ruleList.FirstOrDefault().salegroupid; var dbList = await _cmsRepository.GetRepository().Query().Where(n => n.salegroupid == gid && eids.Contains(n.eid)).ToListAsync(); foreach (var rule in ruleList) { if (dbList.Exists(n => n.eid == rule.eid && n.salegroupid == gid)) { throw new Exception($"同个规则组不能存在多条相同工号的记录,重复工号为【{rule.eid}】"); } var dbassign = _cmsRepository.GetRepository().Query().FirstOrDefault(n => n.eid == rule.eid && n.salegroupid == rule.salegroupid); if (dbassign == null) { var info = new Assign() { eid = rule.eid, salegroupid = rule.salegroupid.Value, allocations = 0, quantity = 0, todayquantity = 0, tgallocations = 0, tgtodayallocations = 0, tgquantity = 0 }; await _cmsRepository.GetRepository().InsertAsync(info); } AssignRules newrule = new AssignRules { eid = rule.eid, salegroupid = rule.salegroupid, appid = rule.appid, userid = rule.userid, uname = rule.uname, rate = rule.rate, num = rule.num, islimit = rule.islimit, isvalid = rule.isvalid, levelno = rule.levelno, crmdeptid = rule.crmdeptid, deptrate = rule.deptrate, inneruserid = rule.inneruserid, ctime = DateTime.Now, utime = DateTime.Now, }; await _cmsRepository.GetRepository().InsertAsync(newrule); } await transaction.CommitAsync(); return true; } /// /// 上下线 /// /// /// public async Task UpOrDowmAssignRule(AssignRuleUpOrDowmDto dto) { var ruleList = await _cmsRepository.GetRepository().Query().Where(n => dto.ids.Contains(n.id)).ToListAsync(); if (dto.type == 1) { foreach (var rule in ruleList) { rule.isvalid = dto.isvalid; rule.startTime = dto.startTime; rule.endTime = dto.endTime; rule.utime = DateTime.Now; } } else { foreach (var rule in ruleList) { if (dto.islimit.HasValue) { rule.islimit = dto.islimit; } if (dto.num.HasValue) { rule.num = dto.num; } if (dto.levelno.HasValue) { rule.levelno = dto.levelno; } rule.utime = DateTime.Now; } } await _cmsRepository.GetRepository().BatchUpdateAsync(ruleList); return true; } public async Task Delete(List ids) { var ruleList = await _cmsRepository.GetRepository().Query().Where(n => ids.Contains(n.id)).ToListAsync(); await _cmsRepository.GetRepository().BatchDeleteAsync(ruleList); return true; } public async Task> GetNotSetAssignList(AssignRuleNotSetQueryDto dto) { if (!dto.sgid.HasValue) { return new List(); } var query = await _cmsRepository.GetRepository().Query().Where(n => n.salegroupid == dto.sgid).Select(n => n.eid).ToListAsync(); var wheresql = $" where a.eid >0 and r.eid is null and a.assignstatus=1 and te.is_deleted =0"; var sql = @$" select a.id,a.appid,a.userid,a.eid,b.avatar,te.employee_name as Uname,b.name as NickName,we.name as AppName from WeworkUser2Eid as a left join Wework we on a.appid = we.appid left join WeworkUser as b on a.appid=b.appid and a.userid=b.userid JOIN db_company_base_conf.employee AS te ON a.eid=te.employee_id LEFT join AssignRules r on a.eid = r.eid and salegroupid = @salegroupid "; var ps = new List { new MySqlParameter("salegroupid",dto.sgid) }; if (!string.IsNullOrWhiteSpace(dto.uname)) { wheresql += $" and (te.employee_name like @cname or te.employee_id like @cname)"; ps.Add(new MySqlParameter("cname", $"%{dto.uname}%")); } if (dto.departmentId.HasValue) { sql += $" join employee_department_detail em on a.eid = em.eid and em.department_id = @departmentid "; ps.Add(new MySqlParameter("departmentid", dto.departmentId)); } if (!string.IsNullOrWhiteSpace(dto.deptIds)) { wheresql += $" and a.deptid in ({dto.deptIds})"; } sql += wheresql; sql += " order by a.eid desc"; var res = await _cmsRepository.ExecuteSqlToListAsync(sql, ps.ToArray()); return res; } /// /// 自动上下线 /// /// public async Task AutoUpAssignRule() { var nowTime = DateTime.Now; var upList = await _cmsRepository.GetRepository().Query().Where(n => n.isvalid == 0 && n.startTime <= nowTime && (!n.endTime.HasValue || (n.endTime.HasValue && n.endTime >= nowTime))).ToListAsync(); foreach (var up in upList) { up.isvalid = 1; } await _cmsRepository.GetRepository().BatchUpdateAsync(upList, x => new { x.isvalid }); var downList = await _cmsRepository.GetRepository().Query().Where(n => n.isvalid == 1 && n.endTime.HasValue && n.endTime <= nowTime).ToListAsync(); foreach (var up in downList) { up.isvalid = 0; } await _cmsRepository.GetRepository().BatchUpdateAsync(downList, x => new { x.isvalid }); } } }