using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Abp.Application.Services.Dto; using Abp.Auditing; using Abp.Domain.Repositories; using Abp.Runtime.Caching; using IwbZero.ToolCommon.LogHelpers; using IwbZero.ToolCommon.StringModel; using WeEngine.CommonDto.WeInfo; using WeEngine.ComponentInfo; using WeEngine.Enum; using WeEngine.ModelInfo; using WePlatform.Configuration; using WePlatform.DataCenter.SjPackage.Dto; using WePlatform.WeLib; using WePlatform.WeLib.Package; namespace WePlatform.DataCenter.SjPackage { /// /// 方案包API /// [DisableAuditing] public class SjPackageAppService : DataCenterAppServiceBase, ISjPackageAppService { public SjPackageAppService(IRepository xmlRepository, IRepository packageRepository, PackageAppService packageApp, ICacheManager cacheManager, IRepository flowRepository, IRepository sceneRepository, IRepository behaviorRepository, IRepository sbRepository) { XmlRepository = xmlRepository; PackageRepository = packageRepository; PackageApp = packageApp; FlowRepository = flowRepository; SceneRepository = sceneRepository; BehaviorRepository = behaviorRepository; SbRepository = sbRepository; CacheManager = cacheManager; } protected IRepository XmlRepository { get; } protected IRepository PackageRepository { get; } protected IRepository FlowRepository { get; } protected IRepository SceneRepository { get; } protected IRepository BehaviorRepository { get; } protected IRepository SbRepository { get; } protected PackageAppService PackageApp { get; } #region SJ /// /// 导入方案包(松江沙盘演练) /// /// /// public async Task Export(SjExportPackage input) { var package = input.PackageNo.IsEmpty() ? new PackageInfo() { Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.PackageInfo), PackageName = input.Title, SceneCategory = input.CategoryNo.IsEmpty() ? IwbConsts.SjShaPanCategoryNo : input.CategoryNo, Description = input.InitFaultInfo, EngineModelNo = IwbConsts.NonEvolutionEngineModelNo, EvalModelNo = IwbConsts.EvalModelNo, PackageState = PackageStateDefinition.Solidified, Remark = "松江沙盘演练系统导入", AssessAuto = true, AssessRoleNames = "", AssessRoleNos = "", ContentInfo = "" } : await PackageRepository.FirstOrDefaultAsync(a => a.Id == input.PackageNo); if (package == null) { this.LogError($"未查到方案包![{input.PackageNo}]"); return ""; } var pModel = await PackageFrom(input, package); package.ContentInfo = package.ContentInfo.IsEmpty() ? GetPackageContentInfo(pModel) : package.ContentInfo; pModel.Components = pModel.Components ?? new List(); var xmlDto = pModel.Package2Xml(); xmlDto.PackageNo = package.Id; if (input.PackageNo.IsEmpty()) { var xmlEntity = xmlDto.Obj2String().Str2Obj(); await XmlRepository.InsertAsync(xmlEntity); await PackageRepository.InsertAsync(package); } else { package.PackageName = input.Title; package.Description = input.InitFaultInfo; await PackageRepository.UpdateAsync(package); var xmlEntity = await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == input.PackageNo); xmlEntity.PackageXml = xmlDto.PackageXml; xmlEntity.FlowXml = xmlDto.FlowXml; xmlEntity.SceneXml = xmlDto.SceneXml; xmlEntity.BehaviorXml = xmlDto.BehaviorXml; xmlEntity.GuideXml = xmlDto.GuideXml; xmlEntity.EnvironResourceXml = xmlDto.EnvironResourceXml; xmlEntity.ComponentXml = xmlDto.ComponentXml; xmlEntity.AllRoles = xmlDto.AllRoles; await XmlRepository.UpdateAsync(xmlEntity); } return package.Id; } /// /// 查询方案包(松江沙盘演练) /// /// /// public async Task Query(EntityDto input) { return await QueryByNo(input.Id); } /// /// 查询方案包(松江沙盘演练) /// /// /// public async Task QueryByNo(string no) { var package = await PackageRepository.FirstOrDefaultAsync(a => a.Id == no); var xmlEntity = await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == no); if (package == null || xmlEntity == null) { return null; } var weXmlDto = new WePackageXmlDto() { PackageXml = xmlEntity.PackageXml, FlowXml = xmlEntity.FlowXml, SceneXml = xmlEntity.SceneXml, BehaviorXml = xmlEntity.BehaviorXml, GuideXml = xmlEntity.GuideXml, EnvironResourceXml = xmlEntity.EnvironResourceXml, ComponentXml = xmlEntity.ComponentXml, AllRoles = xmlEntity.AllRoles }; var packageModel= new PackageModel().BuildPackageModelByXml(weXmlDto); var behaviorModels = packageModel.AllBehaviorModels; var sceneModels = packageModel.AllSceneModels; var scenes = new List(); if (sceneModels != null && sceneModels.Any()) { foreach (var sceneModel in sceneModels) { var behavior = behaviorModels.FirstOrDefault(a => sceneModel.BehaviorNos == a.Id);//.Where(a => sceneModel.BehaviorNos.Contains(a.Id)).ToList(); scenes.Add(new SjExportScene() { SceneNo = sceneModel.Id, Question = sceneModel.Description, Section = sceneModel.SceneTag, Description = sceneModel.Description, CorrectAnswer = behavior?.Description, StandardTotalScore = behavior?.Weights ?? 0 }); } } var dto = new SjExportPackage() { PackageNo = package.Id, Title = package.PackageName, InitFaultInfo = package.Description, SceneList = scenes }; return dto; } private async Task PackageFrom(SjExportPackage input, PackageInfo package) { PackageModel pModel; SceneFlowModel flow; if (package.ContentInfo.IsEmpty()) { pModel = new PackageModel() { Id = package.Id, No = "P", Name = package.PackageName, SceneCategory = package.SceneCategory, ParentPath = null, Path = "P", Children = new List() }; var round = new RoundModel() { Id = "R1", No = "R1", Name = "第一轮", RoundIndex = 1, SceneCategory = package.SceneCategory, Path = $"{pModel.Path}_R1", ParentPath = pModel.Path, Children = new List() }; var block = new BlockModel() { Id = "SBF1", No = "SBF1", Name = "题库", SceneCategory = package.SceneCategory, Path = $"{round.Path}_SBF1", ParentPath = round.Path, Children = new List() }; var flowId = await AppGuidManager.GetNextRecordIdAsync(DataLibType.SceneFlowInfo); flow = new SceneFlowModel() { Id = flowId, No = flowId, Name = $"题库_沙盘演练({input.Title})", SceneCategory = package.SceneCategory, Path = $"{block.Path}_{flowId}", ParentPath = block.Path, Children = new List(), }; flow = await FlowFrom(input.SceneList, flow); block.Children.Add(flow); round.Children.Add(block); pModel.Children.Add(round); var flowEntity = new SceneFlowInfo() { Id = flowId, FlowName = flow.Name, SceneCategory = package.SceneCategory, ContentInfo = GetFlowContentInfo(flow), ComponentInfo = "", SceneFlowState = SceneFlowStateDefinition.Solidified, Variable = "" }; await FlowRepository.InsertAsync(flowEntity); } else { pModel = package.ContentInfo.Str2Obj(); var block =pModel?.Children?.FirstOrDefault()?.Children?.FirstOrDefault(); var flowNo = block?.FlowNos; var flowEntity = await FlowRepository.FirstOrDefaultAsync(a => a.Id == flowNo); if (flowEntity != null) { flow = flowEntity.ContentInfo.Str2Obj(); flow = await FlowFrom(input.SceneList, flow); flowEntity.FlowName = $"题库_沙盘演练({input.Title})"; flowEntity.ContentInfo = GetFlowContentInfo(flow); await FlowRepository.UpdateAsync(flowEntity); } } return pModel; } private async Task FlowFrom(List scenes, SceneFlowModel flow) { if (scenes.Any()) { var flowNode = new FlowModel() { Id = "FN1", No = "FN1", SceneCategory = flow.SceneCategory, Name = flow.Name, Path = $"{flow.Path}_FN1", ParentPath = flow.Path, Children = new List(), SceneInfos = new List() }; var i = 0; foreach (var s in scenes) { i++; var sModel = await SceneFrom(i, s, flowNode, flow); flowNode.SceneInfos.Add(sModel); } flow.Children?.Add(flowNode); } return flow; } private async Task SceneFrom(int index, SjExportScene scene, FlowModel flowNode, SceneFlowModel flow) { var sModel = new SceneModel() { Id = scene.SceneNo.IsEmpty() ? $"SN{index}" : scene.SceneNo, No = $"SN{index}", SceneCategory = flow.SceneCategory, Name = scene.Question.Length>SceneInfo.NameLength? scene.Question.Substring(0, SceneInfo.NameLength - 1):scene.Question, SceneTag = scene.Section, SceneType = (int)SceneType.NonEvolution, _description = scene.Question, Path = $"{flowNode.Path}_SN{index}", ParentPath = flowNode.Path, Children = new List() }; if (scene.CorrectAnswer.IsEmpty()) { scene.CorrectAnswer = scene.Question; } var bModel = new BehaviorModel() { Id = $"BN1", No = $"BN1", SceneCategory = flow.SceneCategory, Name = scene.CorrectAnswer.Length > BehaviorInfo.NameLength ? scene.CorrectAnswer.Substring(0, BehaviorInfo.NameLength) : scene.CorrectAnswer, Description = scene.CorrectAnswer, Weights = scene.StandardTotalScore, Path = $"{sModel.Path}_BN1", ParentPath = sModel.Path, }; sModel.Children.Add(bModel); var sceneEntity = await SaveScene(sModel); sModel.Id = sceneEntity.Id; return sModel; } private async Task SaveScene(SceneModel s) { var sceneEntity = await SceneRepository.FirstOrDefaultAsync(a => a.Id == s.Id || s.Name.StartsWith(a.Name)); if (sceneEntity == null) { sceneEntity = new SceneInfo() { Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.SceneInfo), Name = s.Name, Description = s.Description, SceneCategory = s.SceneCategory, SceneTag = s.SceneTag, SceneType = s.SceneType, Remark = "松江EXCEL导入" }; await SceneRepository.InsertAndGetIdAsync(sceneEntity); } else { sceneEntity.Name = s.Name; sceneEntity.Description = s.Description; sceneEntity.SceneTag = s.SceneTag; await SceneRepository.UpdateAsync(sceneEntity); } foreach (var child in s.Children) { var b = child; var behaviorEntity = await SaveBehavior(b, sceneEntity.Id); b.Id = behaviorEntity.Id; } return sceneEntity; } private async Task SaveBehavior(BehaviorModel b, string sceneNo) { var behaviorEntity = await BehaviorRepository.FirstOrDefaultAsync(a => a.Id == b.Id || b.Name.StartsWith(a.BehaviorName)); if (behaviorEntity == null) { behaviorEntity = new BehaviorInfo { Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.BehaviorInfo), BehaviorName = b.Name, SceneCategory = b.SceneCategory, Description = b.Description, RoleLogicType = (int)BehaviorRoleLogicType.Or, BehaviorTag = "", }; await BehaviorRepository.InsertAndGetIdAsync(behaviorEntity); await SbRepository.InsertAsync(new SceneBehaviorInfo() { BehaviorNo = behaviorEntity.Id, SceneNo = sceneNo, BehaviorEvalType = (int)BehaviorScoreType.Normal, BehaviorWeight = b.Weights }); } else { if (b.Name.IsNotEmpty()) { behaviorEntity.BehaviorName = b.Name; behaviorEntity.Description = b.Description; var sb = await SbRepository.FirstOrDefaultAsync(a => a.SceneNo == sceneNo && a.BehaviorNo == behaviorEntity.Id); if (sb != null) { sb.BehaviorWeight = b.Weights; await SbRepository.UpdateAsync(sb); } } } return behaviorEntity; } private string GetPackageContentInfo(PackageModel pModel) { var pm = new PackageModel() { Id = pModel.Id, No = pModel.No, Name = pModel.Name, Path = "P", ParentPath = "", Children = new List() }; if (pModel.Children != null) foreach (var child in pModel.Children) { var r = child; var round = new RoundModel() { Id = r.Id, No = r.No, Name = r.Name, Path = r.Path, ParentPath = r.ParentPath, RoundFullScore = 0, ControlRate = 0, SceneCount = 0, RoundIndex = r.RoundIndex, Children = new List() }; if (r.Children != null) foreach (var b in r.Children) { round.Children.Add(new BlockModel() { Id = b.Id, No = b.No, Name = b.Name, Path = b.Path, ParentPath = b.ParentPath, FlowNos = string.Join(",", b.Children?.Select(a => a.Id).ToArray() ?? new string[0]), FlowNames = string.Join(",", b.Children?.Select(a => a.Name).ToArray() ?? new string[0]) }); } pm.Children.Add(round); } return pm.Obj2StringCamelCase(); } public string GetFlowContentInfo(SceneFlowModel fModel) { var flowNode = fModel.Children.FirstOrDefault(); if (flowNode != null) { var flow = new FlowModel() { Id = flowNode.Id, No = flowNode.No, Name = flowNode.Name, Path = flowNode.Path, ParentPath = "", Children = new List(), }; return flow.Obj2StringCamelCase(); } return ""; } //private async Task FlowFrom(SjExportPackage input, PackageInfo package) //{ // var flow = await FlowFrom(input.SceneList, package); // SceneFlowInfo flowEntity; // if (package.ContentInfo.IsEmpty()) // { // flowEntity = new SceneFlowInfo() // { // Id = flow.Id, // FlowName = flow.Name, // SceneCategory = package.SceneCategory, // }; // await FlowRepository.InsertAsync(flowEntity); // } // else // { // flowEntity = await FlowRepository.FirstOrDefaultAsync(a => a.Id == flow.Id); // await FlowRepository.UpdateAsync(flowEntity); // } //} //private async Task FlowFrom(List scenes, PackageInfo package) //{ // var flowModel = package.ContentInfo.IsEmpty() // ? new FlowModel() // { // Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.SceneFlowInfo), // Name = $"题库_沙盘演练({package.PackageName})" // } // : package.ContentInfo.Str2Obj(); // if (scenes.Any()) // { // var sceneModels= new List(); // foreach (var s in scenes) // { // var sModel = await SceneFrom(s,package); // if (sModel != null) // { // sceneModels.Add(sModel); // } // } // flowModel.SceneInfos = sceneModels; // } // return flowModel; //} //private async Task SceneFrom(SjExportScene scene, PackageInfo package) //{ // var sceneModel = new SceneModel() // { // Id = scene.SceneNo, // No = scene.SceneNo, // Name = scene.Question, // Description = scene.Description, // SceneTag = scene.Section // }; // if (scene.SceneNo.IsEmpty()) // { // sceneModel.Id = scene.SceneNo; // sceneModel.Name = scene.Question; // sceneModel.Description = scene.Description; // sceneModel.SceneTag = scene.Section; // } // else // { // var sceneEntity = await SceneRepository.FirstOrDefaultAsync(a => a.Id == scene.SceneNo); // sceneModel.Id = sceneEntity.Id; // } // return sceneModel; //} #endregion SJ } }