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.Infrastructure.Repositories.CRM;
using OASystem.RedisRepository;
using System.Collections;
using System.Data;
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 string keyName = "newClient_SearchKey";
        /// 
        /// 初始化
        /// 
        public MarketCustomerResourcesController(NewClientDataRepository clientDataRepository, SqlSugarClient sqlSugar)
        {
            this._clientDataRepository = clientDataRepository;
            _sqlSugar = sqlSugar;
        }
        /// 
        /// 客户资料数据
        /// 基础数据
        /// 
        /// 
        [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>();
            // 四川
            keyValuePairs.Add(349, new List() { 376, 378, 381, 387, 389, 1296 }); // 四川省级
            keyValuePairs.Add(350, new List() { 377, 382, 388, 390, 1303 }); // 成都市级
            keyValuePairs.Add(348, new List() { 387 }); // 四川地市州 - Explicitly assigning to ensure all source2 IDs are used
            keyValuePairs.Add(701, new List() { 388 }); // 成都区市县
            // 云南
            keyValuePairs.Add(399, new List() { 407, 408, 409, 410, 451 }); // 云南省级
            keyValuePairs.Add(400, new List() { 449, 452, 453, 1297, 1304 }); // 昆明市级
            keyValuePairs.Add(450, new List() { 410 }); // 云南地市州
            keyValuePairs.Add(566, new List() { 567 }); // 昆明区市县
            // 贵州
            keyValuePairs.Add(401, new List() { 424, 426, 427, 428, 1298 }); // 贵州省级
            keyValuePairs.Add(402, new List() { 425, 429, 1306, 1307, 1305 }); // 贵阳市级
            keyValuePairs.Add(414, new List() { 428 }); // 贵州地市州
            //keyValuePairs.Add(1305, new List() { /* Add relevant IDs if available */ }); // 贵阳区市县 - Placeholder for now
            // 重庆
            keyValuePairs.Add(403, new List() { 417, 418, 454, 456, 1314 }); // 重庆市级
            keyValuePairs.Add(404, new List() { 1313 }); // 重庆区县 - No direct match in source1
            // 西藏
            keyValuePairs.Add(405, new List() { 415, 1317, 1316, 1315 }); // 西藏自治区
            keyValuePairs.Add(406, new List() { 455, 1321, 1320, 1319, 1318 }); // 拉萨市级
            keyValuePairs.Add(413, new List() { 416 }); // 西藏地市州
            // 青海
            keyValuePairs.Add(579, new List() { 581, 582, 583, 1300 }); // 青海省级
            keyValuePairs.Add(580, new List() { 1299 }); // 青海市州县  (Includes 地市州)
            // 陕西
            keyValuePairs.Add(585, new List() { 588, 589, 590, 591, 1301 }); // 陕西省级
            keyValuePairs.Add(586, new List() { 589 }); // 陕西地市州
            keyValuePairs.Add(587, new List() { 592, 593, 1309, 1310, 1308 }); // 西安市级
            //keyValuePairs.Add(1308, new List() { /* Add relevant IDs if available */ }); // 西安区市县 - Placeholder
            // 宁夏
            keyValuePairs.Add(594, new List() { 597, 598, 599, 600, 601, 1322 }); // 宁夏自治区 (Includes 地市州 and 区级)
            keyValuePairs.Add(595, new List() { 597 }); // 宁夏地市州
            keyValuePairs.Add(596, new List() { 598, 599, 600, 603, 604, 602, 1323, 1324 }); // 银川市级 (Includes 区级)
            //keyValuePairs.Add(602, new List()); // 银川区市县 - No direct match, but could be considered covered by "区级"
            // 甘肃
            keyValuePairs.Add(614, new List() { 617, 618, 619, 620, 621, 1302 }); // 甘肃省级
            keyValuePairs.Add(615, new List() { 618 }); // 甘肃地市州
            keyValuePairs.Add(616, new List() { 622, 623, 624, 1312, 1311 }); // 兰州市级
            //keyValuePairs.Add(1311, new List() { /* Add relevant IDs if available */ }); // 兰州区市县 - Placeholder
            // 新疆
            keyValuePairs.Add(627, new List() { 630, 631, 632, 1327, 1326, 1325 }); // 新疆自治区级
            keyValuePairs.Add(628, new List() { 1326 }); // 新疆地市州 - No direct match
            keyValuePairs.Add(629, new List() { 633, 1331, 1330, 1329, 1328 }); // 乌鲁木齐市级
            // 中央直属企业 (Special case)
            keyValuePairs.Add(351, new List() { 754 }); //  Using "未分级" for 中央直属企业
            return keyValuePairs;
        }
        private Dictionary> MCRLvSetting()
        {
            var keyValuePairs = new Dictionary>();
            // 四川 (419)
            keyValuePairs.Add(419, new List() { 348, 349, 350, 701 }); // Includes all Sichuan-related IDs from source2
            // 云南 (420)
            keyValuePairs.Add(420, new List() { 399, 400, 450, 566 }); // Includes all Yunnan-related IDs
            // 贵州 (421)
            keyValuePairs.Add(421, new List() { 401, 402, 414 });
            // 西藏 (422)
            keyValuePairs.Add(422, new List() { 405, 406, 413 });
            // 重庆 (423)
            keyValuePairs.Add(423, new List() { 403, 404 });
            // 青海 (578)
            keyValuePairs.Add(578, new List() { 579, 580, 626 }); // Includes 市州县 and 西宁市级
            // 陕西 (605)
            keyValuePairs.Add(605, new List() { 585, 586, 587 });
            // 宁夏 (606)
            keyValuePairs.Add(606, new List() { 594, 595, 596 });
            // 甘肃 (625)
            keyValuePairs.Add(625, new List() { 614, 615, 616 });
            // 新疆 (634)
            keyValuePairs.Add(634, new List() { 627, 628, 629 });
            // 未分级 (351) -  You'll likely want to remove this as it's no longer a primary key.
            //  keyValuePairs.Add(351, new List());  //Remove this line.
            return keyValuePairs;
        }
        [HttpPost]
        public IActionResult QueryClientType(QueryClientTypeDto Dto)
        {
            var jw = JsonView(true, "获取成功!");
            var dic_lv = MCRLvSetting();
            var keyValuePairs = MCRSetting();
            ArrayList arr = new ArrayList();
            ArrayList lvArr = new ArrayList();
            var ids = new List();
            var lvids = new List();
            foreach (var item in Dto.SetDataIdArr)
            {
                if (keyValuePairs.Keys.Contains(item))
                {
                    ids.AddRange(keyValuePairs[item]);
                }
                if (dic_lv.Keys.Contains(item))
                {
                    lvids.AddRange(dic_lv[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);
            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