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 });
}
}
}