using Aspose.Cells;
using EyeSoft.Extensions;
using OASystem.API.OAMethodLib;
using OASystem.Domain.AesEncryption;
using OASystem.Domain.Attributes;
using OASystem.Domain.Dtos.CRM;
using OASystem.Domain.Entities.Customer;
using OASystem.Domain.ViewModels.CRM;
using OASystem.Infrastructure.Repositories.CRM;
using OASystem.RedisRepository;
using System.Collections;
using System.Data;
using System.Diagnostics;
using System.Net;
using UAParser;
namespace OASystem.API.Controllers
{
///
/// 市场客户资料
///
[Route("api/[controller]/[action]")]
public class MarketCustomerResourcesController : ControllerBase
{
private readonly NewClientDataRepository _clientDataRepository;
private readonly SqlSugarClient _sqlSugar;
private readonly ILogger _logger;
private string keyName = "newClient_SearchKey";
///
/// 初始化
///
public MarketCustomerResourcesController(NewClientDataRepository clientDataRepository, SqlSugarClient sqlSugar, ILogger logger)
{
this._clientDataRepository = clientDataRepository;
_sqlSugar = sqlSugar;
_logger = logger;
}
///
/// 客户资料数据
/// 基础数据
///
///
[HttpPost]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task MarketCustomerInit(MarketCustomerInitDto dto)
{
JsonView jw = new JsonView();
try
{
Result resultData = await _clientDataRepository._Init(dto);
if (resultData.Code == 0)
{
jw = JsonView(true, "查询成功!", resultData.Data);
}
else
{
jw = JsonView(false, resultData.Msg);
}
}
catch (Exception)
{
jw = JsonView(false, "程序错误!");
}
return Ok(jw);
}
///
/// 查询客户资料数据
///
///
[HttpPost]
//[ApiLog("Crm_NewClientData", OperationEnum.List)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task QueryNewClientData(NewClientDataQueryDto dto)
{
#region 参数验证
if (dto.OperationUserId < 0)
return Ok(JsonView(false, "请传入有效的OperationUserId参数!"));
if (dto.PortType < 0)
return Ok(JsonView(false, "请传入有效的PortType参数!"));
#endregion
JsonView jw = new JsonView();
var startTime = DateTime.UtcNow;
try
{
Result resultData = await _clientDataRepository.QueryNewClientData(dto);
if (resultData.Code == 0)
{
#region 客户资料表操作记录
//await GeneralMethod.NewClientOperationRecord(dto.PortType, OperationEnum.NoOperation, dto.OperationUserId, 0, "");
#endregion
jw = JsonView(true, resultData.Msg, resultData.Data);
}
else
{
jw = JsonView(false, resultData.Msg);
}
}
catch (Exception)
{
jw = JsonView(false, "程序错误!");
}
finally
{
using var ssg = _sqlSugar.CopyNew();
var status = HttpContext.Response.StatusCode.ToString();
_ = Task.Run(async () =>
{
try
{
string remoteIp = string.Empty,
location = string.Empty;
// 检查请求头中的X-Forwarded-For,以获取真实的客户端IP地址
if (HttpContext.Request.Headers.ContainsKey("X-Forwarded-For"))
{
remoteIp = HttpContext.Request.Headers["X-Forwarded-For"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)[0];
}
else
{
remoteIp = HttpContext.Connection.RemoteIpAddress?.ToString();
}
var task = GetIpInfo(remoteIp);
string deviceType = string.Empty, browser = string.Empty, os = string.Empty;
var userAgent = HttpContext.Request.Headers["User-Agent"].FirstOrDefault();
if (!string.IsNullOrEmpty(userAgent))
{
// 解析User-Agent头
var parser = Parser.GetDefault();
var client = parser.Parse(userAgent);
// 提取浏览器信息
browser = client.UA.Family; // 浏览器名称
var browserVersion = client.UA.Major + "." + client.UA.Minor + "." + client.UA.Patch; // 浏览器版本
browser += $"({browserVersion})";
// 提取操作系统信息
os = client.OS.Family; // 操作系统名称
var osVersion = string.Empty; // 操作系统版本
if (!string.IsNullOrEmpty(client.OS.Major)) osVersion += client.OS.Major;
if (!string.IsNullOrEmpty(client.OS.Minor)) osVersion += "." + client.OS.Minor;
if (!string.IsNullOrEmpty(client.OS.Patch)) osVersion += "." + client.OS.Patch;
if (!string.IsNullOrEmpty(osVersion)) os += $"({osVersion})";
// 提取设备信息
deviceType = client.Device.Family; // 设备类型,如 'mobile', 'tablet', 'desktop' 等
}
// 记录请求结束时间
var endTime = DateTime.UtcNow;
// 计算耗时
var duration = (long)(endTime - startTime).TotalMilliseconds;
//等待任务进行
(remoteIp, location) = await task;
//单独记录操作
var logInfo = new Crm_TableOperationRecord()
{
TableName = "Crm_NewClientData",
PortType = dto.PortType,
OperationItem = OperationEnum.List,
DataId = 0,
RequestUrl = "/api/MarketCustomerResources/QueryNewClientData",
RemoteIp = remoteIp,
Location = location,
RequestParam = JsonConvert.SerializeObject(dto),
ReturnResult = JsonConvert.SerializeObject(jw),
Elapsed = duration,
Status = status,
CreateUserId = dto.OperationUserId,
UpdatePreData = "",
UpdateBefData = "",
Browser = browser,
Os = os,
DeviceType = deviceType,
};
// 存储到数据库
await ssg.Insertable(logInfo).ExecuteCommandAsync();
}
catch (Exception ex)
{
}
});
}
return Ok(jw);
}
///
/// 客户资料数据
/// Details
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.Details)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task PostNewClientDataDetails(NewClientDataDetailsDto dto)
{
#region 参数验证
if (dto.Id < 0)
return Ok(JsonView(false, "请传入有效的Id参数!"));
if (dto.UserId < 0)
return Ok(JsonView(false, "请传入有效的UserId参数!"));
if (dto.PortType < 0)
return Ok(JsonView(false, "请传入有效的PortType参数!"));
#endregion
JsonView jw = new JsonView();
try
{
Result resultData = await _clientDataRepository._Details(dto.PortType, dto.Id);
if (resultData.Code == 0)
{
#region 客户资料表操作记录
//await GeneralMethod.NewClientOperationRecord(dto.PortType, OperationEnum.Details, dto.UserId, dto.Id, "");
#endregion
jw = JsonView(true, "查询成功!", resultData.Data);
}
else
{
jw = JsonView(false, resultData.Msg);
}
}
catch (Exception)
{
jw = JsonView(false, "程序错误!");
}
return Ok(jw);
}
///
/// 客户资料操作(Status:1.新增,2.修改)
///
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.NoOperation)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task NewClientOp(NewClientOpDto dto)
{
#region 参数验证
if (dto.CreateUserId < 0)
{
return Ok(JsonView(false, "请传入有效的CreateUserId参数!"));
}
if (dto.PortType < 0)
{
return Ok(JsonView(false, "请传入有效的PortType参数!"));
}
#endregion
try
{
Domain.Result result = await _clientDataRepository.NewClientOp(dto);
if (result.Code != 0)
{
return Ok(JsonView(false, result.Msg));
}
#region 客户资料操作记录
//OperationEnum operationEnum = OperationEnum.NoOperation;
//if (dto.Status == 1)
//{
// operationEnum = OperationEnum.Add;
// dto.Id = Convert.ToInt32(result.Data);
//}
//else if (dto.Status == 2) operationEnum = OperationEnum.Edit;
//await GeneralMethod.NewClientOperationRecord(dto.PortType, operationEnum, dto.CreateUserId, dto.Id, "");
#endregion
//this.keyName += "_" + dto.CreateUserId;
//var exists = await RedisFactory.CreateRedisRepository().KeyExistsAsync(keyName);
//if (exists) await RedisFactory.CreateRedisRepository().KeyDeleteAsync(keyName);
return Ok(JsonView(true, result.Msg + "Id:" + dto.Id));
}
catch (Exception ex)
{
return Ok(JsonView(false, "程序错误!Msg:" + ex.Message));
}
}
///
/// 新客户资料操作(删除)
///
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.Del)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task NewClientDel(DelBaseDto dto)
{
#region 参数验证
if (dto.Id < 0)
{
return Ok(JsonView(false, "请传入有效的Id参数!"));
}
if (dto.DeleteUserId < 0)
{
return Ok(JsonView(false, "请传入有效的DeleteUserId参数!"));
}
if (dto.PortType < 0)
{
return Ok(JsonView(false, "请传入有效的PortType参数!"));
}
#endregion
var res = await _clientDataRepository.DelNewClientData(dto);
if (res.Code != 0)
{
return Ok(JsonView(false, "删除失败"));
}
#region 客户资料表操作记录
//await GeneralMethod.NewClientOperationRecord(dto.PortType, OperationEnum.Del, dto.DeleteUserId, dto.Id, "");
#endregion
//this.keyName += "_" + dto.DeleteUserId;
//var exists = await RedisFactory.CreateRedisRepository().KeyExistsAsync(keyName);
//if (exists) await RedisFactory.CreateRedisRepository().KeyDeleteAsync(keyName);
return Ok(JsonView(true, "删除成功!"));
}
///
/// 获取下拉列表数据和单条数据信息
///
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.Details)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task QuerySelectAndSingleData(QuerySingleDto dto)
{
JsonView jw = new JsonView();
var result = await _clientDataRepository.QuerySelectAndSingleData(dto);
if (result.Code == 0)
{
#region 客户资料表操作记录
//await GeneralMethod.NewClientOperationRecord(dto.PortType, OperationEnum.Details, dto.UserId, dto.Id, "");
#endregion
jw = JsonView(true, result.Msg, result.Data);
}
else
{
jw = JsonView(false, result.Msg);
}
return Ok(jw);
}
///
/// 获取现有负责人
///
///
[HttpPost]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task QueryUserSelect()
{
Result resTable = _clientDataRepository.QueryUserSelect();
return Ok(JsonView(true, resTable.Msg, resTable.Data));
}
///
/// 获取出团数据
///
///
[HttpPost]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task QueryNumberGroups()
{
var result = await _clientDataRepository.QueryNumberGroups();
if (result.Code != 0)
{
return Ok(JsonView(false, result.Msg));
}
return Ok(JsonView(true, result.Msg, result.Data));
}
///
/// 新客户资料操作
/// 批量分配
///
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.BatchAssignment)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task PostBatchAssignment(BatchAssignmentDto dto)
{
#region 参数验证
if (dto.UserId < 0)
{
return Ok(JsonView(false, "请传入有效的UserId参数!"));
}
if (dto.PortType < 0)
{
return Ok(JsonView(false, "请传入有效的PortType参数!"));
}
#endregion
var res = await _clientDataRepository._BatchAssignment(dto);
if (res.Code != 0)
{
return Ok(JsonView(false, res.Msg));
}
return Ok(JsonView(true, "操作成功!"));
}
private Dictionary> MCRSetting()
{
Dictionary> keyValuePairs = new Dictionary>();
keyValuePairs.Add(419, new List() //四川
{
376,377,378,381,382,387,388,389,390,753,754,1296,1303
});
keyValuePairs.Add(420, new List() //云南
{
407,408,409,410,449,451,452,453,567,754,1297,1304
});
keyValuePairs.Add(421, new List() { 424, 425, 426, 427, 428, 429, 754, 1298, 1305, 1307, 1306 }); // 贵州
keyValuePairs.Add(422, new List() { 415, 416, 754, 1317, 1316, 1315, 455, 1321, 1320, 1319, 1318 }); // 西藏
keyValuePairs.Add(423, new List() { 417, 418, 454, 456, 754, 1313, 1314 }); // 重庆
keyValuePairs.Add(578, new List() { 581, 582, 583, 754, 1299, 1300 }); // 青海
keyValuePairs.Add(605, new List() { 588, 589, 590, 591, 592, 593, 754, 1301, 1310, 1309, 1308 }); // 陕西
keyValuePairs.Add(606, new List() { 597, 598, 599, 600, 601, 602, 603, 604, 754, 1324, 1323, 1322 }); // 宁夏
keyValuePairs.Add(625, new List() { 617, 618, 619, 620, 621, 622, 622, 623, 624, 754, 1302, 1312, 1311 }); // 甘肃
keyValuePairs.Add(634, new List() { 630, 631, 632, 633, 754 }); // 新疆
return keyValuePairs;
}
private Dictionary> MCRSecondSetting()
{
Dictionary> keyValuePairs = new Dictionary>();
_sqlSugar.Queryable()
.Where(x => x.STid == 33 && x.IsDel == 0)
.Select(x => new { x.Id, x.Name, x.Remark })
.ToList()
.ForEach(x =>
{
try
{
var list = JsonConvert.DeserializeObject>(x.Remark);
keyValuePairs.Add(x.Id, list);
}
catch (Exception ex)
{
_logger.LogError($"MCRSecondSetting JsonConvert.DeserializeObject ERROR: {ex.Message}");
keyValuePairs.Add(x.Id, new List());
}
});
return keyValuePairs;
}
private Dictionary> MCRLvSetting()
{
var keyValuePairs = new Dictionary>();
_sqlSugar.Queryable()
.Where(x => x.STid == 42 && x.IsDel == 0)
.Select(x => new { x.Id, x.Name, x.Remark })
.ToList()
.ForEach(x =>
{
try
{
var list = JsonConvert.DeserializeObject>(x.Remark);
keyValuePairs.Add(x.Id, list);
}
catch (Exception ex)
{
_logger.LogError($"MCRLvSetting JsonConvert.DeserializeObject ERROR: {ex.Message}");
keyValuePairs.Add(x.Id, new List());
}
});
return keyValuePairs;
}
[HttpPost]
public IActionResult QueryClientType(QueryClientTypeDto Dto)
{
var jw = JsonView(true, "获取成功!");
var dic_lv = MCRLvSetting();
var dic_setting = MCRSecondSetting();
ArrayList arr = new ArrayList();
ArrayList lvArr = new ArrayList();
var ids = new List();
var lvids = new List();
var items = _sqlSugar.Queryable()
.Where(x => x.STid == 42 && x.IsDel == 0)
.Where(x => Dto.SetDataIdArr.Contains(x.Id))
.Select(x => new { x.Id, x.Name, x.Remark })
.ToList();
foreach (var item in items)
{
if (dic_lv.Keys.Contains(item.Id))
{
lvids.AddRange(dic_lv[item.Id]);
var remarkids = JsonConvert.DeserializeObject>(item.Remark);
if (remarkids.Any())
{
foreach (var remarkid in remarkids)
{
if (dic_setting.Keys.Contains(remarkid))
{
ids.AddRange(dic_setting[remarkid]);
}
}
}
}
}
arr.AddRange(_sqlSugar.Queryable()
.Where(u => ids.Contains(u.Id) && u.IsDel == 0)
.Select(x => new { x.Id, x.Name, x.Remark })
.ToList());
if (arr.Count == 0)
{
arr.AddRange(_sqlSugar.Queryable()
.Where(u => u.STid == 37 && u.IsDel == 0)
.Select(x => new { x.Id, x.Name, x.Remark }).ToList());
}
// 创建比较器实例
IComparer remakeComparer = new RemakeComparer();
// 使用ArrayList.Sort方法和自定义比较器对arr进行排序
arr.Sort(remakeComparer);
var rangelv = _sqlSugar.Queryable()
.Where(u => lvids.Contains(u.Id) && u.IsDel == 0)
.Select(x => new { x.Id, x.Name })
.ToList();
lvArr.AddRange(rangelv);
if (lvArr.Count == 0)
{
lvArr.AddRange(_sqlSugar.Queryable()
.Where(u => u.STid == 33 && u.IsDel == 0)
.Select(x => new { x.Id, x.Name }).ToList());
}
jw.Data = new
{
TypeArr = arr,
LvArr = lvArr,
};
return Ok(jw);
}
[HttpPost]
public IActionResult QueryClientTypeSecond(QueryClientTypeDto Dto)
{
var jw = JsonView(true, "获取成功!");
var keyValuePairs = MCRSecondSetting();
ArrayList arr = new ArrayList();
var ids = new List();
foreach (var item in Dto.SetDataIdArr)
{
if (keyValuePairs.Keys.Contains(item))
{
ids.AddRange(keyValuePairs[item]);
}
}
arr.AddRange(_sqlSugar.Queryable()
.Where(u => ids.Contains(u.Id) && u.IsDel == 0)
.Select(x => new { x.Id, x.Name, x.Remark })
.ToList());
if (arr.Count == 0)
{
arr.AddRange(_sqlSugar.Queryable()
.Where(u => u.STid == 37 && u.IsDel == 0)
.Select(x => new { x.Id, x.Name, x.Remark }).ToList());
}
// 创建比较器实例
IComparer remakeComparer = new RemakeComparer();
// 使用ArrayList.Sort方法和自定义比较器对arr进行排序
arr.Sort(remakeComparer);
jw.Data = arr;
return Ok(jw);
}
///
/// 客户资料数据 全信息导出 excel 下载
///
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.Download)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task NewClientDataExcelDownload(NewClientDataExcelDownloadDto dto)
{
#region 参数验证
if (dto.OperationUserId < 0) return Ok(JsonView(false, "请传入有效的OperationUserId参数!"));
if (dto.PortType < 0) return Ok(JsonView(false, "请传入有效的PortType参数!"));
if (dto.PageId < 0) return Ok(JsonView(false, "请传入有效的PageId参数!"));
#endregion
#region 页面操作权限验证
var pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.OperationUserId, dto.PageId);
if (pageFunAuthView.FilesDownloadAuth == 0) return Ok(JsonView(false, "您没有文件下载权!"));
#endregion
var dt = await _clientDataRepository.NewClientDataExcelDownload(dto);
if (dt != null)
{
string tempPath = (AppSettingsHelper.Get("ExcelBasePath") + "Template/公司客户资料导出模板.xlsx");
var designer = new WorkbookDesigner();
designer.Workbook = new Workbook(tempPath);
designer.SetDataSource("NCDDT", dt);
designer.Process();
//文件名
string fileName = $"公司客户资料(全信息导出){DateTime.Now.ToString("yyyyMMddHHmmss")}.xls";
designer.Workbook.Save(AppSettingsHelper.Get("ExcelBasePath") + "NewClientDataExcelDownload/" + fileName);
string url = AppSettingsHelper.Get("ExcelBaseUrl") + "Office/Excel/NewClientDataExcelDownload/" + fileName;
#region 客户资料表操作记录
var respose = JsonView(true, "成功", url);
//var paramData = new
//{
// APIName = @"MarketCustomerResources/NewClientDataExcelDownload",
// RequestParam = dto,
// ResposeParam = respose
//};
//await GeneralMethod.NewClientOperationRecord(dto.PortType, OperationEnum.Download, dto.OperationUserId, 0, JsonConvert.SerializeObject(paramData));
#endregion
return Ok(respose);
}
return Ok(JsonView(false));
}
///
/// 客户资料数据 分权限导出 excel 下载
///
///
///
[HttpPost]
[ApiLog("Crm_NewClientData", OperationEnum.Download)]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task NewClientDataAuthorityExcelDownload(NewClientDataExcelDownloadDto dto)
{
#region 参数验证
if (dto.OperationUserId < 0) return Ok(JsonView(false, "请传入有效的OperationUserId参数!"));
if (dto.PortType < 0) return Ok(JsonView(false, "请传入有效的PortType参数!"));
if (dto.PageId < 0) return Ok(JsonView(false, "请传入有效的PageId参数!"));
#endregion
#region 页面操作权限验证
var pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.OperationUserId, dto.PageId);
if (pageFunAuthView.FilesDownloadAuth == 0) return Ok(JsonView(false, "您没有文件下载权!"));
#endregion
var dt = await _clientDataRepository.NewClientDataExcelDownload(dto);
if (dt != null)
{
string tempPath = (AppSettingsHelper.Get("ExcelBasePath") + "Template/公司客户资料分权限导出模板.xlsx");
var designer = new WorkbookDesigner();
designer.Workbook = new Workbook(tempPath);
designer.SetDataSource("NCDDT", dt);
designer.Process();
//文件名
string fileName = $"公司客户资料(分权限导出){DateTime.Now.ToString("yyyyMMddHHmmss")}.xls";
designer.Workbook.Save(AppSettingsHelper.Get("ExcelBasePath") + "NewClientDataExcelDownload/" + fileName);
string url = AppSettingsHelper.Get("ExcelBaseUrl") + "Office/Excel/NewClientDataExcelDownload/" + fileName;
var respose = JsonView(true, "成功", url);
return Ok(respose);
}
return Ok(JsonView(false));
}
///
/// 客户资料数据 历史记录 Init
///
///
///
[HttpPost]
[ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
public async Task NewClientDataRecordInit(NewClientDataRecordInitDto dto)
{
#region 参数验证
if (dto.UserId < 0) return Ok(JsonView(false, MsgTips.UserId));
if (!SharingStaticData.PortTypes.Contains(dto.PortType)) return Ok(JsonView(false, MsgTips.Port));
if (dto.PageId < 0) return Ok(JsonView(false, MsgTips.PageId));
#endregion
#region 页面操作权限验证
var pageFunAuthView = await GeneralMethod.PostUserPageFuncDatas(dto.UserId, dto.PageId);
if (pageFunAuthView.CheckAuth == 0) return Ok(JsonView(false, "您没有查看权限!"));
#endregion
var enumfiltrates = new string[] { "NoOperation", "Audit", "Login" };
var operations = EnumHelper.GetEnumDescriptions(typeof(OperationEnum), enumfiltrates);
var operation1 = new List();
foreach (var item in operations)
{
operation1.Add(new { value = item.Key, text = item.Value });
}
object userDatas = Array.Empty