|
@@ -20,6 +20,8 @@ using OASystem.Domain.ViewModels.CRM;
|
|
|
using OASystem.Domain.ViewModels.JuHeExchangeRate;
|
|
|
using OASystem.Domain.ViewModels.QiYeWeChat;
|
|
|
using OASystem.Infrastructure.Tools;
|
|
|
+using OASystem.RedisRepository;
|
|
|
+using OASystem.RedisRepository.RedisAsyncHelper;
|
|
|
using SqlSugar;
|
|
|
using System;
|
|
|
using System.Collections;
|
|
@@ -33,18 +35,263 @@ using System.Runtime.Intrinsics.Arm;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Xml.Linq;
|
|
|
+using System.Runtime.Serialization;
|
|
|
using static Google.Protobuf.Reflection.SourceCodeInfo.Types;
|
|
|
using static OASystem.Domain.Dtos.CRM.NewClientDataQueryDto;
|
|
|
|
|
|
namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// 客户资料仓储类
|
|
|
+ /// </summary>
|
|
|
public class NewClientDataRepository : BaseRepository<Crm_NewClientData, NewClientDataView>
|
|
|
{
|
|
|
private readonly IMapper _mapper;
|
|
|
+ private readonly IRedisHelper _redisHelper;
|
|
|
+
|
|
|
public NewClientDataRepository(SqlSugarClient sqlSugar, IMapper mapper) :
|
|
|
base(sqlSugar)
|
|
|
{
|
|
|
_mapper = mapper;
|
|
|
+ _redisHelper = RedisFactory.CreateRedisRepository();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 下拉框数据模型
|
|
|
+ /// </summary>
|
|
|
+ [Serializable]
|
|
|
+ public class DropdownItem
|
|
|
+ {
|
|
|
+ public int Id { get; set; }
|
|
|
+ public string Name { get; set; }
|
|
|
+ public string Remark { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 下拉框数据缓存模型
|
|
|
+ /// </summary>
|
|
|
+ [Serializable]
|
|
|
+ public class DropdownData
|
|
|
+ {
|
|
|
+ public List<DropdownItem> Users { get; set; } = new List<DropdownItem>();
|
|
|
+ public List<DropdownItem> Province { get; set; } = new List<DropdownItem>();
|
|
|
+ public List<DropdownItem> Level { get; set; } = new List<DropdownItem>();
|
|
|
+ public List<DropdownItem> CustomerClass { get; set; } = new List<DropdownItem>();
|
|
|
+ public List<DropdownItem> ServiceClass { get; set; } = new List<DropdownItem>();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取缓存的下拉框数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="operationUserId">操作用户ID</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<DropdownData> GetCachedDropdownDataAsync(int operationUserId)
|
|
|
+ {
|
|
|
+ var cacheKey = $"NewClientData_Dropdown_{operationUserId}";
|
|
|
+ var cachedData = await _redisHelper.StringGetAsync<DropdownData>(cacheKey);
|
|
|
+
|
|
|
+ if (cachedData != null)
|
|
|
+ {
|
|
|
+ return cachedData;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 缓存未命中,从数据库获取
|
|
|
+ var setDatas = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.IsDel == 0).ToList();
|
|
|
+
|
|
|
+ var dropdownData = new DropdownData();
|
|
|
+
|
|
|
+ //负责人下拉框
|
|
|
+ dropdownData.Users = GetNewExistClient(operationUserId)
|
|
|
+ .Select(x => new DropdownItem { Id = x.Id, Name = x.CnName })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ //省域数据
|
|
|
+ dropdownData.Province = setDatas
|
|
|
+ .Where(u => u.STid == 42)
|
|
|
+ .Select(x => new DropdownItem { Id = x.Id, Name = x.Name })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ //客户级别数据
|
|
|
+ dropdownData.Level = setDatas
|
|
|
+ .Where(u => u.STid == 33)
|
|
|
+ .Select(x => new DropdownItem { Id = x.Id, Name = x.Name })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ //客户类别
|
|
|
+ var customerClassList = new List<DropdownItem>();
|
|
|
+ List<Sys_SetData> CustomerClass = setDatas
|
|
|
+ .Where(u => u.STid == 37 && u.IsDel == 0)
|
|
|
+ .ToList();
|
|
|
+ foreach (Sys_SetData item in CustomerClass)
|
|
|
+ {
|
|
|
+ customerClassList.Add(new DropdownItem
|
|
|
+ {
|
|
|
+ Id = item.Id,
|
|
|
+ Name = item.Name,
|
|
|
+ Remark = item.Remark
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按ID排序客户类别
|
|
|
+ dropdownData.CustomerClass = customerClassList.OrderBy(x => x.Id).ToList();
|
|
|
+
|
|
|
+ //业务分类
|
|
|
+ dropdownData.ServiceClass = setDatas
|
|
|
+ .Where(u => u.STid == 36)
|
|
|
+ .Select(x => new DropdownItem { Id = x.Id, Name = x.Name })
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ // 缓存30分钟
|
|
|
+ await _redisHelper.StringSetAsync(cacheKey, dropdownData, TimeSpan.FromMinutes(30));
|
|
|
+
|
|
|
+ return dropdownData;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 可序列化的关联用户信息
|
|
|
+ /// </summary>
|
|
|
+ [Serializable]
|
|
|
+ public class SerializableAscribedUser
|
|
|
+ {
|
|
|
+ public int UserId { get; set; }
|
|
|
+ public string CnName { get; set; }
|
|
|
+ public int NewClientDataId { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 可序列化的关联部门信息
|
|
|
+ /// </summary>
|
|
|
+ [Serializable]
|
|
|
+ public class SerializableAscribedDepartment
|
|
|
+ {
|
|
|
+ public int Id { get; set; }
|
|
|
+ public string Name { get; set; }
|
|
|
+ public int NewClientDataId { get; set; }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取缓存的客户资料关联信息
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="clientIds">客户ID列表</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<(List<AscribedUser> ascribedUsers, List<AscribedDepartment> ascribedDepartments)> GetCachedClientRelationsAsync(List<int> clientIds)
|
|
|
+ {
|
|
|
+ if (clientIds == null || !clientIds.Any())
|
|
|
+ return (new List<AscribedUser>(), new List<AscribedDepartment>());
|
|
|
+
|
|
|
+ var cacheKey = $"NewClientData_Relations_{string.Join("_", clientIds.OrderBy(x => x))}";
|
|
|
+ var cachedData = await _redisHelper.StringGetAsync<(List<SerializableAscribedUser>, List<SerializableAscribedDepartment>)>(cacheKey);
|
|
|
+
|
|
|
+ if (cachedData.Item1 != null && cachedData.Item2 != null)
|
|
|
+ {
|
|
|
+ // 转换为原始类型
|
|
|
+ var ascribedUsers = cachedData.Item1.Select(x => new AscribedUser
|
|
|
+ {
|
|
|
+ UserId = x.UserId,
|
|
|
+ CnName = x.CnName,
|
|
|
+ NewClientDataId = x.NewClientDataId
|
|
|
+ }).ToList();
|
|
|
+
|
|
|
+ var ascribedDepartments = cachedData.Item2.Select(x => new AscribedDepartment
|
|
|
+ {
|
|
|
+ Id = x.Id,
|
|
|
+ Name = x.Name,
|
|
|
+ NewClientDataId = x.NewClientDataId
|
|
|
+ }).ToList();
|
|
|
+
|
|
|
+ return (ascribedUsers, ascribedDepartments);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量查询关联信息 - 使用同步方法避免数据读取器问题
|
|
|
+ var queriedUsers = _sqlSugar.SqlQueryable<AscribedUser>(
|
|
|
+ "select u1.UsersId as UserId ,u2.CnName,u1.NewClientDataId from Crm_ClientDataAndUser u1,Sys_Users u2 where u1.UsersId=u2.Id and NewClientDataId in (" + string.Join(",", clientIds) + ") AND u1.ISDEL = 0")
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ var queriedDepartments = _sqlSugar.SqlQueryable<AscribedDepartment>(
|
|
|
+ "select d2.Id,d2.Name,d1.NewClientDataId from Crm_ClientDataAndBusiness d1,Sys_SetData d2 where d1.SetDataId=d2.Id and NewClientDataId in (" + string.Join(",", clientIds) + ") AND d1.ISDEL = 0")
|
|
|
+ .ToList();
|
|
|
+
|
|
|
+ // 转换为可序列化类型进行缓存
|
|
|
+ var serializableUsers = queriedUsers.Select(x => new SerializableAscribedUser
|
|
|
+ {
|
|
|
+ UserId = x.UserId,
|
|
|
+ CnName = x.CnName,
|
|
|
+ NewClientDataId = x.NewClientDataId
|
|
|
+ }).ToList();
|
|
|
+
|
|
|
+ var serializableDepartments = queriedDepartments.Select(x => new SerializableAscribedDepartment
|
|
|
+ {
|
|
|
+ Id = x.Id,
|
|
|
+ Name = x.Name,
|
|
|
+ NewClientDataId = x.NewClientDataId
|
|
|
+ }).ToList();
|
|
|
+
|
|
|
+ var result = (serializableUsers, serializableDepartments);
|
|
|
+
|
|
|
+ // 缓存10分钟
|
|
|
+ await _redisHelper.StringSetAsync(cacheKey, result, TimeSpan.FromMinutes(10));
|
|
|
+
|
|
|
+ return (queriedUsers, queriedDepartments);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 获取缓存的省域数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="range">省域范围</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task<List<int>> GetCachedRangeSetDataAsync(int range)
|
|
|
+ {
|
|
|
+ if (range == 0) return new List<int>();
|
|
|
+
|
|
|
+ var cacheKey = $"NewClientData_Range_{range}";
|
|
|
+ var cachedData = await _redisHelper.StringGetAsync<List<int>>(cacheKey);
|
|
|
+
|
|
|
+ if (cachedData != null)
|
|
|
+ {
|
|
|
+ return cachedData;
|
|
|
+ }
|
|
|
+
|
|
|
+ string setDataSql = "select * from Sys_SetData where STid = 33 and isdel = 0 ";
|
|
|
+ switch (range)
|
|
|
+ {
|
|
|
+ case 419:
|
|
|
+ setDataSql += " and (Name like '%四%川%' or Name like '%成%都%')";
|
|
|
+ break;
|
|
|
+ case 421:
|
|
|
+ setDataSql += " and (Name like '%贵%州%' or Name like '%贵%阳%')";
|
|
|
+ break;
|
|
|
+ case 420:
|
|
|
+ setDataSql += " and (Name like '%云%南%' or Name like '%昆%明%')";
|
|
|
+ break;
|
|
|
+ case 423:
|
|
|
+ setDataSql += " and (Name like '%重庆%')";
|
|
|
+ break;
|
|
|
+ case 422:
|
|
|
+ setDataSql += " and (Name like '%西%藏%' or Name like '%拉%萨%')";
|
|
|
+ break;
|
|
|
+ case 578:
|
|
|
+ setDataSql += " and (Name like '%青%海%' or Name like '%西%宁%')";
|
|
|
+ break;
|
|
|
+ case 605:
|
|
|
+ setDataSql += " and (Name like '%陕%西%' or Name like '%西%安%')";
|
|
|
+ break;
|
|
|
+ case 606:
|
|
|
+ setDataSql += " and (Name like '%宁%夏%' or Name like '%银%川%')";
|
|
|
+ break;
|
|
|
+ case 625:
|
|
|
+ setDataSql += " and (Name like '%甘%肃%' or Name like '%兰%州%')";
|
|
|
+ break;
|
|
|
+ case 634:
|
|
|
+ setDataSql += " and (Name like '%新%疆%' or Name like '%乌%鲁%木%齐%')";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ var rangeSetDataList = _sqlSugar.SqlQueryable<Sys_SetData>(setDataSql).Select(x => x.Id).ToList();
|
|
|
+
|
|
|
+ // 缓存1小时
|
|
|
+ await _redisHelper.StringSetAsync(cacheKey, rangeSetDataList, TimeSpan.FromHours(1));
|
|
|
+
|
|
|
+ return rangeSetDataList;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -213,7 +460,7 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 客户资料初识初始化
|
|
|
+ /// 客户资料查询 - 优化版本
|
|
|
/// </summary>
|
|
|
/// <param name="dto"></param>
|
|
|
/// <returns></returns>
|
|
@@ -225,238 +472,165 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
int pageIndex = dto.PageIndex, pageSize = dto.PageSize;
|
|
|
try
|
|
|
{
|
|
|
- #region 交集
|
|
|
- List<int> NewClientDataId1 = new List<int>();
|
|
|
- List<int> NewClientDataId2 = new List<int>();
|
|
|
+ // 并行获取缓存数据
|
|
|
+ var rangeSetDataTask = GetCachedRangeSetDataAsync(dto.Range);
|
|
|
+ var dropdownDataTask = GetCachedDropdownDataAsync(dto.OperationUserId);
|
|
|
+
|
|
|
+ #region 交集计算优化
|
|
|
+ List<int> intList = new List<int>();
|
|
|
int state = 0;
|
|
|
|
|
|
- #region 负责人
|
|
|
- if (dto.OperationUserId != 21)
|
|
|
+ // 负责人筛选
|
|
|
+ if (dto.OperationUserId != 21 && string.IsNullOrWhiteSpace(dto.Userid))
|
|
|
{
|
|
|
- if (string.IsNullOrWhiteSpace(dto.Userid))
|
|
|
- {
|
|
|
- dto.Userid = dto.OperationUserId.ToString();
|
|
|
- }
|
|
|
+ dto.Userid = dto.OperationUserId.ToString();
|
|
|
}
|
|
|
|
|
|
+ List<int> NewClientDataId1 = new List<int>();
|
|
|
+ List<int> NewClientDataId2 = new List<int>();
|
|
|
+
|
|
|
if (!string.IsNullOrWhiteSpace(dto.Userid))
|
|
|
{
|
|
|
- string sql = string.Format(@"select u1.UsersId as UserId,u2.CnName,u1.NewClientDataId from Crm_ClientDataAndUser u1,Sys_Users u2 where u1.UsersId=u2.Id and u1.UsersId in ({0}) and u1.IsDel = 0", dto.Userid);
|
|
|
- List<AscribedUser> ascribedUsers = await _sqlSugar.SqlQueryable<AscribedUser>(sql).ToListAsync();
|
|
|
- if (ascribedUsers.Count != 0)
|
|
|
- {
|
|
|
- foreach (var ascribedUser in ascribedUsers)
|
|
|
- {
|
|
|
- if (ascribedUser.NewClientDataId != 0)
|
|
|
- {
|
|
|
- NewClientDataId1.Add(ascribedUser.NewClientDataId);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- result = new Result() { Code = -1, Msg = "暂无数据" };
|
|
|
- }
|
|
|
+ string sql = string.Format(@"
|
|
|
+ select u1.NewClientDataId
|
|
|
+ from Crm_ClientDataAndUser u1
|
|
|
+ where u1.IsDel = 0 AND u1.UsersId in ({0})
|
|
|
+ ", dto.Userid);
|
|
|
+ NewClientDataId1 = _sqlSugar.Ado.SqlQuery<int>(sql).ToList();
|
|
|
state = -1;
|
|
|
}
|
|
|
- #endregion
|
|
|
|
|
|
- #region 业务归属
|
|
|
+ // 业务归属筛选
|
|
|
if (!string.IsNullOrWhiteSpace(dto.Business))
|
|
|
{
|
|
|
- string sql = string.Format(@"select d2.Id,d2.Name,d1.NewClientDataId from Crm_ClientDataAndBusiness d1,Sys_SetData d2 where d1.SetDataId=d2.Id and d1.SetDataId in ({0}) and d1.isdel = 0", dto.Business);
|
|
|
- List<AscribedDepartment> AscribedDepartment = await _sqlSugar.SqlQueryable<AscribedDepartment>(sql).ToListAsync();
|
|
|
- if (AscribedDepartment.Count != 0)
|
|
|
- {
|
|
|
- foreach (var item in AscribedDepartment)
|
|
|
- {
|
|
|
- if (item.NewClientDataId != 0)
|
|
|
- {
|
|
|
- NewClientDataId2.Add(item.NewClientDataId);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- result = new Result() { Code = -1, Msg = "暂无数据" };
|
|
|
- }
|
|
|
+ string sql = string.Format(@"
|
|
|
+ select d1.NewClientDataId
|
|
|
+ from Crm_ClientDataAndBusiness d1
|
|
|
+ where d1.SetDataId in ({0}) and d1.isdel = 0
|
|
|
+ ", dto.Business);
|
|
|
+ NewClientDataId2 = _sqlSugar.Ado.SqlQuery<int>(sql).ToList();
|
|
|
state = -1;
|
|
|
}
|
|
|
- #endregion
|
|
|
-
|
|
|
- List<int> intList = new List<int>();
|
|
|
|
|
|
+ // 交集计算
|
|
|
if (NewClientDataId1.Count != 0 && NewClientDataId2.Count != 0)
|
|
|
{
|
|
|
intList = NewClientDataId1.Intersect(NewClientDataId2).ToList();
|
|
|
-
|
|
|
}
|
|
|
else if (NewClientDataId1.Count != 0)
|
|
|
{
|
|
|
intList = NewClientDataId1;
|
|
|
}
|
|
|
- else if (NewClientDataId2.Count != 0)
|
|
|
+ else if (NewClientDataId2.Count != 0 && dto.OperationUserId == 21)
|
|
|
{
|
|
|
- if (dto.OperationUserId == 21)
|
|
|
- {
|
|
|
- intList = NewClientDataId2;
|
|
|
- }
|
|
|
+ intList = NewClientDataId2;
|
|
|
}
|
|
|
|
|
|
- if (state == -1)
|
|
|
+ if (state == -1 && intList.Count < 1)
|
|
|
{
|
|
|
- if (intList.Count < 1) intList.Add(-1);
|
|
|
+ intList.Add(-1);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
#endregion
|
|
|
|
|
|
- #region 省域条件
|
|
|
- var rangeSetDataList = new List<int>();
|
|
|
- if (dto.Range != 0)
|
|
|
- {
|
|
|
- string setDataSql = "select * from Sys_SetData where STid = 33 and isdel = 0 ";
|
|
|
- switch (dto.Range)
|
|
|
- {
|
|
|
- case 419:
|
|
|
- setDataSql += " and (Name like '%四%川%' or Name like '%成%都%')";
|
|
|
- break;
|
|
|
- case 421:
|
|
|
- setDataSql += " and (Name like '%贵%州%' or Name like '%贵%阳%')";
|
|
|
- break;
|
|
|
- case 420:
|
|
|
- setDataSql += " and (Name like '%云%南%' or Name like '%昆%明%')";
|
|
|
- break;
|
|
|
- case 423:
|
|
|
- setDataSql += " and (Name like '%重庆%')";
|
|
|
- break;
|
|
|
- case 422:
|
|
|
- setDataSql += " and (Name like '%西%藏%' or Name like '%拉%萨%')";
|
|
|
- break;
|
|
|
- case 578:
|
|
|
- setDataSql += " and (Name like '%青%海%' or Name like '%西%宁%')";
|
|
|
- break;
|
|
|
- case 605:
|
|
|
- setDataSql += " and (Name like '%陕%西%' or Name like '%西%安%')";
|
|
|
- break;
|
|
|
- case 606:
|
|
|
- setDataSql += " and (Name like '%宁%夏%' or Name like '%银%川%')";
|
|
|
- break;
|
|
|
- case 625:
|
|
|
- setDataSql += " and (Name like '%甘%肃%' or Name like '%兰%州%')";
|
|
|
- break;
|
|
|
- case 634:
|
|
|
- setDataSql += " and (Name like '%新%疆%' or Name like '%乌%鲁%木%齐%')";
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- rangeSetDataList = _sqlSugar.SqlQueryable<Sys_SetData>(setDataSql).Select(x => x.Id).ToList();
|
|
|
+ // 等待缓存数据
|
|
|
+ var rangeSetDataList = await rangeSetDataTask;
|
|
|
+ var dropdownData = await dropdownDataTask;
|
|
|
|
|
|
- }
|
|
|
- #endregion
|
|
|
-
|
|
|
- var NewClientDataView = new List<NewClientDataView>();
|
|
|
- var count = 0;
|
|
|
+ #region 模糊搜索优化
|
|
|
+ var searchDataIds = new List<int>();
|
|
|
+ var isSelectSearch = false;
|
|
|
string contact = dto.Contact, location = dto.Location, clientDto = dto.Client;
|
|
|
|
|
|
- var isSelectSearch = false;
|
|
|
- var searchDataIds = new List<int>();
|
|
|
if (string.IsNullOrEmpty(contact) || string.IsNullOrEmpty(location) || string.IsNullOrEmpty(clientDto))
|
|
|
{
|
|
|
isSelectSearch = true;
|
|
|
- var searchClientDatas = await _sqlSugar.Queryable<Crm_NewClientData>()
|
|
|
- .Where(x => x.IsDel == 0)
|
|
|
- .Select(x => new Crm_NewClientData() { Id = x.Id, Client = x.Client, Location = x.Location, Contact = x.Contact })
|
|
|
- .ToListAsync();
|
|
|
-
|
|
|
- foreach (var item in searchClientDatas) EncryptionProcessor.DecryptProperties(item);
|
|
|
-
|
|
|
- if (dto.PortType == 1)
|
|
|
+
|
|
|
+ // 使用缓存键进行搜索
|
|
|
+ var searchCacheKey = $"NewClientData_Search_{contact}_{location}_{clientDto}_{dto.PortType}";
|
|
|
+ var cachedSearchIds = await _redisHelper.StringGetAsync<List<int>>(searchCacheKey);
|
|
|
+
|
|
|
+ if (cachedSearchIds != null)
|
|
|
{
|
|
|
- searchDataIds = searchClientDatas
|
|
|
- .WhereIF(!string.IsNullOrEmpty(contact), x => !string.IsNullOrEmpty(x.Contact) && x.Contact.Contains(contact)) //联系人条件
|
|
|
- .WhereIF(!string.IsNullOrEmpty(location), x => !string.IsNullOrEmpty(x.Location) && x.Location.Contains(location)) //地区条件
|
|
|
- .WhereIF(!string.IsNullOrEmpty(clientDto), x => !string.IsNullOrEmpty(x.Client) && x.Client.Contains(clientDto)) //单位条件
|
|
|
- .Select(x => x.Id)
|
|
|
- .ToList();
|
|
|
+ searchDataIds = cachedSearchIds;
|
|
|
}
|
|
|
- else if (dto.PortType == 2 || dto.PortType == 3)
|
|
|
+ else
|
|
|
{
|
|
|
- searchDataIds = searchClientDatas
|
|
|
- .Where(x => (!string.IsNullOrEmpty(x.Contact) && x.Contact.Contains(clientDto)) ||
|
|
|
- (!string.IsNullOrEmpty(x.Location) && x.Location.Contains(clientDto)) ||
|
|
|
- (!string.IsNullOrEmpty(x.Client) && x.Client.Contains(clientDto)))
|
|
|
- .Select(x => x.Id)
|
|
|
- .ToList();
|
|
|
- }
|
|
|
+ var searchClientDatas = await _sqlSugar.Queryable<Crm_NewClientData>()
|
|
|
+ .Where(x => x.IsDel == 0)
|
|
|
+ .Select(x => new Crm_NewClientData() { Id = x.Id, Client = x.Client, Location = x.Location, Contact = x.Contact })
|
|
|
+ .ToListAsync();
|
|
|
|
|
|
- if (searchDataIds.Count < 1) searchDataIds.Add(0);
|
|
|
+ // 批量解密
|
|
|
+ foreach (var item in searchClientDatas)
|
|
|
+ {
|
|
|
+ EncryptionProcessor.DecryptProperties(item);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dto.PortType == 1)
|
|
|
+ {
|
|
|
+ searchDataIds = searchClientDatas
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(contact), x => !string.IsNullOrEmpty(x.Contact) && x.Contact.Contains(contact))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(location), x => !string.IsNullOrEmpty(x.Location) && x.Location.Contains(location))
|
|
|
+ .WhereIF(!string.IsNullOrEmpty(clientDto), x => !string.IsNullOrEmpty(x.Client) && x.Client.Contains(clientDto))
|
|
|
+ .Select(x => x.Id)
|
|
|
+ .ToList();
|
|
|
+ }
|
|
|
+ else if (dto.PortType == 2 || dto.PortType == 3)
|
|
|
+ {
|
|
|
+ searchDataIds = searchClientDatas
|
|
|
+ .Where(x => (!string.IsNullOrEmpty(x.Contact) && x.Contact.Contains(clientDto)) ||
|
|
|
+ (!string.IsNullOrEmpty(x.Location) && x.Location.Contains(clientDto)) ||
|
|
|
+ (!string.IsNullOrEmpty(x.Client) && x.Client.Contains(clientDto)))
|
|
|
+ .Select(x => x.Id)
|
|
|
+ .ToList();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (searchDataIds.Count < 1) searchDataIds.Add(0);
|
|
|
+
|
|
|
+ // 缓存搜索结果5分钟
|
|
|
+ await _redisHelper.StringSetAsync(searchCacheKey, searchDataIds, TimeSpan.FromMinutes(5));
|
|
|
+ }
|
|
|
}
|
|
|
+ #endregion
|
|
|
|
|
|
+ #region 主查询
|
|
|
RefAsync<int> total = 0;
|
|
|
var clientDatas = await _sqlSugar.Queryable<Crm_NewClientData>()
|
|
|
- .Where(x => x.IsDel == 0)
|
|
|
- .WhereIF(state == -1 && intList.Count > 0, x => intList.Contains(x.Id))
|
|
|
- .WhereIF(dto.Lvlid != 0, x => x.Lvlid == dto.Lvlid) //地市州条件
|
|
|
- .WhereIF(rangeSetDataList.Count > 0, x => rangeSetDataList.Contains(x.Lvlid)) //省域条件
|
|
|
- .WhereIF(dto.Category > 0, x => x.Category == dto.Category) //客户类别
|
|
|
- .WhereIF(isSelectSearch && searchDataIds.Count > 0 , x => searchDataIds.Contains(x.Id)) //条件模糊查询
|
|
|
- .OrderByDescending(x => x.LastUpdateTime)
|
|
|
- .ToPageListAsync(pageIndex, pageSize, total);
|
|
|
-
|
|
|
- NewClientDataView = _mapper.Map<List<NewClientDataView>>(clientDatas);
|
|
|
- count = total;
|
|
|
-
|
|
|
-
|
|
|
- var setDatas = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.IsDel == 0).ToList();
|
|
|
-
|
|
|
- #region 下拉框初始化数据
|
|
|
- //负责人下拉框
|
|
|
- var _Users = GetNewExistClient(dto.OperationUserId).Select(x => new { x.Id, Name = x.CnName }).ToList();
|
|
|
-
|
|
|
- //省域数据
|
|
|
- var _Province = setDatas.Where(u => u.STid == 42).Select(x => new { x.Id, x.Name }).ToList();
|
|
|
-
|
|
|
- //客户级别数据
|
|
|
- var _level = setDatas.Where(u => u.STid == 33).Select(x => new { x.Id, x.Name }).ToList();
|
|
|
-
|
|
|
- //客户类别
|
|
|
- ArrayList _CustomerClass = new ArrayList();
|
|
|
- List<Sys_SetData> CustomerClass = setDatas.Where(u => u.STid == 37 && u.IsDel == 0).ToList();
|
|
|
- foreach (Sys_SetData item in CustomerClass)
|
|
|
- {
|
|
|
- var data = new
|
|
|
- {
|
|
|
- Id = item.Id,
|
|
|
- Name = item.Name,
|
|
|
- item.Remark
|
|
|
- };
|
|
|
- _CustomerClass.Add(data);
|
|
|
- };
|
|
|
- // 创建比较器实例
|
|
|
- IComparer remakeComparer = new RemakeComparer();
|
|
|
- _CustomerClass.Sort(remakeComparer);
|
|
|
-
|
|
|
- //业务分类
|
|
|
- var _ServiceClass = setDatas.Where(u => u.STid == 36).Select(x => new { x.Id, x.Name }).ToList();
|
|
|
-
|
|
|
+ .Where(x => x.IsDel == 0)
|
|
|
+ .WhereIF(state == -1 && intList.Count > 0, x => intList.Contains(x.Id))
|
|
|
+ .WhereIF(dto.Lvlid != 0, x => x.Lvlid == dto.Lvlid)
|
|
|
+ .WhereIF(rangeSetDataList.Count > 0, x => rangeSetDataList.Contains(x.Lvlid))
|
|
|
+ .WhereIF(dto.Category > 0, x => x.Category == dto.Category)
|
|
|
+ .WhereIF(isSelectSearch && searchDataIds.Count > 0, x => searchDataIds.Contains(x.Id))
|
|
|
+ .OrderByDescending(x => x.LastUpdateTime)
|
|
|
+ .ToPageListAsync(pageIndex, pageSize, total);
|
|
|
+
|
|
|
+ var NewClientDataView = _mapper.Map<List<NewClientDataView>>(clientDatas);
|
|
|
+ var count = total;
|
|
|
#endregion
|
|
|
|
|
|
+ // 计算出团总量
|
|
|
var groupNumber = await QueryNumberGroups();
|
|
|
|
|
|
if (NewClientDataView.Count > 0)
|
|
|
{
|
|
|
- float totalPage = (float)count / dto.PageSize;//总页数
|
|
|
+ float totalPage = (float)count / dto.PageSize;
|
|
|
if (totalPage == 0) totalPage = 1;
|
|
|
else totalPage = (int)Math.Ceiling((double)totalPage);
|
|
|
|
|
|
if (dto.PortType == 1)
|
|
|
{
|
|
|
+ // 批量获取关联信息
|
|
|
+ var clientIds = NewClientDataView.Select(x => x.Id).ToList();
|
|
|
+ var (ascribedUsers, ascribedDepartments) = await GetCachedClientRelationsAsync(clientIds);
|
|
|
+
|
|
|
+ // 获取设置数据用于显示名称
|
|
|
+ var setDatas = _sqlSugar.Queryable<Sys_SetData>().Where(x => x.IsDel == 0).ToList();
|
|
|
+
|
|
|
int index = 1;
|
|
|
foreach (var item in NewClientDataView)
|
|
|
{
|
|
|
- //EncryptionProcessor.DecryptProperties(item); //解密
|
|
|
-
|
|
|
+ // 批量解密
|
|
|
item.Weight = AesEncryptionHelper.Decrypt(item.Weight);
|
|
|
item.Client = AesEncryptionHelper.Decrypt(item.Client);
|
|
|
item.Contact = AesEncryptionHelper.Decrypt(item.Contact);
|
|
@@ -470,37 +644,33 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
item.CategoryStr = setDatas.Find(x => x.Id == item.Category)?.Name ?? "-";
|
|
|
item.LvlidStr = setDatas.Find(x => x.Id == item.Lvlid)?.Name ?? "-";
|
|
|
|
|
|
- List<AscribedUser> AscribedUser = await _sqlSugar.SqlQueryable<AscribedUser>
|
|
|
- ("select u1.UsersId as UserId ,u2.CnName,u1.NewClientDataId from Crm_ClientDataAndUser u1,Sys_Users u2 where u1.UsersId=u2.Id and NewClientDataId=" + item.Id + " AND u1.ISDEL = 0").ToListAsync();
|
|
|
- item.AscribedUser = AscribedUser;
|
|
|
-
|
|
|
- List<AscribedDepartment> AscribedDepartment = await _sqlSugar.SqlQueryable<AscribedDepartment>
|
|
|
- ("select d2.Id,d2.Name,d1.NewClientDataId from Crm_ClientDataAndBusiness d1,Sys_SetData d2 where d1.SetDataId=d2.Id and NewClientDataId=" + item.Id + " AND d1.ISDEL = 0").ToListAsync();
|
|
|
- item.AscribedDepartment = AscribedDepartment;
|
|
|
+ // 从批量查询结果中获取关联信息
|
|
|
+ item.AscribedUser = ascribedUsers.Where(x => x.NewClientDataId == item.Id).ToList();
|
|
|
+ item.AscribedDepartment = ascribedDepartments.Where(x => x.NewClientDataId == item.Id).ToList();
|
|
|
+
|
|
|
index++;
|
|
|
}
|
|
|
|
|
|
var Data = new
|
|
|
{
|
|
|
- ClientTableData = new { pageCount = count, totalPage = (int)totalPage, pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = NewClientDataView },
|
|
|
- Users = _Users,
|
|
|
- Province = _Province,
|
|
|
- level = _level,
|
|
|
- CustomerClass = _CustomerClass,
|
|
|
- ServiceClass = _ServiceClass,
|
|
|
+ ClientTableData = new { pageCount = count.Value, totalPage = (int)totalPage, pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = NewClientDataView },
|
|
|
+ Users = dropdownData.Users,
|
|
|
+ Province = dropdownData.Province,
|
|
|
+ level = dropdownData.Level,
|
|
|
+ CustomerClass = dropdownData.CustomerClass,
|
|
|
+ ServiceClass = dropdownData.ServiceClass,
|
|
|
groupNumber = groupNumber.Data,
|
|
|
};
|
|
|
+
|
|
|
return result = new Result()
|
|
|
{
|
|
|
Code = 0,
|
|
|
- Msg = $"查询成功!解密耗时: {stopwatch.ElapsedMilliseconds} 毫秒",
|
|
|
+ Msg = $"查询成功!总耗时: {stopwatch.ElapsedMilliseconds} 毫秒",
|
|
|
Data = Data
|
|
|
};
|
|
|
-
|
|
|
}
|
|
|
else if (dto.PortType == 2 || dto.PortType == 3)
|
|
|
{
|
|
|
-
|
|
|
List<NewClientDataAndroidIOSView> newClientDataIOSViews = new List<NewClientDataAndroidIOSView>();
|
|
|
|
|
|
int index = 1;
|
|
@@ -523,11 +693,10 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
result = new Result()
|
|
|
{
|
|
|
Code = 0,
|
|
|
- Msg = $"查询成功!解密耗时: {stopwatch.ElapsedMilliseconds} 毫秒",
|
|
|
- Data = new { pageCount = count, totalPage = (int)totalPage, pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = newClientDataIOSViews },
|
|
|
+ Msg = $"查询成功!总耗时: {stopwatch.ElapsedMilliseconds} 毫秒",
|
|
|
+ Data = new { pageCount = count.Value, totalPage = (int)totalPage, pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = newClientDataIOSViews },
|
|
|
};
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -541,25 +710,34 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
var Data = new
|
|
|
{
|
|
|
ClientTableData = new { pageCount = 0, totalPage = 0, pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = NewClientDataView },
|
|
|
- Users = _Users,
|
|
|
- Province = _Province,
|
|
|
- level = _level,
|
|
|
- CustomerClass = _CustomerClass,
|
|
|
- ServiceClass = _ServiceClass,
|
|
|
+ Users = dropdownData.Users,
|
|
|
+ Province = dropdownData.Province,
|
|
|
+ level = dropdownData.Level,
|
|
|
+ CustomerClass = dropdownData.CustomerClass,
|
|
|
+ ServiceClass = dropdownData.ServiceClass,
|
|
|
groupNumber = groupNumber.Data,
|
|
|
};
|
|
|
result = new Result() { Code = 0, Msg = "获取成功!", Data = Data };
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- result = new Result() { Code = -2, Msg = "未知错误" };
|
|
|
+ // 记录详细错误信息
|
|
|
+ Console.WriteLine($"QueryNewClientData 异常: {ex.Message}");
|
|
|
+ Console.WriteLine($"异常堆栈: {ex.StackTrace}");
|
|
|
+
|
|
|
+ result = new Result() { Code = -2, Msg = $"查询异常: {ex.Message}" };
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ stopwatch.Stop();
|
|
|
+ if (result.Code == 0)
|
|
|
+ {
|
|
|
+ result.Msg = $"查询成功!总耗时: {stopwatch.ElapsedMilliseconds} 毫秒";
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- stopwatch.Stop();
|
|
|
- result.Msg = $"耗时: {stopwatch.ElapsedMilliseconds} 毫秒";
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -592,10 +770,10 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
if (!string.IsNullOrWhiteSpace(dto.Userid))
|
|
|
{
|
|
|
string sql = string.Format(@"select u1.UsersId as UserId,u2.CnName,u1.NewClientDataId from Crm_ClientDataAndUser u1,Sys_Users u2 where u1.UsersId=u2.Id and u1.UsersId in ({0}) and u1.IsDel = 0", dto.Userid);
|
|
|
- List<AscribedUser> ascribedUsers = await _sqlSugar.SqlQueryable<AscribedUser>(sql).ToListAsync();
|
|
|
- if (ascribedUsers.Count != 0)
|
|
|
+ List<AscribedUser> userList = await _sqlSugar.SqlQueryable<AscribedUser>(sql).ToListAsync();
|
|
|
+ if (userList.Count != 0)
|
|
|
{
|
|
|
- foreach (var ascribedUser in ascribedUsers)
|
|
|
+ foreach (var ascribedUser in userList)
|
|
|
{
|
|
|
if (ascribedUser.NewClientDataId != 0)
|
|
|
{
|
|
@@ -615,10 +793,10 @@ namespace OASystem.Infrastructure.Repositories.CRM
|
|
|
if (!string.IsNullOrWhiteSpace(dto.Business))
|
|
|
{
|
|
|
string sql = string.Format(@"select d2.Id,d2.Name,d1.NewClientDataId from Crm_ClientDataAndBusiness d1,Sys_SetData d2 where d1.SetDataId=d2.Id and d1.SetDataId in ({0}) and d1.isdel = 0", dto.Business);
|
|
|
- List<AscribedDepartment> AscribedDepartment = await _sqlSugar.SqlQueryable<AscribedDepartment>(sql).ToListAsync();
|
|
|
- if (AscribedDepartment.Count != 0)
|
|
|
+ List<AscribedDepartment> deptList = await _sqlSugar.SqlQueryable<AscribedDepartment>(sql).ToListAsync();
|
|
|
+ if (deptList.Count != 0)
|
|
|
{
|
|
|
- foreach (var item in AscribedDepartment)
|
|
|
+ foreach (var item in deptList)
|
|
|
{
|
|
|
if (item.NewClientDataId != 0)
|
|
|
{
|