This commit is contained in:
itcsx committed 2026-09-19 20:37:31 +08:00
1 parent 04c69d4941
commit 4f57b65451
15 files changed
+2338 -24

No files matched your search

@@ -1,11 +1,15 @@
using CloudBuilder.Core.DatabaseAccessor;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Core.Extensions;
using CloudBuilder.Core.Service;
using CloudBuilder.Security.Data;
using CloudBuilder.Security.Entity;
using CloudBuilder.Security.Policy;
using CloudBuilder.Security.SearchCriteria;
using CloudBuilder.Security.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.DependencyInjection;
namespace CloudBuilder.Security.Service
{
public class SecurityHelpFunctionService : ISecurityHelpFunctionService
@@ -20,10 +24,12 @@ namespace CloudBuilder.Security.Service
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)]
public SecurityHelpFunctionEntity FindByKey(string key)
public SecurityHelpFunctionData FindByKey(string key)
{
return repository.DetachedEntities.Where(x => x.HelpFunctionId == key).FirstOrDefault()!;
return FindByFunctionName(key);
}
[AllowAnonymous]
public SecurityHelpFunctionData FindAll()
{
@@ -42,10 +48,103 @@ namespace CloudBuilder.Security.Service
return data;
}
//[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)]
public dynamic FindBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria)
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)]
public SecurityHelpFunctionResultData FindBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria)
{
throw new NotImplementedException();
SecurityHelpFunctionResultData data = new SecurityHelpFunctionResultData();
SecurityHelpFunctionEntity[] list = null;
Int64 count = 0;
string sqlWhere = null;
if (criteria.Filter != null && criteria.Filter.Length > 0)
{
sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
}
SecurityHelpFunctionEntity entity = SecurityHelpFunctionEntity.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.Datas = list;
}
else
{
data.Datas = null;
}
data.Limit = criteria.limit;
data.Page = criteria.page;
data.Total = count;
data.ErrorMessage = err;
return data;
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)]
public SecurityHelpFunctionResultData FindFeatureBySearchCriteria(SecurityHelpFunctionSearchCriteria criteria)
{
SecurityHelpFunctionResultData data = new SecurityHelpFunctionResultData();
IRepository<SecurityHelpFeatureEntity> repositoryFeature = repository.GetRepository<IRepository<SecurityHelpFeatureEntity>>();
SecurityHelpFeatureEntity[] list = null;
Int64 count = 0;
string sqlWhere = null;
if (criteria.Filter != null && criteria.Filter.Length > 0)
{
sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter);
}
SecurityHelpFeatureEntity entity = SecurityHelpFeatureEntity.GetInstance(repositoryFeature.GetDbContext().Database.ProviderName);
string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere);
string err = null;
try
{
list = repositoryFeature.FromSql(sql).ToArray();
}
catch (System.Exception ex)
{
err = ex.Message;
}
if (list != null && list.Length > 0)
{
sql = entity.GetSelectCountFrom(sqlWhere);
count = Convert.ToInt64(repositoryFeature.ExecuteScalar(sql));
data.Features = list;
}
else
{
data.Features = null;
}
data.Limit = criteria.limit;
data.Page = criteria.page;
data.Total = count;
data.ErrorMessage = err;
return data;
}
//[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Print)]
@@ -56,14 +155,14 @@ namespace CloudBuilder.Security.Service
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Insert)]
[UnitOfWork]
public SecurityHelpFunctionEntity Insert(SecurityHelpFunctionEntity data)
public SecurityHelpFunctionData Insert(SecurityHelpFunctionData data)
{
throw new NotImplementedException();
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Update)]
[UnitOfWork]
public SecurityHelpFunctionEntity Update(SecurityHelpFunctionEntity data)
public SecurityHelpFunctionData Update(SecurityHelpFunctionData data)
{
throw new NotImplementedException();
}
@@ -74,7 +173,293 @@ namespace CloudBuilder.Security.Service
public void Delete(string key)
{
var ent = repository.DetachedEntities.Where(x => x.HelpFunctionId == key).FirstOrDefault()!;
if (ent != null) { repository.DeleteNow(ent); }
if (ent == null) { throw new ValidatedException("记录不存在."); }
repository.DeleteNow(ent);
// 一并清掉关联明细,避免留下孤儿记录
DeleteSteps(ent.HelpFunctionId);
DeleteFunctionFeatures(ent.FunctionName);
}
//==================== 帮助文档维护:主表 + 步骤 + 引用的组 ====================
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)]
public SecurityHelpFunctionData FindByFunctionName(string functionName)
{
SecurityHelpFunctionData data = new SecurityHelpFunctionData();
if (string.IsNullOrEmpty(functionName)) return data;
SecurityHelpFunctionEntity function = repository.DetachedEntities.Where(x => x.FunctionName == functionName).FirstOrDefault();
if (function == null) return data;
data.SecurityHelpFunction = function;
data.SecurityHelpSteps = repository.GetRepository<IRepository<SecurityHelpStepEntity>>()
.DetachedEntities.Where(x => x.HelpFunctionId == function.HelpFunctionId)
.OrderBy(x => x.StepNo).ToArray();
data.SecurityHelpFunctionFeatures = repository.GetRepository<IRepository<SecurityHelpFunctionFeatureEntity>>()
.DetachedEntities.Where(x => x.FunctionName == functionName)
.OrderBy(x => x.SortNo).ToArray();
return data;
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Update)]
[UnitOfWork]
public SecurityHelpFunctionData SaveFunction(SecurityHelpFunctionData data)
{
if (data == null || data.SecurityHelpFunction == null) throw new ValidatedException("没有要保存的内容.");
SecurityHelpFunctionEntity function = data.SecurityHelpFunction;
ValidateHelper.Validate(service, function, SecurityHelpFunctionEntity.DB_NAME_SECURITY_HELP_FUNCTION);
SecurityHelpFunctionEntity exist = repository.DetachedEntities.Where(x => x.FunctionName == function.FunctionName).FirstOrDefault();
if (exist == null)
{
if (string.IsNullOrEmpty(function.HelpFunctionId))
{
function.HelpFunctionId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FUNCTION_ID);
}
repository.InsertNow(function);
}
else
{
ObjectCopyHelper.Copy(function, exist);
repository.UpdateNow(exist);
function = exist;
}
SaveSteps(function.HelpFunctionId, data.SecurityHelpSteps);
SaveFunctionFeatures(function.FunctionName, data.SecurityHelpFunctionFeatures);
return FindByFunctionName(function.FunctionName);
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Delete)]
[UnitOfWork]
public void DeleteByFunctionName(string functionName)
{
SecurityHelpFunctionEntity function = repository.DetachedEntities.Where(x => x.FunctionName == functionName).FirstOrDefault();
if (function == null) throw new ValidatedException("记录不存在.");
repository.DeleteNow(function);
DeleteSteps(function.HelpFunctionId);
DeleteFunctionFeatures(function.FunctionName);
}
//==================== 功能点组维护:组 + 组内功能点 ====================
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Find)]
public SecurityHelpFeatureData FindByGroupCode(string groupCode)
{
SecurityHelpFeatureData data = new SecurityHelpFeatureData();
if (string.IsNullOrEmpty(groupCode)) return data;
IRepository<SecurityHelpFeatureGroupEntity> repositoryGroup = repository.GetRepository<IRepository<SecurityHelpFeatureGroupEntity>>();
SecurityHelpFeatureGroupEntity group = repositoryGroup.DetachedEntities.Where(x => x.GroupCode == groupCode).FirstOrDefault();
if (group == null) return data;
data.SecurityHelpFeatureGroup = group;
data.SecurityHelpFeatures = repository.GetRepository<IRepository<SecurityHelpFeatureEntity>>()
.DetachedEntities.Where(x => x.HelpFeatureGroupId == group.HelpFeatureGroupId)
.OrderBy(x => x.SortNo).ToArray();
return data;
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Update)]
[UnitOfWork]
public SecurityHelpFeatureData SaveFeatureGroup(SecurityHelpFeatureData data)
{
if (data == null || data.SecurityHelpFeatureGroup == null) throw new ValidatedException("没有要保存的内容.");
IRepository<SecurityHelpFeatureGroupEntity> repositoryGroup = repository.GetRepository<IRepository<SecurityHelpFeatureGroupEntity>>();
SecurityHelpFeatureGroupEntity group = data.SecurityHelpFeatureGroup;
SecurityHelpFeatureGroupEntity exist = repositoryGroup.DetachedEntities.Where(x => x.GroupCode == group.GroupCode).FirstOrDefault();
if (exist == null)
{
if (string.IsNullOrEmpty(group.HelpFeatureGroupId))
{
group.HelpFeatureGroupId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FEATURE_GROUP_ID);
}
repositoryGroup.InsertNow(group);
}
else
{
ObjectCopyHelper.Copy(group, exist);
repositoryGroup.UpdateNow(exist);
group = exist;
}
SaveFeatures(group.HelpFeatureGroupId, data.SecurityHelpFeatures);
return FindByGroupCode(group.GroupCode);
}
[PermissionOperate(name: SecurityPermissionPolicy.SecurityHelpFunction, operate: Operate.Delete)]
[UnitOfWork]
public void DeleteByGroupCode(string groupCode)
{
IRepository<SecurityHelpFeatureGroupEntity> repositoryGroup = repository.GetRepository<IRepository<SecurityHelpFeatureGroupEntity>>();
SecurityHelpFeatureGroupEntity group = repositoryGroup.DetachedEntities.Where(x => x.GroupCode == groupCode).FirstOrDefault();
if (group == null) throw new ValidatedException("记录不存在.");
repositoryGroup.DeleteNow(group);
DeleteFeatures(group.HelpFeatureGroupId);
}
//==================== 下拉选项 ====================
[AllowAnonymous]
public SecurityFunctionDisplayData[] FindFunctionNameOptions()
{
return service.ServiceProvider.GetService<ISecurityFunctionService>()!.FindMenus();
}
//==================== 私有辅助 ====================
/// <summary>
/// 生成主键,走统一的流水号服务
/// </summary>
private string NewId(string subsystemId)
{
ISecurityGeneratorNumberService generatorNumberService = service.ServiceProvider.GetService<ISecurityGeneratorNumberService>()!;
return generatorNumberService.GetNo(
SecurityPrefixPolicy.SECURITY_HELP,
subsystemId,
null,
YesNoPolicy.NO,
SecurityPrefixPolicy.SECURITY_HELP_FORMAT);
}
/// <summary>
/// 步骤整存:先清旧再插新,StepNo 按传入顺序重排
/// </summary>
private void SaveSteps(string helpFunctionId, SecurityHelpStepEntity[]? steps)
{
IRepository<SecurityHelpStepEntity> repositoryStep = repository.GetRepository<IRepository<SecurityHelpStepEntity>>();
SecurityHelpStepEntity[] olds = repositoryStep.Entities.Where(x => x.HelpFunctionId == helpFunctionId).ToArray();
if (olds != null && olds.Length > 0)
{
foreach (SecurityHelpStepEntity old in olds) repositoryStep.DeleteNow(old);
}
if (steps == null || steps.Length == 0) return;
int i = 1;
foreach (SecurityHelpStepEntity step in steps.OrderBy(x => x.StepNo).ToArray())
{
if (string.IsNullOrEmpty(step.HelpStepId))
{
step.HelpStepId = NewId(SecurityPrefixPolicy.SECURITY_HELP_STEP_ID);
}
step.HelpFunctionId = helpFunctionId;
step.StepNo = i++;
repositoryStep.InsertNow(step);
}
}
/// <summary>
/// 组合关系整存:先清旧再插新,SortNo 按传入顺序重排
/// </summary>
private void SaveFunctionFeatures(string functionName, SecurityHelpFunctionFeatureEntity[]? functionFeatures)
{
IRepository<SecurityHelpFunctionFeatureEntity> repositoryFunctionFeature = repository.GetRepository<IRepository<SecurityHelpFunctionFeatureEntity>>();
SecurityHelpFunctionFeatureEntity[] olds = repositoryFunctionFeature.Entities.Where(x => x.FunctionName == functionName).ToArray();
if (olds != null && olds.Length > 0)
{
foreach (SecurityHelpFunctionFeatureEntity old in olds) repositoryFunctionFeature.DeleteNow(old);
}
if (functionFeatures == null || functionFeatures.Length == 0) return;
int i = 1;
foreach (SecurityHelpFunctionFeatureEntity functionFeature in functionFeatures.OrderBy(x => x.SortNo).ToArray())
{
if (string.IsNullOrEmpty(functionFeature.HelpFunctionFeatureId))
{
functionFeature.HelpFunctionFeatureId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FUNCTION_FEATURE_ID);
}
functionFeature.FunctionName = functionName;
functionFeature.SortNo = i++;
repositoryFunctionFeature.InsertNow(functionFeature);
}
}
/// <summary>
/// 组内功能点整存:先清旧再插新,SortNo 按传入顺序重排
/// </summary>
private void SaveFeatures(string helpFeatureGroupId, SecurityHelpFeatureEntity[]? features)
{
IRepository<SecurityHelpFeatureEntity> repositoryFeature = repository.GetRepository<IRepository<SecurityHelpFeatureEntity>>();
SecurityHelpFeatureEntity[] olds = repositoryFeature.Entities.Where(x => x.HelpFeatureGroupId == helpFeatureGroupId).ToArray();
if (olds != null && olds.Length > 0)
{
foreach (SecurityHelpFeatureEntity old in olds) repositoryFeature.DeleteNow(old);
}
if (features == null || features.Length == 0) return;
int i = 1;
foreach (SecurityHelpFeatureEntity feature in features.OrderBy(x => x.SortNo).ToArray())
{
if (string.IsNullOrEmpty(feature.HelpFeatureId))
{
feature.HelpFeatureId = NewId(SecurityPrefixPolicy.SECURITY_HELP_FEATURE_ID);
}
feature.HelpFeatureGroupId = helpFeatureGroupId;
feature.SortNo = i++;
repositoryFeature.InsertNow(feature);
}
}
private void DeleteSteps(string helpFunctionId)
{
IRepository<SecurityHelpStepEntity> repositoryStep = repository.GetRepository<IRepository<SecurityHelpStepEntity>>();
SecurityHelpStepEntity[] olds = repositoryStep.Entities.Where(x => x.HelpFunctionId == helpFunctionId).ToArray();
if (olds == null || olds.Length == 0) return;
foreach (SecurityHelpStepEntity old in olds) repositoryStep.DeleteNow(old);
}
private void DeleteFunctionFeatures(string functionName)
{
IRepository<SecurityHelpFunctionFeatureEntity> repositoryFunctionFeature = repository.GetRepository<IRepository<SecurityHelpFunctionFeatureEntity>>();
SecurityHelpFunctionFeatureEntity[] olds = repositoryFunctionFeature.Entities.Where(x => x.FunctionName == functionName).ToArray();
if (olds == null || olds.Length == 0) return;
foreach (SecurityHelpFunctionFeatureEntity old in olds) repositoryFunctionFeature.DeleteNow(old);
}
private void DeleteFeatures(string helpFeatureGroupId)
{
IRepository<SecurityHelpFeatureEntity> repositoryFeature = repository.GetRepository<IRepository<SecurityHelpFeatureEntity>>();
SecurityHelpFeatureEntity[] olds = repositoryFeature.Entities.Where(x => x.HelpFeatureGroupId == helpFeatureGroupId).ToArray();
if (olds == null || olds.Length == 0) return;
foreach (SecurityHelpFeatureEntity old in olds) repositoryFeature.DeleteNow(old);
}
}
}