diff --git a/CloudBuilder/CloudBuilder.Core/Policy/AppsettingsPolicy.cs b/CloudBuilder/CloudBuilder.Core/Policy/AppsettingsPolicy.cs
new file mode 100644
index 0000000..2b2c5bd
--- /dev/null
+++ b/CloudBuilder/CloudBuilder.Core/Policy/AppsettingsPolicy.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CloudBuilder.Core.Policy
+{
+ public class AppsettingsPolicy
+ {
+ public const string ApplicationUrl = "ApplicationUrl";
+ public const string UrlOrigins = "UrlOrigins";
+ public const string ExcelOutputDirectory = "FileServiceSettings:ExcelOutputDirectory";
+ }
+}
diff --git a/CloudBuilder/CloudBuilder.Core/Report/DataToExcelHelper.cs b/CloudBuilder/CloudBuilder.Core/Report/DataToExcelHelper.cs
index acabc75..49b5253 100644
--- a/CloudBuilder/CloudBuilder.Core/Report/DataToExcelHelper.cs
+++ b/CloudBuilder/CloudBuilder.Core/Report/DataToExcelHelper.cs
@@ -1,20 +1,21 @@
using ClosedXML.Excel;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Core.Extensions;
+using CloudBuilder.Core.Policy;
using CloudBuilder.Core.Service;
-using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Spreadsheet;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.SqlTypes;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
-using System.Diagnostics;
namespace CloudBuilder.Core.Report
{
@@ -179,7 +180,7 @@ CellTypeFormatOperation cellOperation, XLWorksheetOperation xLWorksheetOperation
if (service != null)
{
- fileFullname = Path.Combine(service.Configuration["FileServiceSettings:ExcelOutputDirectory"], $"{DateTime.Now.ToString("yyyyMMdd")}", typeof(T).Name + $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.xlsx");
+ fileFullname = Path.Combine(service.Configuration[AppsettingsPolicy.ExcelOutputDirectory], $"{DateTime.Now.ToString("yyyyMMdd")}", typeof(T).Name + $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}.xlsx");
}
using (var excel = new XLWorkbook())
diff --git a/CloudBuilder/CloudBuilder.Core/Service/SearchCriteriaResultData.cs b/CloudBuilder/CloudBuilder.Core/Service/SearchCriteriaResultData.cs
index 758a9fb..bfc6777 100644
--- a/CloudBuilder/CloudBuilder.Core/Service/SearchCriteriaResultData.cs
+++ b/CloudBuilder/CloudBuilder.Core/Service/SearchCriteriaResultData.cs
@@ -9,7 +9,7 @@ namespace CloudBuilder.Core.Service
public int Page { get; set; }
- public int Total { get; set; }
+ public Int64 Total { get; set; }
public string? Sql { get; set; }
diff --git a/CloudBuilder/CloudBuilder.Master.Service/CloudBuilder.Master.Service.csproj b/CloudBuilder/CloudBuilder.Master.Service/CloudBuilder.Master.Service.csproj
index 078dc6c..ee7e55f 100644
--- a/CloudBuilder/CloudBuilder.Master.Service/CloudBuilder.Master.Service.csproj
+++ b/CloudBuilder/CloudBuilder.Master.Service/CloudBuilder.Master.Service.csproj
@@ -30,8 +30,10 @@
-
+
+
+
diff --git a/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs
new file mode 100644
index 0000000..c62218a
--- /dev/null
+++ b/CloudBuilder/CloudBuilder.Master.Service/DmsFileService.auto.cs
@@ -0,0 +1,1425 @@
+
+using CliWrap;
+using CloudBuilder.Core.DatabaseAccessor;
+using CloudBuilder.Core.DatabaseAccessor.Entity;
+using CloudBuilder.Core.Service;
+using CloudBuilder.Master.Data;
+using CloudBuilder.Master.Entity;
+using CloudBuilder.Master.Policy;
+using CloudBuilder.Master.SearchCriteria;
+using CloudBuilder.Security.Policy;
+using CloudBuilder.Security.Service;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using SixLabors.ImageSharp;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Processing;
+using System;
+using static System.Net.Mime.MediaTypeNames;
+using Image = SixLabors.ImageSharp.Image;
+namespace CloudBuilder.Master.Service
+{
+ public class DmsFileService : IDmsFileService
+ {
+ private readonly IApplicationService service;
+ private readonly IHttpContextAccessor httpContextAccessor;
+ private IRepository repository;
+ public DmsFileService(IApplicationService service, IHttpContextAccessor httpContextAccessor)
+ {
+ this.service = service;
+ this.httpContextAccessor = httpContextAccessor;
+ repository = service.GetRepository>();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFileEntity FindByKey(long key)
+ {
+ return repository.DetachedEntities.Where(x => x.FileId == key).FirstOrDefault()!;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFileResultData FindBySearchCriteria(DmsFileSearchCriteria criteria)
+ {
+ DmsFileResultData data = new DmsFileResultData();
+ DmsFileUploadViewEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ sqlWhere = sqlWhere + string.Format(" and {0} ='{1}' ", DmsFileUploadViewEntity.DB_CREATED_BY, service.UserId);
+
+ DmsFileUploadViewEntity entity = DmsFileUploadViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ IRepository repositoryView = repository.GetRepository>();
+
+ string err = null;
+ try
+ {
+ list = repositoryView.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+
+ if (list != null && list.Length > 0)
+ {
+ //list = list.OrderByDescending(x => x.IsDirectoryIndc).ThenByDescending(x => x.CreatedDatetime).ToArray();
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath];
+ var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory];
+ var scale = service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory].Replace(phy, "");
+ List prvs = new List();
+ //bool isAttached = Debugger.IsAttached;
+ foreach (var item in list)
+ {
+ item.Url = FileTypePolicy.PackUrl(service, item.CreatedBy, item.OrderKey, item.TranscodeIndc);
+ }
+
+ data.Datas = list.Select(x => new DmsFileUploadViewDisplayData(x)
+ {
+ FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
+ }).ToArray();
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFileResultData FindDatasBySearchCriteria(DmsFileSearchCriteria criteria)
+ {
+ DmsFileResultData data = new DmsFileResultData();
+ DmsFileUploadViewEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ sqlWhere = sqlWhere + string.Format(" and {0} ='{1}' and {2} ='{3}' ",
+ DmsFileUploadViewEntity.DB_CREATED_BY, service.UserId,
+ DmsFileUploadViewEntity.DB_IS_DIRECTORY_INDC, YesNoPolicy.NO
+ );
+
+ DmsFileUploadViewEntity entity = DmsFileUploadViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ IRepository repositoryView = repository.GetRepository>();
+
+ string err = null;
+ try
+ {
+ list = repositoryView.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+
+ if (list != null && list.Length > 0)
+ {
+ //list = list.OrderByDescending(x => x.IsDirectoryIndc).ThenByDescending(x => x.CreatedDatetime).ToArray();
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath];
+ var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory];
+ var scale = service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory].Replace(phy, "");
+ List prvs = new List();
+ //bool isAttached = Debugger.IsAttached;
+ foreach (var item in list)
+ {
+ item.Url = FileTypePolicy.PackUrl(service, item.CreatedBy, item.OrderKey, item.TranscodeIndc);
+ }
+
+ data.Datas = list.Select(x => new DmsFileUploadViewDisplayData(x)
+ {
+ FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
+ }).ToArray();
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFileResultData FindDeleteLogBySearchCriteria(DmsFileSearchCriteria criteria)
+ {
+ DmsFileResultData data = new DmsFileResultData();
+ DmsFileUploadDeleteLogViewEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ sqlWhere = sqlWhere + string.Format(" and {0} ='{1}' ", DmsFileUploadViewEntity.DB_CREATED_BY, service.UserId);
+
+ DmsFileUploadDeleteLogViewEntity entity = DmsFileUploadDeleteLogViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ IRepository repositoryView = repository.GetRepository>();
+
+ string err = null;
+ try
+ {
+ list = repositoryView.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ //list = list.OrderByDescending(x => x.IsDirectoryIndc).ThenByDescending(x => x.CreatedDatetime).ToArray();
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath];
+ var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory];
+ var scale = service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory].Replace(phy, "");
+
+ foreach (var item in list)
+ {
+ item.Url = FileTypePolicy.PackUrl(service, item.CreatedBy, item.OrderKey, item.TranscodeIndc);
+ }
+
+ data.Logs = list.Select(x => new DmsFileUploadDeleteLogViewDisplayData(x)
+ {
+ FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
+ }).ToArray();
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFileResultData FindFamilyBySearchCriteria(DmsFileSearchCriteria criteria)
+ {
+ DmsFileResultData data = new DmsFileResultData();
+ FamilyDmsFileViewEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ if (criteria.UserIdIndc == true || criteria.Filter.Where(x => x.Column == FamilyDmsFileViewEntity.DB_FAMILY_NAME).Count() == 0)
+ {
+ sqlWhere = sqlWhere + string.Format(" and {0} ='{1}' ", FamilyDmsFileViewEntity.DB_CREATED_BY, service.UserId);
+ }
+
+ if (string.IsNullOrEmpty(sqlWhere)) sqlWhere = " and 1=0 ";
+
+ FamilyDmsFileViewEntity entity = FamilyDmsFileViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ IRepository repositoryView = repository.GetRepository>();
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+ IRepository repositoryFamilyFolderFavorite = repository.GetRepository>();
+
+ FamilyGroupPermissionEntity[] permissionEntities = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.UserName == service.UserId).ToArray();
+ FamilyFolderFavoriteEntity[] favorites = repositoryFamilyFolderFavorite.DetachedEntities.Where(x => x.UserName == service.UserId).ToArray();
+
+ string err = null;
+ try
+ {
+ list = repositoryView.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+
+ foreach (var item in list)
+ {
+ if (permissionEntities != null && permissionEntities.Length > 0)
+ {
+ foreach (var p in permissionEntities)
+ {
+ if (item.TopFolderName == p.FolderName)
+ {
+ item.PermissionIndc = YesNoPolicy.YES;
+ break;
+ }
+ }
+ }
+
+ if (favorites != null && favorites.Length > 0)
+ {
+ foreach (var f in favorites)
+ {
+ if (item.FolderName == f.FolderName)
+ {
+ item.FavoriteIndc = YesNoPolicy.YES;
+ break;
+ }
+ }
+ }
+ }
+
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath];
+ var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory];
+ var scale = service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory].Replace(phy, "");
+
+
+ foreach (var item in list)
+ {
+ item.Url = FileTypePolicy.PackUrl(service, item.CreatedBy, item.OrderKey, item.TranscodeIndc);
+ }
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+ data.Families = list.Select(x => new FamilyDmsFileViewDisplayData(x) { FileType = FileTypePolicy.GetType(x.OrderKey) }).ToArray();
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFileDeleteLogEntity FindDmsFileDeleteLogByKey(long key)
+ {
+ IRepository repositoryDmsFileDeleteLog = repository.GetRepository>();
+
+ return repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileId == key).FirstOrDefault()!;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Print)]
+ public dynamic PrintBySearchCriteria(DmsFileSearchCriteria criteria)
+ {
+ throw new NotImplementedException();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
+ [UnitOfWork]
+ public DmsFileEntity Insert(DmsFileEntity data)
+ {
+ throw new NotImplementedException();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Update)]
+ [UnitOfWork]
+ public DmsFileEntity Update(DmsFileEntity data)
+ {
+ throw new NotImplementedException();
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Delete)]
+ [UnitOfWork]
+ public void Delete(long key)
+ {
+ DmsFileEntity dmsFile = repository.DetachedEntities.Where(x => x.FileId == key).FirstOrDefault()!;
+
+ if (dmsFile == null) return;
+
+ IRepository repositoryUpload = repository.GetRepository>();
+ IRepository repositoryFolderMap = repository.GetRepository>();
+ IRepository repositoryFolder = repository.GetRepository>();
+
+ repository.DeleteNow(dmsFile);
+
+ IRepository repositoryDmsFileDeleteLog = repository.GetRepository>();
+ DmsFileDeleteLogEntity dmsFileDeleteLogEntity = new DmsFileDeleteLogEntity();
+ ObjectCopyHelper.Copy(dmsFile, dmsFileDeleteLogEntity);
+ repositoryDmsFileDeleteLog.InsertNow(dmsFileDeleteLogEntity);
+
+ DmsFileUploadEntity DmsFileUpload = repositoryUpload.DetachedEntities.Where(x => x.FileId == key).FirstOrDefault()!;
+
+ IRepository repositoryDmsFileUploadDeleteLog = repository.GetRepository>();
+ IRepository repositoryDmsFolderDeleteLog = repository.GetRepository>();
+ IRepository repositoryDmsFolderMapDeleteLog = repository.GetRepository>();
+
+ if (DmsFileUpload != null)
+ {
+ repositoryUpload.DeleteNow(DmsFileUpload);
+
+ DmsFileUploadDeleteLogEntity DmsFileUploadDeleteLogEntity = new DmsFileUploadDeleteLogEntity();
+ ObjectCopyHelper.Copy(DmsFileUpload, DmsFileUploadDeleteLogEntity);
+ repositoryDmsFileUploadDeleteLog.InsertNow(DmsFileUploadDeleteLogEntity);
+ }
+
+ if (dmsFile.IsDirectoryIndc == YesNoPolicy.YES)
+ {
+ DmsFolderEntity folder = repositoryFolder.DetachedEntities.Where(x => x.FolderName == dmsFile.FileName).FirstOrDefault()!;
+
+ if (folder == null) return;
+
+ if (folder != null)
+ {
+ repositoryFolder.DeleteNow(folder);
+
+ DmsFolderDeleteLogEntity dfdLog = new DmsFolderDeleteLogEntity();
+ ObjectCopyHelper.Copy(folder, dfdLog);
+ repositoryDmsFolderDeleteLog.InsertNow(dfdLog);
+
+ }
+
+ DmsFolderMapEntity[] folderMaps = repositoryFolderMap.DetachedEntities.Where(x => x.FolderNameSon == dmsFile.FileName || x.FolderNameParent == dmsFile.FileName).ToArray();
+
+ DmsFolderMapDeleteLogEntity dmsFolderMapEntity;
+ if (folderMaps != null && folderMaps.Length > 0)
+ {
+ foreach (var map in folderMaps)
+ {
+ repositoryFolderMap.DeleteNow(map);
+ dmsFolderMapEntity = new DmsFolderMapDeleteLogEntity();
+ ObjectCopyHelper.Copy(map, dmsFolderMapEntity);
+ repositoryDmsFolderMapDeleteLog.InsertNow(dmsFolderMapEntity);
+
+ if (map.FolderNameSon == folder.FolderName) continue;
+ //刪除dmsfoler下的所有內容
+ DeleteFolder(map.FolderNameSon);
+ }
+ }
+
+
+ }
+ else
+ {
+ //删除文件与文件夹的映射关系
+ DmsFolderMapEntity folderMap = repositoryFolderMap.DetachedEntities.Where(x => x.FolderNameSon == dmsFile.FileName).FirstOrDefault();
+ if (folderMap != null)
+ repositoryFolderMap.DeleteNow(folderMap);
+ }
+
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Delete)]
+ [UnitOfWork]
+ public void DeleteLog(long key)
+ {
+ IRepository repositoryDmsFileDeleteLog = repository.GetRepository>();
+
+ DmsFileDeleteLogEntity dmsFile = repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileId == key).FirstOrDefault()!;
+
+ if (dmsFile == null) return;
+
+ repositoryDmsFileDeleteLog.DeleteNow(dmsFile);
+
+ IRepository repositoryDmsFileUploadDeleteLog = repository.GetRepository>();
+
+ DmsFileUploadDeleteLogEntity DmsFileUpload = repositoryDmsFileUploadDeleteLog.DetachedEntities.Where(x => x.FileId == key).FirstOrDefault()!;
+
+ if (DmsFileUpload != null)
+ {
+ repositoryDmsFileUploadDeleteLog.DeleteNow(DmsFileUpload);
+ }
+
+ if (dmsFile.IsDirectoryIndc == YesNoPolicy.YES)
+ {
+ IRepository repositoryDmsFolderDeleteLog = repository.GetRepository>();
+ DmsFolderDeleteLogEntity folder = repositoryDmsFolderDeleteLog.DetachedEntities.Where(x => x.FolderName == dmsFile.FileName).FirstOrDefault()!;
+
+ if (folder == null) return;
+
+ if (folder != null)
+ {
+ repositoryDmsFolderDeleteLog.DeleteNow(folder);
+ }
+
+ IRepository repositoryDmsFolderMapDeleteLog = repository.GetRepository>();
+ DmsFolderMapDeleteLogEntity[] folderMaps = repositoryDmsFolderMapDeleteLog.DetachedEntities.Where(x => x.FolderNameSon == dmsFile.FileName || x.FolderNameParent == dmsFile.FileName).ToArray();
+
+ if (folderMaps != null && folderMaps.Length > 0)
+ {
+ foreach (var map in folderMaps)
+ {
+ repositoryDmsFolderMapDeleteLog.DeleteNow(map);
+
+ if (map.FolderNameSon == folder.FolderName) continue;
+ //刪除dmsfoler下的所有內容
+ DeleteFolderDeleteLog(map.FolderNameSon);
+ }
+ }
+
+
+ }
+
+ }
+
+ private void DeleteFolderDeleteLog(string folderName)
+ {
+ IRepository repositoryDmsFileDeleteLog = repository.GetRepository>();
+
+ DmsFileDeleteLogEntity[] dmsFiles = repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileName == folderName).ToArray();
+ if (dmsFiles == null || dmsFiles.Length == 0) return;
+ foreach (var dmsFile in dmsFiles)
+ {
+ DeleteLog(dmsFile.FileId);
+ }
+ }
+
+ public void DeleteFolder(string folderName)
+ {
+ DmsFileEntity[] dmsFiles = repository.DetachedEntities.Where(x => x.FileName == folderName).ToArray();
+ if (dmsFiles == null || dmsFiles.Length == 0) return;
+ foreach (var dmsFile in dmsFiles)
+ {
+ Delete(dmsFile.FileId);
+ }
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
+ [UnitOfWork]
+ public string CreateDmsFolder(DmsFileEntity dmsFile)
+ {
+ IRepository repositoryFolder = repository.GetRepository>();
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ DmsFolderEntity folder = null;
+ string folderNameParent = dmsFile.FilePath;
+ //父目录是空,创建顶级目录
+
+ folder = repositoryFolder.DetachedEntities.Where(x => x.FolderLocalName == service.UserId).FirstOrDefault()!;
+ if (folder == null)
+ {
+ folder = new DmsFolderEntity();
+ folder.FolderName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.DMS_FOLDER, MasterPrefixPolicy.DMS_FOLDER_FOLDER_NAME, "DR", YesNoPolicy.NO, "00000000");
+ folder.FolderLocalName = service.UserId;
+ repositoryFolder.InsertNow(folder);
+ }
+
+ if (string.IsNullOrEmpty(dmsFile.FilePath))
+ {
+ folderNameParent = folder.FolderName;
+ }
+
+ //创建当前目录
+ folder = new DmsFolderEntity();
+ folder.FolderName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.DMS_FOLDER, MasterPrefixPolicy.DMS_FOLDER_FOLDER_NAME, "DR", YesNoPolicy.NO, "00000000");
+ folder.FolderLocalName = dmsFile.FileName;
+ repositoryFolder.InsertNow(folder);
+ //创建目录关系表
+ DmsFolderMapEntity map = new DmsFolderMapEntity();
+ IRepository repositoryFolderMap = repository.GetRepository>();
+ map.FolderNameParent = folderNameParent;
+ map.FolderNameSon = folder.FolderName;
+ repositoryFolderMap.InsertNow(map);
+
+ //创建Dms目录
+ DmsFileEntity entity = new DmsFileEntity();
+ entity.OrderKey = entity.FileName = folder.FolderName;
+ entity.OrgFileName = dmsFile.FileName;
+ entity.AllowDeleteIndc = entity.AllowRenameIndc = entity.IsDirectoryIndc = YesNoPolicy.YES;
+
+ entity.FilePath = folderNameParent;
+
+ entity.OwerId = service.UserId;
+ entity.IsLinkIndc = YesNoPolicy.NO;
+
+ repository.InsertNow(entity);
+
+ DmsFileUploadEntity upload = new DmsFileUploadEntity();
+ upload.FileId = entity.FileId;
+ upload.FileCategory = "MASTER";
+ upload.UploadName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.UPLOAD_DMS_FILE, MasterPrefixPolicy.UPLOAD_DMS_FILE_UPLOAD_NAME, "DR", YesNoPolicy.NO, MasterPrefixPolicy.UPLOAD_DMS_FILE_FORMAT);
+ upload.OrgFileName = entity.OrgFileName;
+
+ IRepository repositoryUpload = repository.GetRepository>();
+
+ repositoryUpload.InsertNow(upload);
+
+ return folder.FolderName;
+ }
+
+ public void CreateFamilyDmsFolder(FamilyGroupEntity familyGroup, FamilyGroupFolderEntity[] familyGroupFolders)
+ {
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ IRepository repositoryFolder = repository.GetRepository>();
+ DmsFolderEntity folder = repositoryFolder.DetachedEntities.Where(x => x.FolderLocalName == familyGroup.FamilyName).FirstOrDefault()!;
+ if (folder == null)
+ {
+ folder = new DmsFolderEntity();
+ folder.FolderName = familyGroup.FamilyName;
+ folder.FolderLocalName = familyGroup.FamilyName;
+ repositoryFolder.InsertNow(folder);
+ }
+
+ if (familyGroupFolders != null && familyGroupFolders.Length > 0)
+ CreateFamilyGroupFolderDetail(folder, familyGroupFolders);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
+ [UnitOfWork]
+ public void CreateFamilyDmsFolder(FamilyDmsFileViewEntity familyDmsFile)
+ {
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ IRepository repositoryFolder = repository.GetRepository>();
+
+ //上级目录
+ FamilyGroupFolderEntity folder = repositoryFolder.DetachedEntities.Where(x => x.FolderName == familyDmsFile.FilePath).FirstOrDefault()!;
+ if (folder == null) return;
+
+ if (string.IsNullOrEmpty(familyDmsFile.FolderLocalName)) return;
+
+ CreateFamilyGroupFolder(folder, familyDmsFile);
+ }
+
+ private void CreateFamilyGroupFolder(FamilyGroupFolderEntity dmsFolder, FamilyDmsFileViewEntity familyDmsFile)
+ {
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ IRepository repositoryFolder = repository.GetRepository>();
+ IRepository repositoryFolderMap = repository.GetRepository>();
+
+ DmsFolderEntity folder;
+ DmsFolderMapEntity map;
+ DmsFileEntity entity;
+
+ FamilyGroupFolderEntity familyGroupFolder = new FamilyGroupFolderEntity();
+ familyGroupFolder.FamilyName = familyDmsFile.FamilyName;
+ familyGroupFolder.FolderName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.DMS_FOLDER, MasterPrefixPolicy.DMS_FOLDER_FOLDER_NAME, "FG", YesNoPolicy.NO, "00000000");
+ familyGroupFolder.FolderLocalName = familyDmsFile.FolderLocalName;
+ familyGroupFolder.Notice = familyDmsFile.Notice;
+ //设置顶级目录
+ familyGroupFolder.TopFolderName = dmsFolder.TopFolderName;
+
+ IRepository repositoryFamilyGroupFolder = repository.GetRepository>();
+
+ repositoryFamilyGroupFolder.InsertNow(familyGroupFolder);
+
+ folder = new DmsFolderEntity();
+ folder.FolderName = familyGroupFolder.FolderName;
+ folder.FolderLocalName = familyGroupFolder.FolderLocalName;
+ repositoryFolder.InsertNow(folder);
+
+ map = new DmsFolderMapEntity();
+ map.FolderNameParent = dmsFolder.FolderName;
+ map.FolderNameSon = folder.FolderName;
+ repositoryFolderMap.InsertNow(map);
+
+ //创建Dms目录
+ entity = new DmsFileEntity();
+ entity.OrderKey = entity.FileName = familyGroupFolder.FolderName;
+ entity.OrgFileName = folder.FolderLocalName;
+ entity.AllowDeleteIndc = entity.AllowRenameIndc = entity.IsDirectoryIndc = YesNoPolicy.YES;
+
+ entity.FilePath = map.FolderNameParent;
+
+ entity.OwerId = folder.FolderName;
+ entity.IsLinkIndc = YesNoPolicy.NO;
+
+ repository.InsertNow(entity);
+ }
+
+
+ private void CreateFamilyGroupFolderDetail(DmsFolderEntity dmsFolder, FamilyGroupFolderEntity[] familyGroupFolders)
+ {
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ IRepository repositoryFolder = repository.GetRepository>();
+ IRepository repositoryFolderMap = repository.GetRepository>();
+
+ DmsFolderEntity folder;
+ DmsFolderMapEntity map;
+ DmsFileEntity entity;
+ foreach (var item in familyGroupFolders)
+ {
+ //如果是已创建,则跳过
+ if (!string.IsNullOrEmpty(item.CreatedBy)) continue;
+
+ folder = new DmsFolderEntity();
+ folder.FolderName = item.FolderName;
+ folder.FolderLocalName = item.FolderLocalName;
+ repositoryFolder.InsertNow(folder);
+
+ map = new DmsFolderMapEntity();
+ map.FolderNameParent = dmsFolder.FolderName;
+ map.FolderNameSon = folder.FolderName;
+ repositoryFolderMap.InsertNow(map);
+
+ //创建Dms目录
+ entity = new DmsFileEntity();
+
+ entity.OrderKey = entity.FileName = item.FolderName;
+ entity.OrgFileName = folder.FolderLocalName;
+ entity.AllowDeleteIndc = entity.AllowRenameIndc = entity.IsDirectoryIndc = YesNoPolicy.YES;
+
+ entity.FilePath = map.FolderNameParent;
+
+ entity.OwerId = folder.FolderName;
+ entity.IsLinkIndc = YesNoPolicy.NO;
+
+ repository.InsertNow(entity);
+ }
+
+
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Update)]
+ [UnitOfWork]
+ public void UpdateDmsFolder(DmsFileEntity dmsFile)
+ {
+ IRepository repositoryUpload = repository.GetRepository>();
+
+ DmsFileUploadEntity upload = repositoryUpload.DetachedEntities.Where(x => x.FileId == dmsFile.FileId).FirstOrDefault()!;
+
+ if (upload == null)
+ {
+ throw new ValidatedException("记录不存在.");
+ }
+
+ upload.OrgFileName = dmsFile.FileName;
+
+ repositoryUpload.UpdateNow(upload);
+
+ DmsFileEntity file = repository.DetachedEntities.Where(x => x.FileId == dmsFile.FileId).FirstOrDefault()!;
+ //修改目录档对应的名称
+ IRepository repositoryFolder = repository.GetRepository>();
+ DmsFolderEntity dmsFolder = repositoryFolder.DetachedEntities.Where(x => x.FolderName == file.FileName).FirstOrDefault()!;
+
+ if (dmsFolder == null) return;
+ dmsFolder.FolderLocalName = upload.OrgFileName;
+
+ repositoryFolder.UpdateNow(dmsFolder);
+
+
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public SelectOption[] FindDmsFolders()
+ {
+ IRepository repositoryFolder = repository.GetRepository>();
+ //排除FamilyGroup创建的目录
+ DmsFolderEntity[] ents = repositoryFolder.DetachedEntities.Where(x => x.FolderName.StartsWith("DR") && x.CreatedBy == service.UserId && x.FolderLocalName != service.UserId).ToArray();
+ List l = new List();
+ SelectOption selectOption;
+
+ DmsFolderEntity my = repositoryFolder.DetachedEntities.Where(x => x.CreatedBy == service.UserId && x.FolderLocalName == service.UserId).FirstOrDefault()!;
+
+ selectOption = new SelectOption();
+ selectOption.BindValue = string.Empty;
+ if (my == null)
+ {
+ selectOption.DisplayName = "我的网盘";
+ }
+ else
+ {
+ selectOption.DisplayName = "所有文件(夹)";
+ }
+
+ l.Add(selectOption);
+
+ if (my != null)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = my.FolderName;
+ selectOption.DisplayName = "我的网盘";
+ l.Add(selectOption);
+ }
+
+ if (ents == null || ents.Length == 0) return l.ToArray();
+
+ foreach (DmsFolderEntity ent in ents)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = ent.FolderName;
+ selectOption.DisplayName = ent.FolderLocalName;
+ l.Add(selectOption);
+ }
+ return l.ToArray();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public SelectOption[] FindDmsFolderDeleteLogs()
+ {
+ IRepository repositoryFolder = repository.GetRepository>();
+ //排除FamilyGroup创建的目录
+ DmsFolderDeleteLogEntity[] ents = repositoryFolder.DetachedEntities.Where(x => x.FolderName.StartsWith("DR") && x.CreatedBy == service.UserId && x.FolderLocalName != service.UserId).ToArray();
+ List l = new List();
+ SelectOption selectOption;
+
+ DmsFolderDeleteLogEntity my = repositoryFolder.DetachedEntities.Where(x => x.CreatedBy == service.UserId && x.FolderLocalName == service.UserId).FirstOrDefault()!;
+
+ selectOption = new SelectOption();
+ selectOption.BindValue = string.Empty;
+ if (my == null)
+ {
+ selectOption.DisplayName = "我的网盘";
+ }
+ else
+ {
+ selectOption.DisplayName = "所有文件(夹)";
+ }
+
+ l.Add(selectOption);
+
+ if (my != null)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = my.FolderName;
+ selectOption.DisplayName = "我的网盘";
+ l.Add(selectOption);
+ }
+
+ if (ents == null || ents.Length == 0) return l.ToArray();
+
+ foreach (DmsFolderDeleteLogEntity ent in ents)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = ent.FolderName;
+ selectOption.DisplayName = ent.FolderLocalName;
+ l.Add(selectOption);
+ }
+ return l.ToArray();
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public DmsFolderData FindDmsFolderData()
+ {
+ DmsFolderData data = new DmsFolderData();
+
+ IRepository repositoryFolder = repository.GetRepository>();
+ DmsFolderEntity[] dmsFolders = repositoryFolder.DetachedEntities.Where(x => x.CreatedBy == service.UserId).ToArray();
+
+ data.DmsFolders = dmsFolders;
+
+ IRepository repositoryFolderMap = repository.GetRepository>();
+ DmsFolderMapEntity[] dmsFolderMaps = repositoryFolderMap.DetachedEntities.Where(x => x.CreatedBy == service.UserId).ToArray();
+ data.DmsFoldersMaps = dmsFolderMaps;
+
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Update)]
+ [UnitOfWork]
+ public void MoveDmsFolder(DmsFileEntity dmsFile)
+ {
+ DmsFileEntity file = repository.DetachedEntities.Where(x => x.FileId == dmsFile.FileId).FirstOrDefault()!;
+
+ if (file == null) return;
+ if (file.FilePath == dmsFile.FilePath) return;
+
+ file.FilePath = dmsFile.FilePath;
+
+ repository.UpdateNow(file);
+
+ IRepository repositoryFolderMap = repository.GetRepository>();
+
+ DmsFolderMapEntity map = repositoryFolderMap.Entities.Where(x => x.FolderNameSon == file.FileName).FirstOrDefault()!;
+ if (map == null) return;
+ repositoryFolderMap.DeleteNow(map);
+
+ map = new DmsFolderMapEntity();
+ map.FolderNameSon = file.FileName;
+ map.FolderNameParent = dmsFile.FilePath;
+ repositoryFolderMap.InsertNow(map);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
+ [UnitOfWork]
+ public void UploadFile()
+ {
+ //采用分片上传文件(以及后面分片下载)
+ DmsFileEntity dmsFile = null;
+
+ var files = httpContextAccessor.HttpContext.Request.Form.Files;
+
+ var currentDate = DateTime.Now;
+ if (files.Any())
+ {
+ foreach (var file in files)
+ {
+ string filePath = null;
+ if (httpContextAccessor.HttpContext.Request.Headers.ContainsKey("FilePath"))
+ filePath = httpContextAccessor.HttpContext.Request.Headers["FilePath"].ToString();
+ dmsFile = PackUploadFile(file, filePath);
+ break;
+ }
+ }
+
+ if (dmsFile != null)
+ {
+ CreateDmsFile(dmsFile);
+ }
+ }
+
+ public DmsFileEntity PackUploadFile(IFormFile file, string folderName)
+ {
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.DmsFileUploadDirectory];
+ DmsFileEntity dmsFile = new DmsFileEntity();
+ dmsFile.OrgFileName = file.Name.Replace(" ", "");
+ dmsFile.FilePath = folderName;
+ //文件后缀
+ var fileExtension = Path.GetExtension(file.Name.Replace(" ", "")).ToLower();//获取文件格式,拓展名
+ if (string.IsNullOrEmpty(fileExtension)) fileExtension = "ext";
+
+ var filePath = Path.Combine(service.UserId, fileExtension.Replace(".", ""), "");
+
+ //创建存储文件夹
+ if (!Directory.Exists(Path.Combine(webRootPath, filePath)))
+ {
+ Directory.CreateDirectory(Path.Combine(webRootPath, filePath));
+ }
+ //判断文件大小
+ var fileSize = file.Length;
+ if (fileSize > 1024 * 1024 * 100) //100M TODO:(1mb=1024X1024b)
+ {
+ return null;
+ }
+ //保存的文件名称
+ string fullName = Path.Combine(webRootPath, filePath, file.FileName);
+ if (File.Exists(fullName)) File.Delete(fullName);
+ //文件保存
+ using (var fs = System.IO.File.Create(fullName))
+ {
+ file.CopyTo(fs);
+ fs.Flush();
+ }
+ //FileName上传Uid:xxxx-1-1.xxx
+ string[] fns = file.FileName.Split('-');
+ //如果上传的不是最后一个分片,不写入表
+ if (fns[fns.Length - 2] != fns[fns.Length - 1].Split('.')[0])
+ {
+ dmsFile = null;
+ return null;
+ }
+ else
+ {
+ dmsFile.OrderKey = file.FileName;
+ if (fns[fns.Length - 1].Split('.')[0] == "1")
+ {
+ dmsFile.OrderKey = file.FileName;
+ dmsFile.FileName = file.FileName;
+ dmsFile.FileSize = Convert.ToInt32(fileSize / 1024);
+ var backupRootPath = service.Configuration[ServiceSettingsPolicy.DmsFileBackupDirectory];
+ string backupName = Path.Combine(backupRootPath, filePath, dmsFile.FileName);
+ if (!Directory.Exists(Path.Combine(backupRootPath, filePath)))
+ {
+ Directory.CreateDirectory(Path.Combine(backupRootPath, filePath));
+ }
+ if (File.Exists(backupName)) File.Delete(backupName);
+ File.Copy(fullName, backupName, true);
+ //生成缩略图
+ if (FileTypePolicy.GetType(fileExtension.ToLower()) == FileTypePolicy.PHOTO)
+ {
+ ImageToScare(fullName, dmsFile);
+ }
+ }
+ else//合并文件
+ {
+ List all = new List();
+ List fileNames = new List();
+ //文件分片从1开始
+ for (int i = 1; i <= Convert.ToInt32(fns[fns.Length - 1].Split('.')[0]); i++)
+ {
+ fns[fns.Length - 2] = i.ToString();
+
+ fileNames.Add(Path.Combine(webRootPath, filePath, fns.ToDelimiteredList('-')));
+ }
+ dmsFile.FileName = Path.GetFileName(fullName);
+ var backupRootPath = service.Configuration[ServiceSettingsPolicy.DmsFileBackupDirectory];
+
+ fullName = Path.Combine(backupRootPath, filePath, dmsFile.FileName);
+ if (!Directory.Exists(Path.Combine(backupRootPath, filePath)))
+ {
+ Directory.CreateDirectory(Path.Combine(backupRootPath, filePath));
+ }
+ if (File.Exists(fullName)) File.Delete(fullName);
+ using (FileStream outputFile = File.Create(fullName)) // 创建输出文件流
+ {
+ foreach (string fileName in fileNames)
+ {
+ byte[] buffer = File.ReadAllBytes(fileName); // 读取每个文件内容到字节数组
+ outputFile.Write(buffer, 0, buffer.Length); // 将字节数组写入输出文件流
+ dmsFile.FileSize += buffer.Length;
+ }
+ dmsFile.FileSize = Convert.ToInt32(dmsFile.FileSize / 1024);//kb
+ }
+ //task:ImageSharpTask uid:SYSTEM file_size:5351 file_name:vc-upload-1709274146458-2-11-11_DSC_6141.JPG order_key:vc-upload-1709257162571-2-6-6.JPG
+ //生成缩略图
+ if (FileTypePolicy.GetType(fullName.ToLower()) == FileTypePolicy.PHOTO)
+ {
+ ImageToScare(fullName, dmsFile);
+ }
+ else if (FileTypePolicy.GetType(fullName.ToLower()) == FileTypePolicy.VIDEO)
+ {
+ foreach (string fileName in fileNames)
+ {
+ if (File.Exists(fileName)) File.Delete(fileName);
+ }
+ string m3u8FilePath = Path.Combine(webRootPath, service.UserId, "m3u8", Path.GetFileNameWithoutExtension(dmsFile.OrderKey));
+ if (!Directory.Exists(m3u8FilePath))
+ {
+ Directory.CreateDirectory(m3u8FilePath);
+ }
+ string m3u8FullFile = Path.Combine(m3u8FilePath, "main.m3u8");
+ //生成m3u8
+ TsToM3u8(dmsFile.OrderKey, fullName, m3u8FullFile);
+ }
+ }
+ }
+ return dmsFile;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public string FindM3u8Path(long fileId)
+ {
+ DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
+
+ return FileTypePolicy.PackUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public string FindSourceVideoPath(long fileId)
+ {
+ DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
+
+ return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public string FindDeleteLogM3u8Path(long fileId)
+ {
+ IRepository repositoryDmsFileDeleteLog = repository.GetRepository>();
+ DmsFileDeleteLogEntity entity = repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
+
+ return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey);
+ }
+
+ private string PackParameters(DmsFileEntity dmsFile)
+ {
+ List para = new List();
+ para.Add("task:" + "ImageSharpTask");
+ para.Add("uid:" + service.UserId);
+ para.Add("file_size:" + dmsFile.FileSize);
+ para.Add("file_name:" + dmsFile.FileName);
+ para.Add("order_key:" + dmsFile.OrderKey);
+ return para.ToArray().ToDelimiteredList(' ');
+ }
+
+ public void TsToM3u8(string orderKey, string mp4Url, string m3u8Url, int videoLength = 6)
+ {
+ string para = string.Format(service.Configuration[ServiceSettingsPolicy.FfmpegPictrue], mp4Url, m3u8Url);
+ RunMyProcess(service.Configuration[ServiceSettingsPolicy.FfmpegPath], para.Replace(".m3u8", ".png"));
+ return;
+ para = string.Format(service.Configuration["Ffmpeg:Arguments"], mp4Url, videoLength, m3u8Url);
+ //不直接转码视频文件,影响服务器性能,改为在闭时自动生成
+ //Task.Run(() =>
+ //{
+ // Thread.Sleep(200);
+ // RunMyProcess(service.Configuration["Ffmpeg:Path"], para);
+ //});
+ //IRepository logRepository = repository.GetRepository>();
+ //VideoToM3u8LogEntity log = new VideoToM3u8LogEntity();
+ //log.VideoName = para;
+ //log.FilePath = Path.GetDirectoryName(m3u8Url)!;
+ //log.OrderKey = orderKey;
+ //log.Status = "S";
+ //logRepository.InsertNow(log);
+ }
+
+ public void ImageToScare(string fullName, DmsFileEntity dmsFile)
+ {
+ var fileExtension = Path.GetExtension(fullName).ToLower();//获取文件格式,拓展名
+ if (string.IsNullOrEmpty(fileExtension)) fileExtension = "ext";
+ // 仅修改这一行,替换硬编码反斜杠字符串拼接
+ var filePath = Path.Combine(service.UserId, fileExtension.Replace(".", ""), "");
+ // 这里同步改成Path.Combine,不要直接+字符串拼接
+ string saveName = Path.Combine(service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory], filePath, dmsFile.OrderKey);
+
+ if (!Directory.Exists(Path.GetDirectoryName(saveName)))
+ {
+ Directory.CreateDirectory(Path.GetDirectoryName(saveName));
+ }
+
+ using (Image image = Image.Load(fullName))
+ {
+ decimal scale = 1;
+ if (image.Width > 932 && image.Width > image.Height)
+ {
+ if (dmsFile != null)
+ {
+ dmsFile.LandscapeIndc = YesNoPolicy.YES;
+ }
+
+ scale = image.Width / 932m;
+
+ int newWidth = Convert.ToInt32(image.Width / scale);
+ int newHeight = Convert.ToInt32(image.Height / scale);
+ image.Mutate(x => x.Resize(newWidth, newHeight, KnownResamplers.Lanczos3));
+
+ if (newWidth > 932)
+ image.Mutate(a => a.Crop(new Rectangle((newWidth - 932) / 2, 0, 932, 430)));
+ }
+ else if (image.Height > 932 && image.Height > image.Width)
+ {
+ if (dmsFile != null)
+ {
+ dmsFile.LandscapeIndc = YesNoPolicy.NO;
+ }
+
+ scale = image.Height / 932m;
+
+ int newWidth = Convert.ToInt32(image.Width / scale);
+ int newHeight = Convert.ToInt32(image.Height / scale);
+ image.Mutate(x => x.Resize(newWidth, newHeight, KnownResamplers.Lanczos3));
+
+ if (newWidth > 430)
+ image.Mutate(a => a.Crop(new Rectangle((newWidth - 430) / 2, 0, 430, 932)));
+ }
+
+ image.Save(saveName);
+ }
+ }
+
+ ///
+ /// 执行cmd指令(异步不等待,await要求等待返回,转码太耗时)
+ ///
+ ///
+ public void RunMyProcess(string exePath, string Parameters)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(exePath)) return;
+ Cli.Wrap(exePath)
+ .WithArguments(Parameters)
+ .ExecuteAsync();
+ }
+ catch (Exception ex)
+ {
+ throw new ValidatedException(ex.Message);
+ }
+
+ }
+
+ public DmsFileEntity CreateDmsFile(DmsFileEntity dmsFile)
+ {
+ IRepository repositoryFolder = repository.GetRepository>();
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ DmsFolderEntity folder = null;
+ string folderNameParent = dmsFile.FilePath;
+ //父目录是空,创建顶级目录
+ if (string.IsNullOrEmpty(dmsFile.FilePath))
+ {
+ folder = repositoryFolder.DetachedEntities.Where(x => x.FolderLocalName == service.UserId).FirstOrDefault()!;
+ if (folder == null)
+ {
+ folder = new DmsFolderEntity();
+ folder.FolderName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.DMS_FOLDER, MasterPrefixPolicy.DMS_FOLDER_FOLDER_NAME, null, YesNoPolicy.NO, "00000000");
+ folder.FolderLocalName = service.UserId;
+ repositoryFolder.InsertNow(folder);
+ }
+ folderNameParent = folder.FolderName;
+ }
+
+ DmsFileUploadEntity upload = new DmsFileUploadEntity();
+
+ upload.FileCategory = "MASTER";
+ upload.UploadName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.UPLOAD_DMS_FILE, MasterPrefixPolicy.UPLOAD_DMS_FILE_UPLOAD_NAME, "FL", YesNoPolicy.NO, MasterPrefixPolicy.UPLOAD_DMS_FILE_FORMAT);
+ upload.OrgFileName = dmsFile.OrgFileName;
+
+ //创建Dms文件
+ DmsFileEntity entity = new DmsFileEntity();
+ entity.OrderKey = dmsFile.OrderKey;
+ entity.FileName = upload.UploadName;
+ entity.FileType = FileTypePolicy.GetType(entity.OrderKey);
+ entity.OrgFileName = dmsFile.FileName;
+ entity.FileSize = dmsFile.FileSize;
+ entity.AllowDeleteIndc = entity.AllowRenameIndc = YesNoPolicy.YES;
+ entity.IsDirectoryIndc = YesNoPolicy.NO;
+
+ entity.FilePath = folderNameParent;
+
+ entity.OwerId = service.UserId;
+ entity.IsLinkIndc = YesNoPolicy.NO;
+
+ repository.InsertNow(entity);
+
+ IRepository repositoryUpload = repository.GetRepository>();
+ upload.FileId = entity.FileId;
+ repositoryUpload.InsertNow(upload);
+
+ //创建目录关系表
+ DmsFolderMapEntity map = new DmsFolderMapEntity();
+ IRepository repositoryFolderMap = repository.GetRepository>();
+ map.FolderNameParent = folderNameParent;
+ map.FolderNameSon = entity.FileName;
+ repositoryFolderMap.InsertNow(map);
+
+
+ return entity;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public dynamic DownloadFile(long fileId)
+ {
+ DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
+
+ if (entity == null) throw new ValidatedException("文件不存在.");
+
+ var fileExtension = Path.GetExtension(entity.OrderKey);//获取文件格式,拓展名
+
+ string path = FileTypePolicy.PackFilePath(service, entity.CreatedBy, entity.OrderKey);
+
+ IRepository repositoryUpload = repository.GetRepository>();
+ DmsFileUploadEntity DmsFileUpload = repositoryUpload.DetachedEntities.Where(x => x.FileId == fileId).FirstOrDefault()!;
+
+ if (DmsFileUpload == null || !File.Exists(path)) throw new ValidatedException("文件不存在.");
+
+ var stream = System.IO.File.OpenRead(path);
+
+ string contentType = "application/octet-stream";
+
+ switch (fileExtension.Replace(".", "").ToLower())
+ {
+ case "xls":
+ case "xlt":
+ case "xla":
+ contentType = "application/vnd.ms-excel";
+ break;
+ case "xlsx":
+ case "xltx":
+ contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+ break;
+ case "doc":
+ contentType = "application/msword";
+ break;
+ case "docx":
+ contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+ break;
+ case "txt":
+ contentType = "text/plain";
+ break;
+ case "png":
+ case "jpg":
+ case "jpeg":
+ case "gif":
+ contentType = "image/*";
+ break;
+ case "mp4":
+ case "mpg":
+ case "mpeg":
+ case "avi":
+ contentType = "video/*";
+ break;
+ case "pdf":
+ contentType = "application/pdf";
+ break;
+ default:
+ break;
+ }
+
+ return new FileStreamResult(stream, contentType) { FileDownloadName = DmsFileUpload.OrgFileName };
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public dynamic DownloadFilePreview(DmsFileEntity dmsFile)
+ {
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory];
+ var fileExtension = Path.GetExtension(dmsFile.OrderKey);
+
+ var filePath = Path.Combine(dmsFile.CreatedBy, fileExtension.Replace(".", ""), "");
+ string path = Path.Combine(webRootPath, filePath, dmsFile.OrderKey);
+
+ if (!File.Exists(path)) throw new ValidatedException("文件不存在.");
+
+ var stream = System.IO.File.OpenRead(path);
+
+ //string contentType = "image/*";
+ string contentType = "application/octet-stream";
+
+ return new FileStreamResult(stream, contentType) { FileDownloadName = dmsFile.OrderKey };
+
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public dynamic DownloadFileCombine(string fileName)
+ {
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.DmsFileUploadDirectory];
+ var fileExtension = Path.GetExtension(fileName);
+
+ var filePath = Path.Combine(service.UserId, fileExtension.Replace(".", ""), "");
+ string path = Path.Combine(webRootPath, filePath, fileName);
+
+ if (!File.Exists(path)) throw new ValidatedException("文件不存在.");
+
+ var stream = System.IO.File.OpenRead(path);
+
+ //string contentType = "image/*";
+ string contentType = "application/octet-stream";
+
+ return new FileStreamResult(stream, contentType) { FileDownloadName = fileName };
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public SelectOption[] FindFamilyDmsFolders()
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+
+ FamilyGroupManagerUserViewEntity[] ents = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.UserName == service.UserId).ToArray();
+ List l = new List();
+ SelectOption selectOption;
+
+ if (ents == null || ents.Length == 0) return l.ToArray();
+
+ foreach (FamilyGroupManagerUserViewEntity ent in ents)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = ent.FamilyName;
+ selectOption.DisplayName = ent.FamilyLocalName;
+ l.Add(selectOption);
+ }
+ return l.ToArray();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public SelectOption[] FindFamilyDmsFoldersByFamilyName(string familyName)
+ {
+ List l = new List();
+ SelectOption selectOption;
+
+ if (string.IsNullOrEmpty(familyName)) return l.ToArray();
+
+ IRepository repositoryFamilyGroup = repository.GetRepository>();
+
+ FamilyGroupEntity group = repositoryFamilyGroup.DetachedEntities.Where(x => x.FamilyName == familyName).FirstOrDefault()!;
+ if (group == null) return l.ToArray();
+
+ selectOption = new SelectOption();
+ selectOption.BindValue = group.FamilyName;
+ selectOption.DisplayName = group.FamilyLocalName;
+ l.Add(selectOption);
+
+ IRepository repositoryFamilyGroupFolder = repository.GetRepository>();
+
+ FamilyGroupFolderEntity[] ents = repositoryFamilyGroupFolder.DetachedEntities.Where(x => x.FamilyName == familyName && string.IsNullOrEmpty(x.FilePath)).ToArray();
+ if (ents == null || ents.Length == 0) return l.ToArray();
+
+
+
+ foreach (FamilyGroupFolderEntity ent in ents)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = ent.FolderName;
+ selectOption.DisplayName = ent.FolderLocalName;
+ l.Add(selectOption);
+ }
+ return l.ToArray();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public int FindDmsFolderMapByFolderName(string folderName)
+ {
+ IRepository repositoryFolderMap = repository.GetRepository>();
+
+ return repositoryFolderMap.DetachedEntities.Where(x => x.FolderNameSon == folderName).Count();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
+ public string FindFolderNameParentByFolderName(string folderName)
+ {
+ IRepository repositoryFolderMap = repository.GetRepository>();
+ if (repositoryFolderMap.DetachedEntities.Where(x => x.FolderNameSon == folderName).Count() == 0) return string.Empty;
+
+ return repositoryFolderMap.DetachedEntities.Where(x => x.FolderNameSon == folderName).FirstOrDefault()!.FolderNameParent;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Insert)]
+ public void CreateFamilyGroupFolder(FamilyGroupFolderEntity[] familyGroupFolder)
+ {
+ FamilyGroupFolderEntity folder;
+ IRepository repositoryFamilyGroupFolder = repository.GetRepository>();
+
+ foreach (var item in familyGroupFolder)
+ {
+ folder = repositoryFamilyGroupFolder.DetachedEntities.Where(x => x.FolderName == item.FolderName
+ && x.FamilyName == item.FamilyName && x.FilePath == item.FilePath).FirstOrDefault()!;
+ if (folder != null) continue;
+ folder = new FamilyGroupFolderEntity();
+
+ folder.FolderName = item.FolderName;
+ folder.FamilyName = item.FamilyName;
+ folder.TopFolderName = item.TopFolderName;
+
+ folder.FolderLocalName = item.FolderLocalName;
+ folder.FilePath = item.FilePath;
+
+ repositoryFamilyGroupFolder.InsertNow(folder);
+ }
+
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Delete)]
+ public void DeleteFamilyGroupFolder(FamilyGroupFolderEntity[] familyGroupFolder)
+ {
+ FamilyGroupFolderEntity folder;
+ IRepository repositoryFamilyGroupFolder = repository.GetRepository>();
+
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+ FamilyGroupPermissionEntity fgp;
+ foreach (var item in familyGroupFolder)
+ {
+ folder = repositoryFamilyGroupFolder.DetachedEntities.Where(x => x.FolderName == item.FolderName
+ && x.FamilyName == item.FamilyName && x.FilePath == (string.IsNullOrEmpty(item.FilePath) ? null : item.FilePath)).FirstOrDefault()!;
+ if (folder == null) continue;
+
+ //再分析是否有权限
+
+ fgp = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.FamilyName == folder.FamilyName
+ && x.FolderName == folder.TopFolderName && x.UserName == service.UserId).FirstOrDefault()!;
+
+ if (fgp == null) throw new ValidatedException("你没有权限删除.");
+
+ repositoryFamilyGroupFolder.DeleteNow(folder);
+ }
+
+ }
+
+ }
+}
diff --git a/CloudBuilder/CloudBuilder.Master.Service/FamilyGroupService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/FamilyGroupService.auto.cs
new file mode 100644
index 0000000..09dc83d
--- /dev/null
+++ b/CloudBuilder/CloudBuilder.Master.Service/FamilyGroupService.auto.cs
@@ -0,0 +1,679 @@
+
+using CloudBuilder.Core.DatabaseAccessor.Entity;
+using Microsoft.AspNetCore.Authorization;
+using CloudBuilder.Core.DatabaseAccessor;
+using CloudBuilder.Master.Entity;
+using CloudBuilder.Master.Policy;
+using CloudBuilder.Master.SearchCriteria;
+using CloudBuilder.Master.Data;
+using CloudBuilder.Core.Service;
+using CloudBuilder.Security.Utility;
+using CloudBuilder.Security.Service;
+using Microsoft.Extensions.DependencyInjection;
+namespace CloudBuilder.Master.Service
+{
+ public class FamilyGroupService : IFamilyGroupService
+ {
+ private readonly IApplicationService service;
+
+ private IRepository repository;
+ public FamilyGroupService(IApplicationService service)
+ {
+ this.service = service;
+ repository = service.GetRepository>();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Find)]
+ public FamilyGroupData FindByKey(string key)
+ {
+ FamilyGroupData data = new FamilyGroupData();
+ FamilyGroupEntity familyGroup = repository.DetachedEntities.Where(x => x.FamilyName == key).FirstOrDefault()!;
+ if (familyGroup == null || !YesNoPolicy.IsYes(familyGroup.ValidIndc)) return data;
+
+ data.FamilyGroup = familyGroup;
+ data.IsAdd = familyGroup.AddIndc == YesNoPolicy.YES;
+ data.IsOpen = familyGroup.OpenIndc == YesNoPolicy.YES;
+
+
+
+ IRepository repositoryDmsFolderMap = repository.GetRepository>();
+ DmsFolderMapEntity[] dmsFolderMapss = repositoryDmsFolderMap.DetachedEntities.Where(x => x.FolderNameParent == key).ToArray();
+
+ IRepository repositoryFamilyGroupFolder = repository.GetRepository>();
+
+ FamilyGroupFolderEntity[] folders = repositoryFamilyGroupFolder.DetachedEntities.Where(x => x.FamilyName == key).ToArray();
+
+ List lfs = new List();
+ foreach (var f in folders)
+ {
+ foreach (var m in dmsFolderMapss)
+ {
+ if (f.FolderName == m.FolderNameSon)
+ {
+ lfs.Add(f);
+ break;
+ }
+ }
+ }
+ folders = lfs.ToArray();
+
+ IRepository repositoryFamilyGroupManagerUser = repository.GetRepository>();
+
+ FamilyGroupManagerUserViewEntity[] users = repositoryFamilyGroupManagerUser.DetachedEntities.Where(x => x.FamilyName == key).ToArray();
+
+ IRepository repositoryFamilyGroupPermissionUserFolder = repository.GetRepository>();
+ FamilyGroupPermissionUserFolderViewEntity[] ufs = repositoryFamilyGroupPermissionUserFolder.DetachedEntities.Where(x => x.FamilyName == key).ToArray();
+
+ if (users == null || users.Length == 0) return data;
+
+ bool isManager = false;
+ bool isUser = false;
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+ FamilyGroupManagerEntity[] fgms = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.FamilyName == key && x.ValidIndc == YesNoPolicy.YES).ToArray();
+ if (fgms != null && fgms.Length > 0)
+ {
+ data.FamilyGroupManagers = fgms.Select(x => new FamilyGroupManagerDisplayData(x)
+ { UserLocalName = users.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName }).ToArray();
+
+ //如果不是管理员,则只能看到有权限的目录
+
+ FamilyGroupManagerEntity[] temp = data.FamilyGroupManagers.Where(x => x.ManagerIndc == YesNoPolicy.YES && x.UserName == service.UserId).ToArray();
+
+ if (temp != null && temp.Length > 0) isManager = true;
+
+ temp = data.FamilyGroupManagers.Where(x => x.ValidIndc == YesNoPolicy.YES && x.UserName == service.UserId).ToArray();
+ if (temp != null && temp.Length > 0) isUser = true;
+ }
+
+ //如果隐私,不是成员不能查看
+ if (familyGroup.OpenIndc == YesNoPolicy.NO && !isUser) return new FamilyGroupData();
+
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+ FamilyGroupPermissionEntity[] fgps = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.FamilyName == key).ToArray();
+
+ if (fgps != null && fgps.Length > 0)
+ {
+ data.FamilyGroupPermissions = fgps.Select(x => new FamilyGroupPermissionDisplayData(x)
+ {
+ UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName,
+ FolderLocalName = ufs!.Where(y => y.UserName == x.UserName && y.FolderName == x.FolderName).FirstOrDefault()!.FolderLocalName
+ }).ToArray();
+
+ if (!isManager)
+ {
+ FamilyGroupPermissionDisplayData[] ps = data.FamilyGroupPermissions.Where(x => x.UserName == service.UserId).ToArray();
+
+ if (ps == null || ps.Length == 0)
+ {
+ data.FamilyGroupFolders = folders!.Select(x => new FamilyGroupFolderDisplayData(x)
+ {
+ IsSharePermission = false,
+ }).ToArray();
+ }
+ else
+ {
+ if (folders != null && folders.Length > 0)
+ {
+ List l = new List();
+ FamilyGroupFolderDisplayData d;
+ foreach (var item in folders)
+ {
+ d = new FamilyGroupFolderDisplayData(item);
+ if (ps.Where(x => x.FolderName == item.FolderName).Count() > 0)
+ {
+ d.IsSharePermission = true;
+ }
+
+ l.Add(d);
+ }
+
+ data.FamilyGroupFolders = l.ToArray();
+ }
+
+ }
+ if (!isUser)
+ data.FamilyGroupManagers = null;
+ data.FamilyGroupPermissions = null;
+ }
+
+ }
+
+
+ if (isManager)
+ {
+ fgms = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.FamilyName == key && x.ValidIndc == YesNoPolicy.NO).ToArray();
+ if (fgms != null && fgms.Length > 0)
+ data.FamilyGroupRequests = fgms.Select(x => new FamilyGroupManagerDisplayData(x)
+ { UserLocalName = users!.Where(y => y.UserName == x.UserName).FirstOrDefault()!.UserLocalName }).ToArray();
+
+ //管理员有分享权限
+ data.FamilyGroupFolders = folders!.Select(x => new FamilyGroupFolderDisplayData(x)
+ {
+ IsSharePermission = true,
+ }).ToArray();
+ }
+
+ data.IsManager = isManager;
+
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Find)]
+ public FamilyGroupResultData FindBySearchCriteria(FamilyGroupSearchCriteria criteria)
+ {
+ FamilyGroupResultData data = new FamilyGroupResultData();
+ FamilyGroupEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+
+ string subIn = $"select {FamilyGroupManagerEntity.DB_FAMILY_NAME} from {FamilyGroupManagerEntity.DB_NAME_FAMILY_GROUP_MANAGER} where {FamilyGroupManagerEntity.DB_USER_NAME}='{service.UserId}' ";
+ sqlWhere = sqlWhere + $" and {FamilyGroupEntity.DB_VALID_INDC}='Y' and ( {FamilyGroupEntity.DB_OPEN_INDC}='Y' or ({FamilyGroupEntity.DB_OPEN_INDC}='N' and {FamilyGroupEntity.DB_FAMILY_NAME} in ({subIn})))";
+
+
+ FamilyGroupEntity entity = FamilyGroupEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ string err = null;
+ try
+ {
+ list = repository.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+ data.Datas = list;
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Find)]
+ public FamilyGroupResultData FindFamilyUserBySearchCriteria(FamilyGroupManagerUserSearchCriteria criteria)
+ {
+ FamilyGroupResultData data = new FamilyGroupResultData();
+ FamilyGroupManagerUserViewEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+ string notIn = $"select {FamilyGroupPermissionUserFolderViewEntity.DB_USER_NAME} from {FamilyGroupPermissionUserFolderViewEntity.DB_NAME_FAMILY_GROUP_PERMISSION_USER_FOLDER_VIEW} where {FamilyGroupPermissionUserFolderViewEntity.DB_FAMILY_NAME}='{criteria.FamilyName}' and {FamilyGroupPermissionUserFolderViewEntity.DB_FOLDER_NAME}='{criteria.FolderName}' ";
+ sqlWhere = sqlWhere + " and " + FamilyGroupManagerUserViewEntity.DB_USER_NAME + $" not in ({notIn})";
+ sqlWhere = sqlWhere + " and " + FamilyGroupManagerUserViewEntity.DB_VALID_INDC + "='Y' ";
+ sqlWhere = sqlWhere + $" and {FamilyGroupManagerUserViewEntity.DB_FAMILY_NAME}= '{criteria.FamilyName}' ";
+
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+
+ FamilyGroupManagerUserViewEntity entity = FamilyGroupManagerUserViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ string err = null;
+ try
+ {
+ list = repositoryFamilyGroupManager.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+ data.Users = list;
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Find)]
+ public FamilyGroupResultData FamilyFolderFavoriteBySearchCriteria(FamilyGroupManagerUserSearchCriteria criteria)
+ {
+ FamilyGroupResultData data = new FamilyGroupResultData();
+ FamilyFolderFavoriteViewEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ sqlWhere = sqlWhere + $" and {FamilyFolderFavoriteViewEntity.DB_USER_NAME}='{service.UserId}' ";
+
+ IRepository repositoryFamilyFolderFavorite = repository.GetRepository>();
+
+ FamilyFolderFavoriteViewEntity entity = FamilyFolderFavoriteViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ string err = null;
+ try
+ {
+ list = repositoryFamilyFolderFavorite.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+ data.Favorites = list;
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Print)]
+ public dynamic PrintBySearchCriteria(FamilyGroupSearchCriteria criteria)
+ {
+ throw new NotImplementedException();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Insert)]
+ [UnitOfWork]
+ public FamilyGroupData Insert(FamilyGroupData data)
+ {
+ FamilyGroupEntity familyGroup = repository.DetachedEntities.Where(x => x.FamilyLocalName == data.FamilyGroup.FamilyLocalName).FirstOrDefault();
+ if (familyGroup != null)
+ {
+ throw new ValidatedException("群组名称已存在.");
+ }
+
+ ValidateHelper.Validate(service, data.FamilyGroup, FamilyGroupEntity.DB_NAME_FAMILY_GROUP);
+
+ familyGroup = new FamilyGroupEntity();
+ ObjectCopyHelper.Copy(data.FamilyGroup, familyGroup);
+
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+
+ familyGroup.FamilyName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.FAMILY_GROUP, MasterPrefixPolicy.FAMILY_GROUP_FAMILY_NAME, "FM", YesNoPolicy.NO, "000000");
+ familyGroup.ValidIndc = YesNoPolicy.YES;
+ familyGroup.ExpireDatetime = null;
+
+ familyGroup.AddIndc = data.IsAdd ? YesNoPolicy.YES : YesNoPolicy.NO;
+ familyGroup.OpenIndc = data.IsOpen ? YesNoPolicy.YES : YesNoPolicy.NO;
+
+ repository.InsertNow(familyGroup);
+
+ //创建人是管理员
+
+ FamilyGroupManagerEntity managerEntity = new FamilyGroupManagerEntity();
+ managerEntity.FamilyName = familyGroup.FamilyName;
+ managerEntity.ValidIndc = YesNoPolicy.YES;
+ managerEntity.ManagerIndc = YesNoPolicy.YES;
+ managerEntity.UserName = service.UserId;
+ managerEntity.Notice = "创建群用户";
+
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+ repositoryFamilyGroupManager.InsertNow(managerEntity);
+
+ SaveFamilyGroupFolders(familyGroup.FamilyName, data.FamilyGroupFolders);
+
+ //SaveFamilyGroupManagers(familyGroup.FamilyName, data.FamilyGroupManagers);
+
+ //SavePermissions(familyGroup.FamilyName, data.FamilyGroupPermissions);
+
+ //创建群根目录
+ IDmsFileService dmsFileService = service.ServiceProvider.GetService()!;
+ dmsFileService.CreateFamilyDmsFolder(familyGroup, data.FamilyGroupFolders);
+
+ return FindByKey(familyGroup.FamilyName);
+ }
+
+ private void SaveFamilyGroupFolders(string familyName, FamilyGroupFolderEntity[] familyGroupFolders)
+ {
+ IRepository repositoryFamilyGroupFolder = repository.GetRepository>();
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+ IRepository repositoryFolderMap = repository.GetRepository>();
+ IRepository repositoryFolder = repository.GetRepository>();
+
+ IDmsFileService dmsFileService = service.ServiceProvider.GetService()!;
+
+ FamilyGroupFolderEntity[] olds = repositoryFamilyGroupFolder.Entities.Where(x => x.FamilyName == familyName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+ foreach (FamilyGroupFolderEntity old in olds)
+ {
+ if (familyGroupFolders != null && familyGroupFolders.Length > 0 && familyGroupFolders.Where(x => x.FolderId == old.FolderId).Count() > 0)
+ {
+ FamilyGroupFolderEntity folder = familyGroupFolders.Where(x => x.FolderId == old.FolderId).FirstOrDefault();
+ old.FolderLocalName = folder.FolderLocalName;
+ old.Notice = folder.Notice;
+ repositoryFamilyGroupFolder.UpdateNow(old);
+ }
+ else
+ {
+ repositoryFamilyGroupFolder.DeleteNow(old);
+
+ //删除主目录所有内容
+ DmsFolderEntity folder = repositoryFolder.DetachedEntities.Where(x => x.FolderName == old.FolderName).FirstOrDefault()!;
+ if (folder != null)
+ {
+ dmsFileService.DeleteFolder(folder.FolderName);
+ }
+
+
+ //删除目录的时候,也要删除目录对应的权限
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+ FamilyGroupPermissionEntity[] permissions = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.FamilyName == old.FamilyName && x.FolderName == old.FolderName).ToArray();
+ if (permissions != null && permissions.Length > 0)
+ {
+ foreach (var item in permissions)
+ {
+ repositoryFamilyGroupPermission.DeleteNow(item);
+ }
+ }
+ }
+ }
+ }
+
+ if (familyGroupFolders == null || familyGroupFolders.Length == 0) return;
+
+ foreach (FamilyGroupFolderEntity dto in familyGroupFolders)
+ {
+ //原来不存在的插入
+ if (!string.IsNullOrEmpty(dto.CreatedBy)) continue;
+
+ ValidateHelper.Validate(service, dto, FamilyGroupFolderEntity.DB_NAME_FAMILY_GROUP_FOLDER);
+
+ FamilyGroupFolderEntity familyGroupFolderEntity = new FamilyGroupFolderEntity()
+ {
+ FolderName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.DMS_FOLDER, MasterPrefixPolicy.DMS_FOLDER_FOLDER_NAME, "FG", YesNoPolicy.NO, "00000000"),
+ FamilyName = familyName,
+ FolderLocalName = dto.FolderLocalName,
+ Notice = dto.Notice,
+ };
+ //顶级目录
+ familyGroupFolderEntity.TopFolderName = familyGroupFolderEntity.FolderName;
+
+ repositoryFamilyGroupFolder.InsertNow(familyGroupFolderEntity);
+
+ dto.FolderName = familyGroupFolderEntity.FolderName;
+ }
+
+ }
+
+ private void SavePermissions(string familyName, FamilyGroupPermissionEntity[] permissions)
+ {
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+
+ FamilyGroupPermissionEntity[] olds = repositoryFamilyGroupPermission.Entities.Where(x => x.FamilyName == familyName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+ foreach (FamilyGroupPermissionEntity old in olds)
+ {
+ if (permissions != null && permissions.Length > 0 && permissions.Where(x => x.UserName == old.UserName && x.FolderName == old.FolderName).Count() > 0)
+ {
+ FamilyGroupPermissionEntity folder = permissions.Where(x => x.UserName == old.UserName && x.FolderName == old.FolderName).FirstOrDefault();
+ old.DeleteIndc = folder.DeleteIndc;
+ old.CreateIndc = folder.CreateIndc;
+ repositoryFamilyGroupPermission.UpdateNow(old);
+ }
+ else
+ {
+ repositoryFamilyGroupPermission.DeleteNow(old);
+ }
+ }
+ }
+
+ if (permissions == null || permissions.Length == 0) return;
+
+ foreach (FamilyGroupPermissionEntity dto in permissions)
+ {
+ //原来不存在的插入
+ if (!string.IsNullOrEmpty(dto.CreatedBy)) continue;
+
+ ValidateHelper.Validate(service, dto, FamilyGroupPermissionEntity.DB_NAME_FAMILY_GROUP_PERMISSION);
+
+ repositoryFamilyGroupPermission.InsertNow(new FamilyGroupPermissionEntity()
+ {
+ FamilyName = familyName,
+ UserName = dto.UserName,
+ FolderName = dto.FolderName,
+ CreateIndc = YesNoPolicy.YES,
+ DeleteIndc = YesNoPolicy.YES,
+ });
+ }
+
+ }
+
+ private void SaveFamilyGroupManagers(string familyName, FamilyGroupManagerDisplayData[] managers)
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+
+ FamilyGroupManagerEntity[] olds = repositoryFamilyGroupManager.Entities.Where(x => x.FamilyName == familyName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+ foreach (FamilyGroupManagerEntity old in olds)
+ {
+ if (managers != null && managers.Length > 0 && managers.Where(x => x.UserName == old.UserName).Count() > 0)
+ {
+ FamilyGroupManagerDisplayData mg = managers.Where(x => x.UserName == old.UserName).FirstOrDefault();
+
+ old.ManagerIndc = mg.IsManager ? YesNoPolicy.YES : YesNoPolicy.NO;
+ repositoryFamilyGroupManager.UpdateNow(old);
+ }
+ else
+ {
+ if (old.ValidIndc != YesNoPolicy.YES) continue;
+ repositoryFamilyGroupManager.DeleteNow(old);
+
+ //删除成员的时候,也要删除成员对应的权限
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+ FamilyGroupPermissionEntity[] permissions = repositoryFamilyGroupPermission.DetachedEntities.Where(x => x.FamilyName == old.FamilyName && x.UserName == old.UserName).ToArray();
+ if (permissions != null && permissions.Length > 0)
+ {
+ foreach (var item in permissions)
+ {
+ repositoryFamilyGroupPermission.DeleteNow(item);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Update)]
+ [UnitOfWork]
+ public FamilyGroupData Update(FamilyGroupData data)
+ {
+ FamilyGroupEntity familyGroup = repository.DetachedEntities.Where(x => x.FamilyName == data.FamilyGroup.FamilyName).FirstOrDefault();
+ if (familyGroup == null)
+ {
+ throw new ValidatedException("记录不存在.");
+ }
+
+ familyGroup = repository.DetachedEntities.Where(x => x.FamilyName != data.FamilyGroup.FamilyName && x.FamilyLocalName == data.FamilyGroup.FamilyLocalName).FirstOrDefault();
+ if (familyGroup == null)
+ {
+ throw new ValidatedException("群组名称已存在.");
+ }
+
+ ValidateHelper.Validate(service, data.FamilyGroup, FamilyGroupEntity.DB_NAME_FAMILY_GROUP);
+
+ familyGroup = new FamilyGroupEntity();
+ ObjectCopyHelper.Copy(data.FamilyGroup, familyGroup);
+
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+
+ familyGroup.AddIndc = data.IsAdd ? YesNoPolicy.YES : YesNoPolicy.NO;
+ familyGroup.OpenIndc = data.IsOpen ? YesNoPolicy.YES : YesNoPolicy.NO;
+
+ repository.UpdateNow(familyGroup);
+
+ SaveFamilyGroupFolders(familyGroup.FamilyName, data.FamilyGroupFolders);
+ SavePermissions(familyGroup.FamilyName, data.FamilyGroupPermissions);
+ SaveFamilyGroupManagers(familyGroup.FamilyName, data.FamilyGroupManagers);
+
+ //创建群根目录
+ IDmsFileService dmsFileService = service.ServiceProvider.GetService()!;
+ dmsFileService.CreateFamilyDmsFolder(familyGroup, data.FamilyGroupFolders);
+
+ return FindByKey(familyGroup.FamilyName);
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Delete)]
+ [UnitOfWork]
+ public void Delete(string key)
+ {
+ FamilyGroupEntity familyGroup = repository.DetachedEntities.Where(x => x.FamilyName == key).FirstOrDefault();
+ if (familyGroup == null)
+ {
+ throw new ValidatedException("记录不存在.");
+ }
+ bool isManager = false;
+
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+ FamilyGroupManagerEntity[] fgms = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.ManagerIndc == YesNoPolicy.YES && x.FamilyName == key && x.ValidIndc == YesNoPolicy.YES).ToArray();
+ if (fgms == null || fgms.Length == 0)
+ {
+ throw new ValidatedException("您不是管理员,不能解散");
+ }
+
+ familyGroup.ValidIndc = YesNoPolicy.NO;
+
+ repository.UpdateNow(familyGroup);
+
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Update)]
+ [UnitOfWork]
+ public void InsertFamilyGroupManager(FamilyGroupManagerEntity manager)
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+ FamilyGroupManagerEntity org = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.FamilyName == manager.FamilyName && x.UserName == service.UserId).FirstOrDefault()!;
+ if (org != null) { return; }
+
+ org = new FamilyGroupManagerEntity();
+ org.FamilyName = manager.FamilyName;
+ org.UserName = service.UserId;
+ org.ManagerIndc = YesNoPolicy.NO;
+ org.ValidIndc = YesNoPolicy.NO;
+ org.Notice = manager.Notice;
+
+ repositoryFamilyGroupManager.InsertNow(org);
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Insert)]
+ [UnitOfWork]
+ public void InsertFamilyGroupPermission(FamilyGroupPermissionEntity[] managers)
+ {
+ IRepository repositoryFamilyGroupPermission = repository.GetRepository>();
+
+ if (managers != null && managers.Length > 0)
+ {
+ foreach (FamilyGroupPermissionEntity manager in managers)
+ {
+ manager.DeleteIndc = YesNoPolicy.YES;
+ manager.CreateIndc = YesNoPolicy.YES;
+ repositoryFamilyGroupPermission.InsertNow(manager);
+ }
+ }
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Update)]
+ [UnitOfWork]
+ public void UpdateFamilyGroupManager(FamilyGroupManagerEntity manager)
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+ FamilyGroupManagerEntity org = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.FamilyName == manager.FamilyName && x.UserName == manager.UserName).FirstOrDefault()!;
+ if (org == null) { return; }
+
+ org.ValidIndc = manager.ValidIndc;
+
+ repositoryFamilyGroupManager.UpdateNow(org);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Update)]
+ [UnitOfWork]
+ public void DeleteFamilyGroupManager(FamilyGroupManagerEntity manager)
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+ FamilyGroupManagerEntity org = repositoryFamilyGroupManager.DetachedEntities.Where(x => x.FamilyName == manager.FamilyName && x.UserName == manager.UserName).FirstOrDefault()!;
+ if (org == null) { return; }
+
+ repositoryFamilyGroupManager.DeleteNow(org);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Insert)]
+ public void InsertFamilyFolderFavorite(string folderName)
+ {
+ IRepository repositoryFamilyFolderFavorite = repository.GetRepository>();
+ FamilyFolderFavoriteEntity folderFavorite = new FamilyFolderFavoriteEntity();
+ folderFavorite.FolderName = folderName;
+ folderFavorite.UserName = service.UserId;
+ repositoryFamilyFolderFavorite.InsertNow(folderFavorite);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Update)]
+ public void DeleteFamilyFolderFavorite(string folderName)
+ {
+ IRepository repositoryFamilyFolderFavorite = repository.GetRepository>();
+ FamilyFolderFavoriteEntity folderFavorite = new FamilyFolderFavoriteEntity();
+ folderFavorite.FolderName = folderName;
+ folderFavorite.UserName = service.UserId;
+ repositoryFamilyFolderFavorite.DeleteNow(folderFavorite);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.FamilyGroup, operate: Operate.Update)]
+ public void DeleteFamilyFolderFavorites(FamilyFolderFavoriteEntity[] familyFolderFavorites)
+ {
+ if (familyFolderFavorites == null || familyFolderFavorites.Length == 0) return;
+
+ IRepository repositoryFamilyFolderFavorite = repository.GetRepository>();
+ foreach (var item in familyFolderFavorites)
+ {
+ repositoryFamilyFolderFavorite.DeleteNow(item);
+ }
+
+ }
+
+ }
+}
diff --git a/CloudBuilder/CloudBuilder.Master.Service/FamilyPersonService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/FamilyPersonService.auto.cs
index 8c9702b..a1e52ba 100644
--- a/CloudBuilder/CloudBuilder.Master.Service/FamilyPersonService.auto.cs
+++ b/CloudBuilder/CloudBuilder.Master.Service/FamilyPersonService.auto.cs
@@ -53,7 +53,7 @@ namespace CloudBuilder.Master.Service
FamilyPersonResultData data = new FamilyPersonResultData();
FamilyPersonEntity[] list = null;
- int count = 0;
+ Int64 count = 0;
string sqlWhere = null;
@@ -79,7 +79,7 @@ namespace CloudBuilder.Master.Service
if (list != null && list.Length > 0)
{
sql = entity.GetSelectCountFrom(sqlWhere);
- count = Convert.ToInt32(repository.ExecuteScalar(sql));
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
}
data.Limit = criteria.limit;
diff --git a/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs
index d924a85..79f30eb 100644
--- a/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs
+++ b/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs
@@ -134,7 +134,7 @@ namespace CloudBuilder.Master.Service
FamilyTreeResultData data = new FamilyTreeResultData();
FamilyTreeViewEntity[] list = null;
- int count = 0;
+ Int64 count = 0;
string sqlWhere = null;
@@ -162,7 +162,7 @@ namespace CloudBuilder.Master.Service
if (list != null && list.Length > 0)
{
sql = entity.GetSelectCountFrom(sqlWhere);
- count = Convert.ToInt32(repository.ExecuteScalar(sql));
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
}
data.Limit = criteria.limit;
diff --git a/CloudBuilder/CloudBuilder.Master.Service/FileTypePolicyService.cs b/CloudBuilder/CloudBuilder.Master.Service/FileTypePolicyService.cs
new file mode 100644
index 0000000..b7b13e0
--- /dev/null
+++ b/CloudBuilder/CloudBuilder.Master.Service/FileTypePolicyService.cs
@@ -0,0 +1,48 @@
+using CloudBuilder.Core.DatabaseAccessor.Entity;
+using CloudBuilder.Core.Service;
+using CloudBuilder.Security.Policy;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CloudBuilder.Master.Service
+{
+ public class FileTypePolicyService : IFileTypePolicyService
+ {
+ private readonly IApplicationService service;
+
+ public FileTypePolicyService(IApplicationService service)
+ {
+ this.service = service;
+ }
+
+ [AllowAnonymous]
+ [HttpPost]
+ public SelectOption[] FindSelectOption(bool blank)
+ {
+ FileTypePolicy policy = FileTypePolicy.GetInstance(service);
+ string[] values = policy.GetValues();
+ List l = new List();
+
+ SelectOption selectOption;
+ if (blank)
+ {
+ selectOption = new SelectOption();
+ l.Add(selectOption);
+ }
+
+ foreach (string value in values)
+ {
+ selectOption = new SelectOption();
+ selectOption.BindValue = value;
+ selectOption.DisplayName = policy.ComposeMessage(value, service.Locale);
+ l.Add(selectOption);
+ }
+ return l.ToArray();
+ }
+ }
+}
diff --git a/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs
new file mode 100644
index 0000000..523fd26
--- /dev/null
+++ b/CloudBuilder/CloudBuilder.Master.Service/PublishAudioService.auto.cs
@@ -0,0 +1,407 @@
+
+using CloudBuilder.Core.DatabaseAccessor;
+using CloudBuilder.Core.DatabaseAccessor.Entity;
+using CloudBuilder.Core.Policy;
+using CloudBuilder.Core.Service;
+using CloudBuilder.Master.Data;
+using CloudBuilder.Master.Entity;
+using CloudBuilder.Master.Policy;
+using CloudBuilder.Master.SearchCriteria;
+using CloudBuilder.Security.Entity;
+using CloudBuilder.Security.Policy;
+using CloudBuilder.Security.Service;
+using CloudBuilder.Security.Utility;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.Extensions.DependencyInjection;
+namespace CloudBuilder.Master.Service
+{
+ public class PublishAudioService : IPublishAudioService
+ {
+ private readonly IApplicationService service;
+
+ private IRepository repository;
+ public PublishAudioService(IApplicationService service)
+ {
+ this.service = service;
+ repository = service.GetRepository>();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Find)]
+ public PublishAudioData FindByKey(string key)
+ {
+ PublishAudioData data = new PublishAudioData();
+ if (string.IsNullOrEmpty(key)) return data;
+
+ PublishAudioEntity publish = repository.DetachedEntities.Where(x => x.PublishName == key).FirstOrDefault();
+
+ if (publish == null) return data;
+
+ IRepository repositoryPublishAudioFamilyGroup = repository.GetRepository>();
+ IRepository repositoryFamilyGroup = repository.GetRepository>();
+
+
+ IQueryable? q = from e in repositoryPublishAudioFamilyGroup.DetachedEntities
+ join fg in repositoryFamilyGroup.DetachedEntities on e.FamilyName equals fg.FamilyName
+ where e.PublishName == key
+ select new PublishAudioFamilyGroupDisplayData(fg)
+ {
+ CreatedBy = e.CreatedBy,
+ CreatedDatetime = e.CreatedDatetime,
+ UpdatedBy = e.UpdatedBy,
+ UpdatedDatetime = e.UpdatedDatetime,
+ PublishName = e.PublishName,
+ };
+
+ data.FamilyGroups = q.ToArray();
+ if (publish.OwnerName != service.UserId && !YesNoPolicy.IsYes(publish.OpenIndc) && data.FamilyGroups.Length == 0)
+ {
+ throw new ValidatedException("没有权限.");
+ }
+ else if (publish.OwnerName != service.UserId && !YesNoPolicy.IsYes(publish.OpenIndc) && data.FamilyGroups.Length > 0)
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+
+ IQueryable? fgm = from e in repositoryFamilyGroupManager.DetachedEntities
+ where e.UserName == service.UserId && data.FamilyGroups.Where(x => x.FamilyName == e.FamilyName).Count() > 0
+ select e.UserName;
+
+ if (fgm.Count() == 0)
+ throw new ValidatedException("没有权限.");
+ }
+
+ data.PublishAudio = publish;
+
+ IRepository repositoryPublishAudioDetail = repository.GetRepository>();
+ data.Details = repositoryPublishAudioDetail.DetachedEntities.Where(x => x.PublishName == publish.PublishName).OrderBy(x => x.OrderBy).Select(x => new PublishAudioDetailDisplayData(x)).ToArray();
+
+ if (data.Details != null && data.Details.Length > 0)
+ {
+ var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath];
+ var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory];
+ var scale = service.Configuration[ServiceSettingsPolicy.DmsFileScaleDirectory].Replace(phy, "");
+
+ foreach (var item in data.Details)
+ {
+ if (!string.IsNullOrEmpty(item.Pic) && FileTypePolicy.GetType(item.Pic!) == FileTypePolicy.PHOTO)
+ {
+ var fileExtension = Path.GetExtension(item.Pic);
+ var filePathRel = Path.Combine(scale, item.CreatedBy, fileExtension.Replace(".", ""), "");
+ var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/');
+ item.FormattedPic = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + item.Pic;
+ }
+ if (!string.IsNullOrEmpty(item.Url) && FileTypePolicy.GetType(item.Url!) == FileTypePolicy.AUDIO)
+ {
+ var fileExtension = Path.GetExtension(item.Url);
+ var backup = service.Configuration[ServiceSettingsPolicy.DmsFileBackupDirectory].Replace(phy, "");
+ var filePathRel = Path.Combine(backup, item.CreatedBy, fileExtension.Replace(".", ""), "");
+ var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/');
+ item.FormattedUrl = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + item.Url;
+ }
+ if (!string.IsNullOrEmpty(item.Lrc) && FileTypePolicy.GetType(item.Lrc!) == FileTypePolicy.LYRIC)
+ {
+ var fileExtension = Path.GetExtension(item.Lrc);
+ var upload = service.Configuration[ServiceSettingsPolicy.DmsFileUploadDirectory].Replace(phy, "");
+ var filePathRel = Path.Combine(upload, item.CreatedBy, fileExtension.Replace(".", ""), "");
+ var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/');
+ item.FormattedLrc = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + item.Lrc;
+ }
+ }
+
+ }
+
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Find)]
+ public PublishAudioResultData FindBySearchCriteria(PublishAudioSearchCriteria criteria)
+ {
+ PublishAudioResultData data = new PublishAudioResultData();
+ PublishAudioEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ sqlWhere = sqlWhere + string.Format(" and ({0} ='{1}' or {2} ='{3}') ",
+ PublishAudioEntity.DB_OWNER_NAME, service.UserId,
+ PublishAudioEntity.DB_OPEN_INDC, criteria.IsModal ? service.UserId : YesNoPolicy.YES);
+
+ PublishAudioEntity entity = PublishAudioEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ string err = null;
+ try
+ {
+ list = repository.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+ data.Datas = list;
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Find)]
+ public PublishAudioData FindPublishAudioDefault()
+ {
+ PublishAudioEntity publish = repository.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.DefaultIndc == YesNoPolicy.YES).FirstOrDefault();
+ if (publish == null) return null;
+ return FindByKey(publish.PublishName);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Print)]
+ public dynamic PrintBySearchCriteria(PublishAudioSearchCriteria criteria)
+ {
+ throw new NotImplementedException();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Insert)]
+ [UnitOfWork]
+ public PublishAudioData Insert(PublishAudioData data)
+ {
+ PublishAudioEntity photoPublish = repository.DetachedEntities.Where(x => x.PublishLocalName == data.PublishAudio.PublishLocalName).FirstOrDefault();
+ if (photoPublish != null)
+ {
+ throw new ValidatedException($"[{photoPublish.PublishLocalName}]已发布.");
+ }
+
+ Validate(data.PublishAudio);
+
+ if (data.PublishAudio.DefaultIndc == YesNoPolicy.YES)
+ {
+ CancelDefaultIndc(null);
+ }
+
+ photoPublish = new PublishAudioEntity();
+ ObjectCopyHelper.Copy(data.PublishAudio, photoPublish);
+
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+
+ photoPublish.PublishName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.AUDIO_PUBLISH, MasterPrefixPolicy.AUDIO_PUBLISH_PUBLISH_NAME, "AP", YesNoPolicy.YES, "yymmdd00000");
+ photoPublish.OwnerName = service.UserId;
+
+ repository.InsertNow(photoPublish);
+
+ SavePublishAudioFamilyGroup(photoPublish.PublishName, data.FamilyGroups);
+
+ return FindByKey(photoPublish.PublishName);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Update)]
+ [UnitOfWork]
+ public PublishAudioData Update(PublishAudioData data)
+ {
+ PublishAudioEntity publishEntity = repository.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.PublishName == data.PublishAudio.PublishName).FirstOrDefault();
+ if (publishEntity == null)
+ {
+ throw new ValidatedException("你不是发布者无法修改.");
+ }
+
+ ValidateHelper.Validate(service, data.PublishAudio, PublishAudioEntity.DB_NAME_PUBLISH_AUDIO);
+
+ if (data.PublishAudio.DefaultIndc == YesNoPolicy.YES)
+ {
+ CancelDefaultIndc(data.PublishAudio.PublishName);
+ }
+
+ publishEntity = new PublishAudioEntity();
+ ObjectCopyHelper.Copy(data.PublishAudio, publishEntity);
+
+ repository.UpdateNow(publishEntity);
+
+ //只有删除和更新,没有插入
+ SavePublishAudioDetails(publishEntity.PublishName, data.Details);
+
+ SavePublishAudioFamilyGroup(publishEntity.PublishName, data.FamilyGroups);
+
+ return FindByKey(publishEntity.PublishName);
+ }
+
+ private void SavePublishAudioDetails(string publishName, PublishAudioDetailEntity[] details)
+ {
+ if (details != null && details.Length > 0)
+ {
+ int i = 1;
+ foreach (PublishAudioDetailEntity dtl in details)
+ {
+ dtl.OrderBy = i++;
+ }
+ }
+
+ IRepository repositoryPublishAudioDetail = repository.GetRepository>();
+
+ PublishAudioDetailEntity[] olds = repositoryPublishAudioDetail.Entities.Where(x => x.PublishName == publishName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+
+ foreach (PublishAudioDetailEntity old in olds)
+ {
+ if (details != null && details.Length > 0 && details.Where(x => x.DetailId == old.DetailId).Count() > 0)
+ {
+ PublishAudioDetailEntity dtl = details.Where(x => x.DetailId == old.DetailId).FirstOrDefault();
+
+ old.Title = dtl.Title;
+ old.Author = dtl.Author;
+ old.Pic = dtl.Pic;
+ old.Url = dtl.Url;
+ old.Lrc = dtl.Lrc;
+ old.OrderBy = dtl.OrderBy;
+ old.Notice = dtl.Notice;
+
+ repositoryPublishAudioDetail.UpdateNow(old);
+ }
+ else
+ {
+ repositoryPublishAudioDetail.DeleteNow(old);
+ }
+ }
+ }
+ }
+
+ private void Validate(PublishAudioEntity photoPublish)
+ {
+ List sysTableSchemas = service.ServiceProvider.GetRequiredService().FindByTableName(PublishAudioEntity.DB_NAME_PUBLISH_AUDIO);
+ ValidateHelper.ValidateString(photoPublish, sysTableSchemas.ToArray());
+ }
+
+ private void SavePublishAudioFamilyGroup(string publishName, PublishAudioFamilyGroupEntity[] familyGroups)
+ {
+ IRepository repositoryPublishAudioFamilyGroup = repository.GetRepository>();
+
+ PublishAudioFamilyGroupEntity[] olds = repositoryPublishAudioFamilyGroup.Entities.Where(x => x.PublishName == publishName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+
+ foreach (PublishAudioFamilyGroupEntity old in olds)
+ {
+ if (familyGroups != null && familyGroups.Length > 0 && familyGroups.Where(x => x.FamilyName == old.FamilyName).Count() > 0)
+ {
+ //只有主键,无需更新
+ //repositoryPpf.UpdateNow(old);
+ }
+ else
+ {
+ repositoryPublishAudioFamilyGroup.DeleteNow(old);
+ }
+ }
+ }
+ if (familyGroups != null && familyGroups.Length > 0)
+ foreach (PublishAudioFamilyGroupEntity dto in familyGroups)
+ {
+ if (string.IsNullOrEmpty(dto.CreatedBy))
+ repositoryPublishAudioFamilyGroup.InsertNow(new PublishAudioFamilyGroupEntity()
+ {
+ PublishName = publishName,
+ FamilyName = dto.FamilyName,
+ });
+ }
+ }
+
+
+ public void CancelDefaultIndc(string publishLocalName)
+ {
+ PublishAudioEntity[] orgs = repository.DetachedEntities.Where(x => x.PublishName != publishLocalName && x.OwnerName == service.UserId && x.DefaultIndc == YesNoPolicy.YES).ToArray();
+ foreach (PublishAudioEntity org in orgs)
+ {
+ org.DefaultIndc = YesNoPolicy.NO;
+ }
+
+ if (orgs != null && orgs.Length > 0)
+ repository.UpdateNow(orgs);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Delete)]
+ [UnitOfWork]
+ public void Delete(string key)
+ {
+ PublishAudioEntity publishEntity = repository.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.PublishName == key).FirstOrDefault();
+ if (publishEntity == null)
+ {
+ throw new ValidatedException("你不是发布者无法删除.");
+ }
+
+ repository.DeleteNow(publishEntity);
+
+
+ IRepository repositoryDetail = repository.GetRepository>();
+
+ PublishAudioDetailEntity[] detail = repositoryDetail.Entities.Where(x => x.PublishName == key).ToArray();
+ if (detail != null && detail.Length > 0)
+ {
+ foreach (PublishAudioDetailEntity dtl in detail)
+ {
+ repositoryDetail.DeleteNow(dtl);
+ }
+ }
+
+
+ IRepository repositoryFamilyGroup = repository.GetRepository>();
+
+ PublishAudioFamilyGroupEntity[] groups = repositoryFamilyGroup.Entities.Where(x => x.PublishName == key).ToArray();
+ if (groups != null && groups.Length > 0)
+ {
+ foreach (PublishAudioFamilyGroupEntity gp in groups)
+ {
+ repositoryFamilyGroup.DeleteNow(gp);
+ }
+ }
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Insert)]
+ public void InsertPublishAudioDetail(PublishData publishData)
+ {
+ IRepository repositoryDmsFile = repository.GetRepository>();
+ DmsFileUploadViewEntity dmsFile = repositoryDmsFile.DetachedEntities.Where(x => x.FileId == publishData.FileId).FirstOrDefault();
+
+ if (dmsFile == null) return;
+ if (!FileTypePolicy.IsAudio(dmsFile.OrderKey)) return;
+
+ InsertPublishAudioDetail(dmsFile, publishData.PublishName);
+ }
+
+ private void InsertPublishAudioDetail(DmsFileUploadViewEntity dmsFile, string publishName)
+ {
+ IRepository repositoryPublishAudioDetail = repository.GetRepository>();
+
+ PublishAudioDetailEntity[] dtls = repositoryPublishAudioDetail.DetachedEntities.Where(x => x.PublishName == publishName).ToArray();
+
+ if (dtls != null && dtls.Where(x => x.Url == dmsFile.OrderKey).Count() > 0) return;
+
+ PublishAudioDetailEntity dtl = new PublishAudioDetailEntity();
+ dtl.PublishName = publishName;
+ string orgFileName = Path.GetFileNameWithoutExtension(dmsFile.OrgFileName);
+ string[] tts = orgFileName.Split('-');
+ dtl.Title = tts[0].Trim();
+ if (tts.Length > 1) dtl.Author = tts[1].Trim();
+
+ dtl.OwnerName = dmsFile.OwerId;
+ if (dtls != null && dtls.Length > 0)
+ dtl.OrderBy = dtls.Sum(x => x.OrderBy) + 1;
+ dtl.Url = dmsFile.OrderKey;
+
+ repositoryPublishAudioDetail.InsertNow(dtl);
+ }
+ }
+}
diff --git a/CloudBuilder/CloudBuilder.Master.Service/PublishPhotoService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/PublishPhotoService.auto.cs
new file mode 100644
index 0000000..e931117
--- /dev/null
+++ b/CloudBuilder/CloudBuilder.Master.Service/PublishPhotoService.auto.cs
@@ -0,0 +1,441 @@
+
+using CloudBuilder.Core.DatabaseAccessor.Entity;
+using Microsoft.AspNetCore.Authorization;
+using CloudBuilder.Core.DatabaseAccessor;
+using CloudBuilder.Master.Entity;
+using CloudBuilder.Master.Policy;
+using CloudBuilder.Master.SearchCriteria;
+using CloudBuilder.Master.Data;
+using CloudBuilder.Core.Service;
+using System.Diagnostics;
+using CloudBuilder.Security.Service;
+using Microsoft.Extensions.DependencyInjection;
+using CloudBuilder.Security.Entity;
+using CloudBuilder.Security.Utility;
+using CloudBuilder.Security.Policy;
+using CloudBuilder.Core.Policy;
+namespace CloudBuilder.Master.Service
+{
+ public class PublishPhotoService : IPublishPhotoService
+ {
+ private readonly IApplicationService service;
+
+ private IRepository repository;
+ public PublishPhotoService(IApplicationService service)
+ {
+ this.service = service;
+ repository = service.GetRepository>();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishPhoto, operate: Operate.Find)]
+ public PublishPhotoData FindByKey(string key)
+ {
+ PublishPhotoData data = new PublishPhotoData();
+ if (string.IsNullOrEmpty(key)) return data;
+
+ PublishPhotoEntity publish = repository.DetachedEntities.Where(x => x.PublishName == key).FirstOrDefault();
+
+ if (publish == null) return data;
+
+ IRepository repositoryPublishPhotoFamilyGroup = repository.GetRepository>();
+ IRepository repositoryFamilyGroup = repository.GetRepository>();
+
+
+ IQueryable? q = from e in repositoryPublishPhotoFamilyGroup.DetachedEntities
+ join fg in repositoryFamilyGroup.DetachedEntities on e.FamilyName equals fg.FamilyName
+ where e.PublishName == key
+ select new PublishPhotoFamilyGroupDisplayData(fg)
+ {
+ CreatedBy = e.CreatedBy,
+ CreatedDatetime = e.CreatedDatetime,
+ UpdatedBy = e.UpdatedBy,
+ UpdatedDatetime = e.UpdatedDatetime,
+ PublishName = e.PublishName,
+ };
+
+ data.FamilyGroups = q.ToArray();
+ if (publish.OwnerName != service.UserId && !YesNoPolicy.IsYes(publish.OpenIndc) && data.FamilyGroups.Length == 0)
+ {
+ throw new ValidatedException("没有权限.");
+ }
+ else if (publish.OwnerName != service.UserId && !YesNoPolicy.IsYes(publish.OpenIndc) && data.FamilyGroups.Length > 0)
+ {
+ IRepository repositoryFamilyGroupManager = repository.GetRepository>();
+
+ IQueryable? fgm = from e in repositoryFamilyGroupManager.DetachedEntities
+ where e.UserName == service.UserId && data.FamilyGroups.Where(x => x.FamilyName == e.FamilyName).Count() > 0
+ select e.UserName;
+
+ if (fgm.Count() == 0)
+ throw new ValidatedException("没有权限.");
+ }
+
+ data.PublishPhoto = publish;
+
+ IRepository repositoryPublishPhotoDetail = repository.GetRepository>();
+ data.Details = repositoryPublishPhotoDetail.DetachedEntities.Where(x => x.PublishName == publish.PublishName).OrderBy(x => x.OrderBy).ToArray();
+
+
+ bool isAttached = Debugger.IsAttached;
+ if (data.Details != null || data.Details.Length > 0)
+ foreach (var item in data.Details)
+ {
+ item.FileName = (isAttached ? service.Configuration[AppsettingsPolicy.ApplicationUrl] : "") + item.FileName;
+ }
+
+
+ return data;
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishPhoto, operate: Operate.Find)]
+ public PublishPhotoResultData FindBySearchCriteria(PublishPhotoSearchCriteria criteria)
+ {
+ PublishPhotoResultData data = new PublishPhotoResultData();
+ PublishPhotoEntity[] list = null;
+
+ Int64 count = 0;
+
+ string sqlWhere = null;
+
+ if (criteria.Filter != null && criteria.Filter.Length > 0)
+ {
+ sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
+ }
+
+ sqlWhere = sqlWhere + string.Format(" and ({0} ='{1}' or {2} ='{3}') ",
+ PublishPhotoEntity.DB_OWNER_NAME, service.UserId,
+ PublishPhotoEntity.DB_OPEN_INDC, criteria.IsModal ? service.UserId : YesNoPolicy.YES);
+
+ PublishPhotoEntity entity = PublishPhotoEntity.GetInstance(repository.GetDbContext().Database.ProviderName);
+ string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
+
+ string err = null;
+ try
+ {
+ list = repository.FromSql(sql).ToArray();
+ }
+ catch (System.Exception ex)
+ {
+ err = ex.Message;
+ }
+
+
+ if (list != null && list.Length > 0)
+ {
+ sql = entity.GetSelectCountFrom(sqlWhere);
+ count = Convert.ToInt64(repository.ExecuteScalar(sql));
+ }
+
+ data.Limit = criteria.limit;
+ data.Page = criteria.page;
+ data.Publishs = list;
+ data.Total = count;
+ //data.Sql = sql;
+ data.ErrorMessage = err;
+ return data;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishPhoto, operate: Operate.Print)]
+ public dynamic PrintBySearchCriteria(PublishPhotoSearchCriteria criteria)
+ {
+ throw new NotImplementedException();
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishPhoto, operate: Operate.Insert)]
+ [UnitOfWork]
+ public PublishPhotoData Insert(PublishPhotoData data)
+ {
+ PublishPhotoEntity publishPhoto = repository.DetachedEntities.Where(x => x.PublishLocalName == data.PublishPhoto.PublishLocalName).FirstOrDefault();
+ if (publishPhoto != null)
+ {
+ throw new ValidatedException($"[{publishPhoto.PublishLocalName}]已发布.");
+ }
+
+ Validate(data.PublishPhoto);
+
+ if (data.PublishPhoto.DefaultIndc == YesNoPolicy.YES)
+ {
+ CancelDefaultIndc(null);
+ }
+
+ publishPhoto = new PublishPhotoEntity();
+ ObjectCopyHelper.Copy(data.PublishPhoto, publishPhoto);
+
+ ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!;
+
+ publishPhoto.PublishName = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.PHOTO_PUBLISH, MasterPrefixPolicy.PHOTO_PUBLISH_PUBLISH_NAME, "PP", YesNoPolicy.YES, "yymmdd00000");
+ publishPhoto.OwnerName = service.UserId;
+
+ repository.InsertNow(publishPhoto);
+
+ SavePublishPhotoFamilyGroup(publishPhoto.PublishName, data.FamilyGroups);
+
+ return FindByKey(publishPhoto.PublishName);
+ }
+
+ public void CancelDefaultIndc(string publishLocalName)
+ {
+ PublishPhotoEntity[] orgs = repository.DetachedEntities.Where(x => x.PublishName != publishLocalName && x.OwnerName == service.UserId && x.DefaultIndc == YesNoPolicy.YES).ToArray();
+ foreach (PublishPhotoEntity org in orgs)
+ {
+ org.DefaultIndc = YesNoPolicy.NO;
+ }
+
+ if (orgs != null && orgs.Length > 0)
+ repository.UpdateNow(orgs);
+ }
+
+ private void Validate(PublishPhotoEntity publishPhoto)
+ {
+ List sysTableSchemas = service.ServiceProvider.GetRequiredService().FindByTableName(PublishPhotoEntity.DB_NAME_PUBLISH_PHOTO);
+ ValidateHelper.ValidateString(publishPhoto, sysTableSchemas.ToArray());
+ }
+
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishPhoto, operate: Operate.Update)]
+ [UnitOfWork]
+ public PublishPhotoData Update(PublishPhotoData data)
+ {
+ //只有自己创建的才能修改
+ PublishPhotoEntity publishEntity = repository.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.PublishName == data.PublishPhoto.PublishName).FirstOrDefault();
+ if (publishEntity == null)
+ {
+ throw new ValidatedException("记录不存在.");
+ }
+
+ ValidateHelper.Validate(service, data.PublishPhoto, PublishPhotoEntity.DB_NAME_PUBLISH_PHOTO);
+
+ if (data.PublishPhoto.DefaultIndc == YesNoPolicy.YES)
+ {
+ CancelDefaultIndc(data.PublishPhoto.PublishName);
+ }
+
+ publishEntity = new PublishPhotoEntity();
+ ObjectCopyHelper.Copy(data.PublishPhoto, publishEntity);
+
+ repository.UpdateNow(publishEntity);
+
+ //只有删除和更新,没有插入
+ SavePublishPhotoDetails(publishEntity.PublishName, data.Details);
+
+ SavePublishPhotoFamilyGroup(publishEntity.PublishName, data.FamilyGroups);
+
+ return FindByKey(publishEntity.PublishName);
+ }
+
+ private void SavePublishPhotoFamilyGroup(string publishName, PublishPhotoFamilyGroupEntity[] familyGroups)
+ {
+ IRepository repositoryPublishPhotoFamilyGroup = repository.GetRepository>();
+
+ PublishPhotoFamilyGroupEntity[] olds = repositoryPublishPhotoFamilyGroup.Entities.Where(x => x.PublishName == publishName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+
+ foreach (PublishPhotoFamilyGroupEntity old in olds)
+ {
+ if (familyGroups != null && familyGroups.Length > 0 && familyGroups.Where(x => x.FamilyName == old.FamilyName).Count() > 0)
+ {
+ //只有主键,无需更新
+ //repositoryPpf.UpdateNow(old);
+ }
+ else
+ {
+ repositoryPublishPhotoFamilyGroup.DeleteNow(old);
+ }
+ }
+ }
+ if (familyGroups != null && familyGroups.Length > 0)
+ foreach (PublishPhotoFamilyGroupEntity dto in familyGroups)
+ {
+ if (string.IsNullOrEmpty(dto.CreatedBy))
+ repositoryPublishPhotoFamilyGroup.InsertNow(new PublishPhotoFamilyGroupEntity()
+ {
+ PublishName = publishName,
+ FamilyName = dto.FamilyName,
+ });
+ }
+ }
+
+ private void SavePublishPhotoDetails(string publishName, PublishPhotoDetailEntity[] details)
+ {
+ if (details != null && details.Length > 0)
+ {
+ int i = 1;
+ foreach (PublishPhotoDetailEntity dtl in details)
+ {
+ dtl.OrderBy = i++;
+ }
+ }
+
+ IRepository repositoryPublishPhotoDetail = repository.GetRepository>();
+
+ PublishPhotoDetailEntity[] olds = repositoryPublishPhotoDetail.Entities.Where(x => x.PublishName == publishName).ToArray();
+ if (olds != null && olds.Length > 0)
+ {
+ //存在更新,不存在删除
+
+ foreach (PublishPhotoDetailEntity old in olds)
+ {
+ if (details != null && details.Length > 0 && details.Where(x => x.DetailId == old.DetailId).Count() > 0)
+ {
+ PublishPhotoDetailEntity dtl = details.Where(x => x.DetailId == old.DetailId).FirstOrDefault();
+
+ old.OrderBy = dtl.OrderBy;
+ old.Notice = dtl.Notice;
+
+ repositoryPublishPhotoDetail.UpdateNow(old);
+ }
+ else
+ {
+ repositoryPublishPhotoDetail.DeleteNow(old);
+ }
+ }
+ }
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishPhoto, operate: Operate.Delete)]
+ [UnitOfWork]
+ public void Delete(string key)
+ {
+ PublishPhotoEntity publishEntity = repository.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.PublishName == key).FirstOrDefault();
+ if (publishEntity == null)
+ {
+ throw new ValidatedException("记录不存在.");
+ }
+
+ repository.DeleteNow(publishEntity);
+
+ IRepository repositoryDetail = repository.GetRepository>();
+
+ PublishPhotoDetailEntity[] detail = repositoryDetail.Entities.Where(x => x.PublishName == key).ToArray();
+ if (detail != null && detail.Length > 0)
+ {
+ foreach (PublishPhotoDetailEntity dtl in detail)
+ {
+ repositoryDetail.DeleteNow(dtl);
+ }
+ }
+
+ IRepository repositoryFamilyGroup = repository.GetRepository>();
+
+ PublishPhotoFamilyGroupEntity[] groups = repositoryFamilyGroup.Entities.Where(x => x.PublishName == key).ToArray();
+ if (groups != null && groups.Length > 0)
+ {
+ foreach (PublishPhotoFamilyGroupEntity gp in groups)
+ {
+ repositoryFamilyGroup.DeleteNow(gp);
+ }
+ }
+ }
+
+ [AllowAnonymous]
+ public PublishPhotoDetailEntity[] FindPublishPhotoDetailByPublishName(string publishName)
+ {
+ List publishPhotoDetails = new List();
+ if (string.IsNullOrEmpty(publishName)) return publishPhotoDetails.ToArray();
+
+ IRepository repositoryPublishPhoto = repository.GetRepository>();
+ PublishPhotoEntity publishPhoto = repositoryPublishPhoto.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.PublishName == publishName).FirstOrDefault();
+
+ if (publishPhoto == null)
+ return publishPhotoDetails.ToArray();
+
+ IRepository repositoryPublishPhotoDetail = repository.GetRepository>();
+ PublishPhotoDetailEntity[] dtls = repositoryPublishPhotoDetail.DetachedEntities.Where(x => x.PublishName == publishName).OrderBy(x => x.OrderBy).ToArray();
+
+ if (dtls == null || dtls.Length == 0) return publishPhotoDetails.ToArray();
+
+ bool isAttached = Debugger.IsAttached;
+ foreach (var item in dtls)
+ {
+ if (item.FileName.ToLower().StartsWith("http")) continue;
+
+ item.FileName = (isAttached ? service.Configuration[AppsettingsPolicy.ApplicationUrl] : "") + item.FileName;
+ }
+
+ return dtls;
+ }
+
+ [AllowAnonymous]
+ public PublishPhotoDetailEntity[] FindPublishPhotoDetail()
+ {
+ PublishPhotoEntity publishPhoto = repository.DetachedEntities.Where(x => x.OwnerName == service.UserId && x.DefaultIndc == YesNoPolicy.YES).FirstOrDefault();
+ List publishPhotoDetails = new List();
+ if (publishPhoto == null)
+ return publishPhotoDetails.ToArray();
+
+ IRepository repositoryPublishPhotoDetail = repository.GetRepository>();
+
+ PublishPhotoDetailEntity[] dtls = repositoryPublishPhotoDetail.DetachedEntities.Where(x => x.PublishName == publishPhoto.PublishName).OrderBy(x => x.OrderBy).ToArray();
+
+ if (dtls == null || dtls.Length == 0) return dtls;
+
+ bool isAttached = Debugger.IsAttached;
+ foreach (var item in dtls)
+ {
+ if (item.FileName.ToLower().StartsWith("http")) continue;
+
+ item.FileName = (isAttached ? service.Configuration[AppsettingsPolicy.ApplicationUrl] : "") + item.FileName;
+ }
+
+ return dtls;
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Insert)]
+ public void InsertPublishPhotoDetail(PublishData publishData)
+ {
+ IRepository repositoryDmsFile = repository.GetRepository>();
+ DmsFileEntity dmsFile = repositoryDmsFile.DetachedEntities.Where(x => x.FileId == publishData.FileId).FirstOrDefault();
+
+ if (dmsFile == null) return;
+ if (!FileTypePolicy.IsPhoto(dmsFile.OrderKey)) return;
+
+ InsertPublishPhotoDetail(dmsFile, publishData.PublishName);
+ }
+
+ [PermissionOperate(name: MasterPermissionPolicy.PublishAudio, operate: Operate.Insert)]
+ public void InsertPublishPhotoDetailByFamilyGroup(PublishData publishData)
+ {
+ IRepository repositoryDmsFile = repository.GetRepository>();
+ FamilyDmsFileViewEntity dmsFile = repositoryDmsFile.DetachedEntities.Where(x => x.FileId == publishData.FileId).FirstOrDefault();
+
+ if (dmsFile == null) return;
+ if (!(dmsFile.OrderKey.ToLower().Contains(".jpg") || dmsFile.OrderKey.ToLower().Contains(".png") ||
+ dmsFile.OrderKey.ToLower().Contains(".gif") || dmsFile.OrderKey.ToLower().Contains(".jpeg"))) return;
+
+ DmsFileEntity dmsFileEntity = new DmsFileEntity();
+ ObjectCopyHelper.Copy(dmsFile, dmsFileEntity);
+ InsertPublishPhotoDetail(dmsFileEntity, publishData.PublishName);
+ }
+
+ private void InsertPublishPhotoDetail(DmsFileEntity dmsFile, string publishName)
+ {
+ IRepository repositoryPublishPhotoDetail = repository.GetRepository