Преглед на файлове

Merge branch 'master' of https://git.zhongjie51.com/zhongjie51/99ditui

# Conflicts:
#	src/platform/ZhonTai.Admin/ZhonTai.Admin.xml
解决冲突
lifa преди 2 години
родител
ревизия
917d099509
променени са 19 файла, в които са добавени 516 реда и са изтрити 168 реда
  1. BIN
      src/hosts/ZhonTai.Host/wwwroot/link/linkcode.xlsx
  2. 4 1
      src/platform/ZhonTai.Admin/Core/Db/DbHelper.cs
  3. 0 137
      src/platform/ZhonTai.Admin/Core/Helpers/ExcelHelper.cs
  4. 101 0
      src/platform/ZhonTai.Admin/Core/Helpers/NOPIHelper.cs
  5. 1 0
      src/platform/ZhonTai.Admin/Domain/Project/ProjectEntity.cs
  6. 5 1
      src/platform/ZhonTai.Admin/Domain/ProjectLink/ProjectLinkEntity.cs
  7. 14 0
      src/platform/ZhonTai.Admin/Services/Project/Dto/ProjectSelectOutput.cs
  8. 16 0
      src/platform/ZhonTai.Admin/Services/Project/ProjectService.cs
  9. 5 1
      src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/LinkExcelInput.cs
  10. 2 2
      src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkGetPageDto.cs
  11. 2 2
      src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkListOutput.cs
  12. 20 0
      src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkManagePageInput.cs
  13. 32 0
      src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkManagePageOutput.cs
  14. 147 19
      src/platform/ZhonTai.Admin/Services/ProjectLink/ProjectLinkService.cs
  15. 21 0
      src/platform/ZhonTai.Admin/Services/Tenant/Dto/TenantSelectListOutput.cs
  16. 20 4
      src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs
  17. 1 0
      src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj
  18. 125 0
      src/platform/ZhonTai.Admin/ZhonTai.Admin.xml
  19. 0 1
      src/platform/ZhonTai.Common/ZhonTai.Common.csproj

BIN
src/hosts/ZhonTai.Host/wwwroot/link/linkcode.xlsx


+ 4 - 1
src/platform/ZhonTai.Admin/Core/Db/DbHelper.cs

@@ -196,9 +196,12 @@ public class DbHelper
                     break;
                 case "TenantId":
                     if (e.Value == null || (long)e.Value == default || (long?)e.Value == default)
-                    {
+                    {                        
                         e.Value = user.TenantId;
                     }
+                    if (e.Value != null && (long)e.Value == -1) {
+                        e.Value = "";
+                    }
                     break;
 
             }

+ 0 - 137
src/platform/ZhonTai.Admin/Core/Helpers/ExcelHelper.cs

@@ -1,137 +0,0 @@
-using OfficeOpenXml.Style;
-using OfficeOpenXml;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Threading.Tasks;
-using ZhonTai.Admin.Core.Dto;
-
-namespace ZhonTai.Admin.Core.Helpers
-{
-    public class ExcelHelper
-    {
-        //public static void DownloadExcel<T>(List<T> list, string sWebRootFolder, string FileName, bool isFirstCloumnName = true)
-        //{
-        //    try
-        //    {
-        //        //判断文件是否存在,不存在创建
-        //        if (!Directory.Exists(sWebRootFolder))
-        //            Directory.CreateDirectory(sWebRootFolder);
-
-        //        //创建默认文件
-        //        if (FileName.IsNull())
-        //        {
-        //            FileName = "Sheet1.xlsx";
-        //        }
-        //        if (!FileName.EndsWith(".xlsx"))
-        //        {
-        //            FileName += ".xlsx";
-        //        }
-        //        //判断同名文件
-        //        string filepath = Path.Combine(sWebRootFolder, FileName);
-        //        FileInfo file = new FileInfo(filepath);
-        //        if (file.Exists)
-        //        {
-        //            file.Delete();
-        //        }
-        //        using (ExcelPackage package = new ExcelPackage(file))
-        //        {
-        //            //添加 workesheet
-        //            ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(FileName);
-
-        //            //添加数据
-        //            PropertyInfo[] props = typeof(T).GetProperties();
-        //            for (int i = 0; i < list.Count; i++)
-        //            {
-        //                worksheet.Row(i + 1).CustomHeight = true;//自动调整行高
-        //                for (int j = 0; j < props.Length; j++)
-        //                {
-        //                    //设置第一列
-        //                    if (isFirstCloumnName && i == 0)
-        //                    {
-        //                        worksheet.Cells[i + 1, j + 1].Style.Font.Bold = true;
-        //                        //worksheet.Cells[i + 1, j + 1].Style.WrapText = true;                                
-        //                    }
-
-        //                    worksheet.Cells[1, 1].Style.Font.Size = 12;//字体大小
-        //                    worksheet.Cells[i + 1, j + 1].Style.Font.Name = "微软雅黑";//字体
-        //                    worksheet.Cells[i + 1, j + 1].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
-        //                    worksheet.Cells[i + 1, j + 1].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
-        //                    //设置单元格内容 
-        //                    var v = props[j].GetValue(list[i]);
-        //                    string val = v == null ? "" : v.ToString();
-        //                    worksheet.Cells[i + 1, j + 1].Value = props[j].GetValue(list[i]);
-        //                }
-        //            }
-        //            worksheet.Cells.Style.ShrinkToFit = true;//单元格自动适应大小                    
-        //            package.Save();
-        //        }
-        //        return ResultOutput.Ok(filepath, "导出成功");
-        //    }
-        //    catch (Exception ex)
-        //    {
-        //        return ResultOutput.NotOk("导出失败");
-        //    }
-        //}
-
-        /// <summary>
-        /// 导入
-        /// </summary>
-        /// <typeparam name="T"></typeparam>
-        /// <param name="FileName"></param>
-        /// <returns></returns>
-        public static IEnumerable<T> LoadFromExcel<T>(string FileName) where T : new()
-        {
-            FileInfo existingFile = new FileInfo(FileName);
-            List<T> resultList = new List<T>();
-            Dictionary<string, int> dicHeader = new Dictionary<string, int>();
-            using (ExcelPackage package = new ExcelPackage(existingFile))
-            {
-                ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
-                int colstart = worksheet.Dimension.Start.Column;
-                int colend = worksheet.Dimension.End.Column;
-                int rowstart = worksheet.Dimension.Start.Row;
-                int rowend = worksheet.Dimension.End.Row;
-
-                for (int i = colstart; i <= colend; i++)
-                {
-                    dicHeader[worksheet.Cells[rowstart, i].Value.ToString()] = i;
-                }
-
-                List<PropertyInfo> propertyInfosList = new List<PropertyInfo>(typeof(T).GetProperties());
-                for (int row = rowstart + 1; row <= rowend; row++)
-                {
-                    T result = new T();
-                    foreach (PropertyInfo p in propertyInfosList)
-                    {
-                        try
-                        {
-                            ExcelRange cell = worksheet.Cells[row, dicHeader[p.Name]];
-                            if (cell.Value == null)
-                                continue;
-                            switch (p.PropertyType.Name.ToLower())
-                            {
-                                case "string":
-                                    p.SetValue(result, cell.GetValue<string>());
-                                    break;
-                                default:
-                                    break;
-                            }
-                        }
-                        catch (Exception)
-                        {
-
-                            throw;
-                        }
-                    }
-                    resultList.Add(result);
-                }
-            }
-            return resultList;
-        }
-    }
-}

+ 101 - 0
src/platform/ZhonTai.Admin/Core/Helpers/NOPIHelper.cs

@@ -0,0 +1,101 @@
+using Newtonsoft.Json;
+using NPOI.SS.UserModel;
+using NPOI.XSSF.UserModel;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZhonTai.Admin.Core.Helpers
+{
+    /// <summary>
+    /// Excel帮助类
+    /// </summary>
+    public class NOPIHelper
+    {
+        public static DataTable ReadExcel(string path)
+        {
+            DataTable dtTable = new DataTable();
+            List<string> rowList = new List<string>();
+            ISheet sheet;
+            using (var stream = new FileStream(path, FileMode.Open))
+            {
+                stream.Position = 0;
+                XSSFWorkbook xssWorkbook = new XSSFWorkbook(stream);
+                sheet = xssWorkbook.GetSheetAt(0);
+                IRow headerRow = sheet.GetRow(0);
+                int cellCount = headerRow.LastCellNum;
+                for (int j = 0; j < cellCount; j++)
+                {
+                    ICell cell = headerRow.GetCell(j);
+                    if (cell == null || string.IsNullOrWhiteSpace(cell.ToString())) continue;
+                    {
+                        dtTable.Columns.Add(cell.ToString());
+                    }
+                }
+                for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
+                {
+                    IRow row = sheet.GetRow(i);
+                    if (row == null) continue;
+                    if (row.Cells.All(d => d.CellType == CellType.Blank)) continue;
+                    for (int j = row.FirstCellNum; j < cellCount; j++)
+                    {
+                        if (row.GetCell(j) != null)
+                        {
+                            if (!string.IsNullOrEmpty(row.GetCell(j).ToString()) && !string.IsNullOrWhiteSpace(row.GetCell(j).ToString()))
+                            {
+                                rowList.Add(row.GetCell(j).ToString());
+                            }
+                        }
+                    }
+                    if (rowList.Count > 0)
+                        dtTable.Rows.Add(rowList.ToArray());
+                    rowList.Clear();
+                }
+                xssWorkbook.Close();
+            }
+            return dtTable;
+        }
+        public static void WriteExcel(string json, string path)
+        {
+            var table = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));
+            var memoryStream = new MemoryStream();
+
+            using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
+            {
+                IWorkbook workbook = new XSSFWorkbook();
+                ISheet excelSheet = workbook.CreateSheet("Sheet1");
+
+                List<String> columns = new List<string>();
+                IRow row = excelSheet.CreateRow(0);
+                int columnIndex = 0;
+
+                foreach (System.Data.DataColumn column in table.Columns)
+                {
+                    columns.Add(column.ColumnName);
+                    row.CreateCell(columnIndex).SetCellValue(column.ColumnName);
+                    columnIndex++;
+                }
+
+                int rowIndex = 1;
+                foreach (DataRow dsrow in table.Rows)
+                {
+                    row = excelSheet.CreateRow(rowIndex);
+                    int cellIndex = 0;
+                    foreach (String col in columns)
+                    {
+                        row.CreateCell(cellIndex).SetCellValue(dsrow[col].ToString());
+                        cellIndex++;
+                    }
+
+                    rowIndex++;
+                }
+                workbook.Write(fs);
+            }
+
+        }
+    }
+}

+ 1 - 0
src/platform/ZhonTai.Admin/Domain/Project/ProjectEntity.cs

@@ -44,6 +44,7 @@ namespace ZhonTai.Admin.Domain.Project
         /// <summary>
         /// 详情
         /// </summary>
+        [Column(DbType = " text")]
         public string Detail { get; set; }
         /// <summary>
         /// 作业要求

+ 5 - 1
src/platform/ZhonTai.Admin/Domain/ProjectLink/ProjectLinkEntity.cs

@@ -51,7 +51,7 @@ namespace ZhonTai.Admin.Domain.ProjectLink
         /// <summary>
         /// 使用时间
         /// </summary>
-        public DateTime UseTime { get; set; }
+        public DateTime? UseTime { get; set; }
         /// <summary>
         /// 业务员姓名
         /// </summary>
@@ -72,6 +72,10 @@ namespace ZhonTai.Admin.Domain.ProjectLink
         /// 业务员备注
         /// </summary>
         public string SalesmanRemark { get; set; }
+        /// <summary>
+        /// 查单链接
+        /// </summary>
+        public string QueryUrl { get; set; }
 
     }
 }

+ 14 - 0
src/platform/ZhonTai.Admin/Services/Project/Dto/ProjectSelectOutput.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZhonTai.Admin.Services.Project.Dto
+{
+    public class ProjectSelectOutput
+    {
+        public long Id { get; set; }
+        public string Name { get; set; }
+    }
+}

+ 16 - 0
src/platform/ZhonTai.Admin/Services/Project/ProjectService.cs

@@ -244,6 +244,21 @@ namespace ZhonTai.Admin.Services.Project
                 Type = status,
             });
         }
+
+        /// <summary>
+        /// 查询所有项目
+        /// </summary>        
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<List<ProjectSelectOutput>> GetAllAsync()
+        {            
+            var list = await _projectRepository.Select
+                .DisableGlobalFilter(FilterNames.Tenant)
+            .ToListAsync<ProjectSelectOutput>();           
+
+            return list;
+        }
+
         #region 私有方法
         /// <summary>
         /// 获取项目状态
@@ -261,5 +276,6 @@ namespace ZhonTai.Admin.Services.Project
         };
         #endregion
 
+
     }
 }

+ 5 - 1
src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/LinkExcelInput.cs

@@ -8,6 +8,10 @@ namespace ZhonTai.Admin.Services.ProjectLink.Dto
 {
     public class LinkExcelInput
     {
-        public int MyProperty { get; set; }
+        public string Num { get; set; }
+        public string ShareCommand { get; set; }
+        public string ShortUrl { get; set; }
+        public string QrcodeUrl { get; set; }
+        public string QueryUrl { get; set; }
     }
 }

+ 2 - 2
src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkGetPageDto.cs

@@ -13,9 +13,9 @@ namespace ZhonTai.Admin.Services.ProjectLink.Dto
         /// </summary>
         public int IsUse { get; set; }
         /// <summary>
-        /// 公司
+        /// 平台Id
         /// </summary>
-        public string Company { get; set; }
+        public long TenantId { get; set; }
         /// <summary>
         /// 关键字 编号,业务员姓名,手机号
         /// </summary>

+ 2 - 2
src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkListOutput.cs

@@ -43,7 +43,7 @@ namespace ZhonTai.Admin.Services.ProjectLink.Dto
         /// <summary>
         /// 使用时间
         /// </summary>
-        public DateTime UseTime { get; set; }
+        public DateTime? UseTime { get; set; }
         /// <summary>
         /// 业务员姓名
         /// </summary>
@@ -64,6 +64,6 @@ namespace ZhonTai.Admin.Services.ProjectLink.Dto
         /// 业务员备注
         /// </summary>
         public string SalesmanRemark { get; set; }
-        public long TenantId { get; set; }
+        public long? TenantId { get; set; }
     }
 }

+ 20 - 0
src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkManagePageInput.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZhonTai.Admin.Services.ProjectLink.Dto
+{
+    public class ProjectLinkManagePageInput
+    {
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public long ProjectId { get; set; }        
+        /// <summary>
+        /// 关键字 推广码来源
+        /// </summary>
+        public string Keywords { get; set; }
+    }
+}

+ 32 - 0
src/platform/ZhonTai.Admin/Services/ProjectLink/Dto/ProjectLinkManagePageOutput.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZhonTai.Admin.Services.ProjectLink.Dto
+{
+    public class ProjectLinkManagePageOutput
+    {
+        /// <summary>
+        /// 公司(推广码来源)
+        /// </summary>
+        public string ProjectName { get; set; }
+        /// <summary>
+        /// 公司(推广码来源)
+        /// </summary>
+        public string Company { get; set; }    
+        /// <summary>
+        /// 使用数量
+        /// </summary>
+        public decimal UseCount { get; set; }
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int Count { get; set; }
+        /// <summary>
+        /// 项目Id
+        /// </summary>
+        public long ProjectId { get; set; }       
+    }
+}

+ 147 - 19
src/platform/ZhonTai.Admin/Services/ProjectLink/ProjectLinkService.cs

@@ -6,6 +6,7 @@ using OnceMi.AspNetCore.OSS;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
+using System.Data;
 using System.IO;
 using System.Linq;
 using System.Text;
@@ -15,24 +16,32 @@ using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Dto;
 using ZhonTai.Admin.Core.Helpers;
 using ZhonTai.Admin.Domain.File;
+using ZhonTai.Admin.Domain.Org;
+using ZhonTai.Admin.Domain.Project;
 using ZhonTai.Admin.Domain.ProjectLink;
+using ZhonTai.Admin.Domain.Role;
 using ZhonTai.Admin.Repositories;
 using ZhonTai.Admin.Services.Project;
 using ZhonTai.Admin.Services.ProjectLink.Dto;
 using ZhonTai.Common.Files;
 using ZhonTai.Common.Helpers;
 using ZhonTai.DynamicApi;
+using ZhonTai.DynamicApi.Attributes;
 
 namespace ZhonTai.Admin.Services.ProjectLink
 {
     /// <summary>
     /// 项目推广码服务
     /// </summary>
+    [Order(10)]
+    [DynamicApi(Area = AdminConsts.AreaName)]
     public class ProjectLinkService : BaseService, IProjectLinkService, IDynamicApi
     {
         private IProjectLinkRepository _ProjectLinkRepository => LazyGetRequiredService<IProjectLinkRepository>();
+        private IProjectRepository _projectRepository => LazyGetRequiredService<IProjectRepository>();
         private OSSConfig _oSSConfig => LazyGetRequiredService<IOptions<OSSConfig>>().Value;
         private IHttpContextAccessor _httpContextAccessor => LazyGetRequiredService<IHttpContextAccessor>();
+        private IOrgRepository _orgRepository => LazyGetRequiredService<IOrgRepository>();
 
         public ProjectLinkService()
         {
@@ -48,6 +57,54 @@ namespace ZhonTai.Admin.Services.ProjectLink
         //    var result = await _ProjectLinkRepository.GetAsync<ProjectLinkGetOutput>(id);
         //    return result;
         //}
+        /// <summary>
+        /// 查询推广管理分页
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<PageOutput<ProjectLinkManagePageOutput>> GetPageAsync(PageInput<ProjectLinkManagePageInput> input)
+        {
+            var ProjectId = input.Filter?.ProjectId;
+            var key = input.Filter?.Keywords;
+
+            var list = _ProjectLinkRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
+                .WhereIf(ProjectId.HasValue && ProjectId.Value >= 0, a => a.ProjectId == ProjectId)
+                .WhereIf(key.NotNull(), a => a.Company.Contains(key))
+                .GroupBy(m=>new { m.ProjectId,m.Company})
+            .Count(out var total)
+            .Page(input.CurrentPage, input.PageSize)
+            .ToList(m => new ProjectLinkManagePageOutput()
+            {
+                ProjectId= m.Key.ProjectId,
+                Company= m.Key.Company,
+                Count= m.Count(),
+                UseCount= m.Sum(m.Value.IsUse==1?1:0),
+                ProjectName=""
+            });            
+            
+            var listProjectId = list.Select(m => m.ProjectId).Distinct().ToList();            
+            if (listProjectId.Count() > 0)
+            {
+                var listProject = await _projectRepository.Select.DisableGlobalFilter(FilterNames.Tenant).Where(m => listProjectId.Contains(m.Id)).ToListAsync(m=>new { 
+                    m.Id,
+                    m.Name
+                });
+                foreach (var item in list)
+                {
+                    var project = listProject.FirstOrDefault(m => m.Id == item.ProjectId);
+                    if (project != null)
+                        item.ProjectName = project.Name;
+                }
+            }
+            var data = new PageOutput<ProjectLinkManagePageOutput>()
+            {
+                List = list,
+                Total = total
+            };
+
+            return data;
+        }
 
         /// <summary>
         /// 查询分页
@@ -58,20 +115,21 @@ namespace ZhonTai.Admin.Services.ProjectLink
         public async Task<PageOutput<ProjectLinkListOutput>> GetPageAsync(PageInput<ProjectLinkGetPageDto> input)
         {
             var IsUse = input.Filter?.IsUse;
-            var Company = input.Filter?.Company;
+            var TenantId = input.Filter?.TenantId;
             var key = input.Filter?.Keywords;
 
             var list = await _ProjectLinkRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
                 .WhereIf(IsUse.HasValue && IsUse.Value >= 0, a => a.IsUse == IsUse)
-                .WhereIf(Company.NotNull(), a => a.Company == Company)
+                .WhereIf(TenantId.HasValue && TenantId.Value > 0, a => a.TenantId == TenantId)
             .WhereIf(key.NotNull(), a => a.Num == key || a.Salesman == key || a.SalesmanPhone == key)
             .Count(out var total)
+            .OrderByDescending(true, c => c.UseTime)
             .OrderByDescending(true, c => c.Id)
             .Page(input.CurrentPage, input.PageSize)
             .ToListAsync(m => new ProjectLinkListOutput()
             {
                 Company = m.Company,
-                OrgName = m.TenantId.ToString(),
+                OrgName = "",
                 Num = m.Num,
                 ShortUrl = m.ShortUrl,
                 QrcodeUrl = m.QrcodeUrl,
@@ -81,8 +139,20 @@ namespace ZhonTai.Admin.Services.ProjectLink
                 Salesman = m.Salesman,
                 SalesmanPhone = m.SalesmanPhone,
                 SalesmanRemark = m.SalesmanRemark,
+                TenantId = m.TenantId
             });
-
+            List<OrgEntity> listOrg = null;
+            var listTenantId = list.Where(m => m.TenantId.HasValue).Select(m => m.TenantId).Distinct().ToList();
+            if (listTenantId.Count() > 0)
+            {
+                listOrg = await _orgRepository.Select.Where(m => listTenantId.Contains(m.TenantId.Value)).ToListAsync();
+                foreach (var item in list)
+                {
+                    var org = listOrg.FirstOrDefault(m => m.TenantId == item.TenantId);
+                    if (org != null)
+                        item.OrgName = org.Name;
+                }
+            }
             var data = new PageOutput<ProjectLinkListOutput>()
             {
                 List = list,
@@ -98,35 +168,30 @@ namespace ZhonTai.Admin.Services.ProjectLink
         /// <param name="ProjectId">文件目录</param>
         /// <param name="Company">文件重命名</param>
         /// <returns></returns>
-        public async Task UploadLinkAsync([Required] IFormFile file,[Required] long ProjectId, [Required] string Company)
+        public async Task UploadLinkAsync([Required] IFormFile file, [Required] long ProjectId, [Required] string Company)
         {
             var localUploadConfig = _oSSConfig.LocalUploadConfig;
 
             var extention = Path.GetExtension(file.FileName).ToLower();
-            if (extention != "excel")
+            if (extention != ".xlsx")
             {
                 throw new Exception($"请上传excel格式文件");
             }
-            var hasIncludeExtension = localUploadConfig.IncludeExtension?.Length > 0;
-            if (hasIncludeExtension && !localUploadConfig.IncludeExtension.Contains(extention))
-            {
-                throw new Exception($"不允许上传{extention}文件格式");
-            }
-            var hasExcludeExtension = localUploadConfig.ExcludeExtension?.Length > 0;
-            if (hasExcludeExtension && localUploadConfig.ExcludeExtension.Contains(extention))
+            var fileLenth = file.Length;
+            if (fileLenth <= 0)
             {
-                throw new Exception($"不允许上传{extention}文件格式");
+                throw new Exception("文件不能为空");
             }
-
-            var fileLenth = file.Length;
             if (fileLenth > localUploadConfig.MaxSize)
             {
                 throw new Exception($"文件大小不能超过{new FileSize(localUploadConfig.MaxSize)}");
             }
-            if (ProjectId <= 0) { 
-
+            if (ProjectId <= 0)
+            {
+                throw new Exception($"请输入有效项目Id");
             }
 
+
             string fileDirectory = "link";
 
             string SaveFileName = FreeUtil.NewMongodbId().ToString();
@@ -143,7 +208,70 @@ namespace ZhonTai.Admin.Services.ProjectLink
             filePath = Path.Combine(env.WebRootPath, filePath).ToPath();
             await uploadHelper.SaveAsync(file, filePath);
 
-            var list= ExcelHelper.LoadFromExcel<LinkExcelInput>(filePath);            
+            //导入数据
+            var datatable = NOPIHelper.ReadExcel(filePath);
+            if (datatable == null || datatable.Rows.Count <= 0)
+            {
+                throw new Exception($"文件不能为空");
+            }
+            if (datatable.Columns["编号"] == null || datatable.Columns["口令"] == null || datatable.Columns["短链"] == null || datatable.Columns["二维码"] == null || datatable.Columns["查单链接"] == null)
+            {
+                throw new Exception($"导入格式不正确");
+            }
+            var projectAny = await _projectRepository.Select.DisableGlobalFilter(FilterNames.Tenant).Where(m => m.Id == ProjectId).AnyAsync();
+            if (!projectAny)
+            {
+                throw new Exception($"项目不存在");
+            }
+            var ListCompany = _ProjectLinkRepository.Select.DisableGlobalFilter(FilterNames.Tenant).Where(m => m.ProjectId == ProjectId)
+                 .GroupBy(m => m.Company).Select(m => m.Key).ToList();
+            if (ListCompany.Count > 0 && !ListCompany.Contains(Company))
+            {
+                throw new Exception($"一个项目只能上传一个推广码来源");
+            }
+            List<string> listNum = (from d in datatable.AsEnumerable() select d.Field<string>("编号")).ToList();
+            var count = await _ProjectLinkRepository.Select.DisableGlobalFilter(FilterNames.Tenant).Where(m => listNum.Contains(m.Num)).CountAsync();
+            if (count > 0)
+            {
+                throw new Exception($"编码重复");
+            }
+            List<ProjectLinkEntity> list = new List<ProjectLinkEntity>();
+            foreach (DataRow row in datatable.Rows)
+            {
+                list.Add(new ProjectLinkEntity()
+                {
+                    Num = row["编号"]?.ToString(),
+                    ShareCommand = row["口令"]?.ToString(),
+                    ShortUrl = row["短链"]?.ToString(),
+                    QrcodeUrl = row["二维码"]?.ToString(),
+                    QueryUrl = row["查单链接"]?.ToString(),
+                    ProjectId = ProjectId,
+                    Company = Company,
+                    TenantId = -1
+                });
+            }
+            await _ProjectLinkRepository.InsertAsync(list);
+        }
+        /// <summary>
+        /// 下载推广码模板
+        /// </summary>        
+        /// <returns></returns>        
+        [HttpGet]
+        public string DownLinkCodeAsync()
+        {
+            string fileDirectory = "link";
+            var filePath = Path.Combine(fileDirectory, "linkcode.xlsx").ToPath();
+
+            var env = LazyGetRequiredService<IWebHostEnvironment>();
+            var file = Path.Combine(env.WebRootPath, filePath).ToPath();
+            if (!System.IO.File.Exists(file))
+            {
+                throw new Exception($"推广码模板文件不存在");
+            }
+
+            var linkUrl = $"{_httpContextAccessor.HttpContext.Request.Scheme}://{_httpContextAccessor.HttpContext.Request.Host.Value}/{filePath}";
+
+            return linkUrl;
         }
 
         ///// <summary>

+ 21 - 0
src/platform/ZhonTai.Admin/Services/Tenant/Dto/TenantSelectListOutput.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ZhonTai.Admin.Services.Tenant.Dto
+{
+    public class TenantSelectListOutput
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 企业名称
+        /// </summary>
+        public string Name { get; set; }        
+    }
+}

+ 20 - 4
src/platform/ZhonTai.Admin/Services/Tenant/TenantService.cs

@@ -325,8 +325,8 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
             tenant.PlatfromUserId = platfromUserId;
             await _tenantRepository.UpdateAsync(tenant);
 
-            
-            
+
+
             return tenant.Id;
         }
     }
@@ -434,11 +434,11 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
                 //清除租户下所有用户权限缓存
                 await LazyGetRequiredService<PkgService>().ClearUserPermissionsAsync(new List<long> { tenant.Id });
             }
-            
+
             //更新平台用户
             await _platformUserRepository.UpdateDiy.DisableGlobalFilter(FilterNames.Tenant).SetSource(new PlatformUserEntity()
             {
-                Id=tenant.PlatfromUserId,
+                Id = tenant.PlatfromUserId,
                 Name = input.RealName,
                 Phone = input.Phone,
             }).UpdateColumns(m => new { m.Name, m.Phone }).ExecuteAffrowsAsync();
@@ -584,4 +584,20 @@ public class TenantService : BaseService, ITenantService, IDynamicApi
         }
         return invite;
     }
+    /// <summary>
+    /// 查询所有租户企业信息
+    /// </summary>    
+    /// <returns></returns>
+    [HttpGet]
+    public async Task<List<TenantSelectListOutput>> GetAllAsync()
+    {
+        var list = await _tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant)
+        .ToListAsync(a => new TenantSelectListOutput
+        {
+            Id = a.Id,
+            Name = a.Org.Name
+        });
+
+        return list;
+    }
 }

+ 1 - 0
src/platform/ZhonTai.Admin/ZhonTai.Admin.csproj

@@ -15,6 +15,7 @@
 		<PackageReference Include="Autofac.Extras.DynamicProxy" Version="6.0.1" />
 		<PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.1.0" />
 		<PackageReference Include="DotNetCore.CAP" Version="7.1.1" />
+		<PackageReference Include="DotNetCore.NPOI" Version="1.2.3" />
 		<PackageReference Include="FluentValidation.AspNetCore" Version="11.3.0" />
 		<PackageReference Include="FreeRedis" Version="1.0.8" />
 		<PackageReference Include="FreeRedis.DistributedCache" Version="1.0.5" />

+ 125 - 0
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -1911,6 +1911,11 @@
             <param name="FileName"></param>
             <returns></returns>
         </member>
+		<member name="T:ZhonTai.Admin.Core.Helpers.NOPIHelper">
+			<summary>
+				Excel帮助类
+			</summary>
+		</member>
         <member name="T:ZhonTai.Admin.Core.Helpers.UploadHelper">
             <summary>
             文件上传帮助类
@@ -3032,6 +3037,11 @@
             业务员备注
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.ProjectLink.ProjectLinkEntity.QueryUrl">
+            <summary>
+            查单链接
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.Project.ProjectEntity">
             <summary>
             拉新项目
@@ -6878,6 +6888,51 @@
             二维码链接
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkGetPageDto.IsUse">
+            <summary>
+            是否使用 1使用 0未使用
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkGetPageDto.TenantId">
+            <summary>
+            平台Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkGetPageDto.Keywords">
+            <summary>
+            关键字 编号,业务员姓名,手机号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.Company">
+            <summary>
+            公司(推广码来源)
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.OrgName">
+            <summary>
+            所属平台
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.QrcodeType">
+            <summary>
+            二维码类型
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.Num">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.ShortUrl">
+            <summary>
+            短链
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.QrcodeUrl">
+            <summary>
+            二维码链接
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkListOutput.ShareCommand">
             <summary>
             推广口令
@@ -6918,11 +6973,53 @@
             业务员备注
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageInput.ProjectId">
+            <summary>
+            项目Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageInput.Keywords">
+            <summary>
+            关键字 推广码来源
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageOutput.ProjectName">
+            <summary>
+            公司(推广码来源)
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageOutput.Company">
+            <summary>
+            公司(推广码来源)
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageOutput.UseCount">
+            <summary>
+            使用数量
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageOutput.Count">
+            <summary>
+            总数
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageOutput.ProjectId">
+            <summary>
+            项目Id
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Services.ProjectLink.ProjectLinkService">
             <summary>
             项目推广码服务
             </summary>
         </member>
+        <member name="M:ZhonTai.Admin.Services.ProjectLink.ProjectLinkService.GetPageAsync(ZhonTai.Admin.Core.Dto.PageInput{ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkManagePageInput})">
+            <summary>
+            查询推广管理分页
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
         <member name="M:ZhonTai.Admin.Services.ProjectLink.ProjectLinkService.GetPageAsync(ZhonTai.Admin.Core.Dto.PageInput{ZhonTai.Admin.Services.ProjectLink.Dto.ProjectLinkGetPageDto})">
             <summary>
             查询分页
@@ -6939,6 +7036,12 @@
             <param name="Company">文件重命名</param>
             <returns></returns>
         </member>
+        <member name="M:ZhonTai.Admin.Services.ProjectLink.ProjectLinkService.DownLinkCodeAsync">
+            <summary>
+            下载推广码模板
+            </summary>        
+            <returns></returns>        
+        </member>
         <member name="P:ZhonTai.Admin.Services.Project.Dto.ProjectAddInput.Id">
             <summary>
             项目Id
@@ -7085,6 +7188,12 @@
             <param name="status">状态 2上架 3下架 4暂停</param>
              <returns></returns>
         </member>
+        <member name="M:ZhonTai.Admin.Services.Project.ProjectService.GetAllAsync">
+            <summary>
+            查询所有项目
+            </summary>        
+            <returns></returns>
+        </member>
         <member name="M:ZhonTai.Admin.Services.Project.ProjectService.GetStatusText(System.Int32)">
             <summary>
             获取项目状态
@@ -7709,6 +7818,16 @@
             创建时间
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.Tenant.Dto.TenantSelectListOutput.Id">
+            <summary>
+            主键
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.Tenant.Dto.TenantSelectListOutput.Name">
+            <summary>
+            企业名称
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Services.Tenant.Dto.TenantSetEnableInput">
             <summary>
             设置启用
@@ -7800,6 +7919,12 @@
             <param name="input"></param>
             <returns></returns>
         </member>
+        <member name="M:ZhonTai.Admin.Services.Tenant.TenantService.GetAllAsync">
+            <summary>
+            查询所有租户企业信息
+            </summary>    
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Admin.Services.Tenant.MapConfig">
             <summary>
             映射配置

+ 0 - 1
src/platform/ZhonTai.Common/ZhonTai.Common.csproj

@@ -11,7 +11,6 @@
   </PropertyGroup>
 
   <ItemGroup>
-	<PackageReference Include="EPPlus" Version="6.2.3" />
 	<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
 	<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
 	<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />