|
@@ -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>
|