SjPackageAppService.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Abp.Application.Services.Dto;
  5. using Abp.Auditing;
  6. using Abp.Domain.Repositories;
  7. using Abp.Runtime.Caching;
  8. using IwbZero.ToolCommon.LogHelpers;
  9. using IwbZero.ToolCommon.StringModel;
  10. using WeEngine.CommonDto.WeInfo;
  11. using WeEngine.ComponentInfo;
  12. using WeEngine.Enum;
  13. using WeEngine.ModelInfo;
  14. using WePlatform.Configuration;
  15. using WePlatform.DataCenter.SjPackage.Dto;
  16. using WePlatform.WeLib;
  17. using WePlatform.WeLib.Package;
  18. namespace WePlatform.DataCenter.SjPackage
  19. {
  20. /// <summary>
  21. /// 方案包API
  22. /// </summary>
  23. [DisableAuditing]
  24. public class SjPackageAppService : DataCenterAppServiceBase, ISjPackageAppService
  25. {
  26. public SjPackageAppService(IRepository<PackageXmlInfo> xmlRepository, IRepository<PackageInfo, string> packageRepository, PackageAppService packageApp, ICacheManager cacheManager, IRepository<SceneFlowInfo, string> flowRepository, IRepository<SceneInfo, string> sceneRepository, IRepository<BehaviorInfo, string> behaviorRepository, IRepository<SceneBehaviorInfo> sbRepository)
  27. {
  28. XmlRepository = xmlRepository;
  29. PackageRepository = packageRepository;
  30. PackageApp = packageApp;
  31. FlowRepository = flowRepository;
  32. SceneRepository = sceneRepository;
  33. BehaviorRepository = behaviorRepository;
  34. SbRepository = sbRepository;
  35. CacheManager = cacheManager;
  36. }
  37. protected IRepository<PackageXmlInfo> XmlRepository { get; }
  38. protected IRepository<PackageInfo, string> PackageRepository { get; }
  39. protected IRepository<SceneFlowInfo, string> FlowRepository { get; }
  40. protected IRepository<SceneInfo, string> SceneRepository { get; }
  41. protected IRepository<BehaviorInfo, string> BehaviorRepository { get; }
  42. protected IRepository<SceneBehaviorInfo> SbRepository { get; }
  43. protected PackageAppService PackageApp { get; }
  44. #region SJ
  45. /// <summary>
  46. /// 导入方案包(松江沙盘演练)
  47. /// </summary>
  48. /// <param name="input"></param>
  49. /// <returns></returns>
  50. public async Task<string> Export(SjExportPackage input)
  51. {
  52. var package = input.PackageNo.IsEmpty()
  53. ? new PackageInfo()
  54. {
  55. Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.PackageInfo),
  56. PackageName = input.Title,
  57. SceneCategory = input.CategoryNo.IsEmpty() ? IwbConsts.SjShaPanCategoryNo : input.CategoryNo,
  58. Description = input.InitFaultInfo,
  59. EngineModelNo = IwbConsts.NonEvolutionEngineModelNo,
  60. EvalModelNo = IwbConsts.EvalModelNo,
  61. PackageState = PackageStateDefinition.Solidified,
  62. Remark = "松江沙盘演练系统导入",
  63. AssessAuto = true,
  64. AssessRoleNames = "",
  65. AssessRoleNos = "",
  66. ContentInfo = ""
  67. }
  68. : await PackageRepository.FirstOrDefaultAsync(a => a.Id == input.PackageNo);
  69. if (package == null)
  70. {
  71. this.LogError($"未查到方案包![{input.PackageNo}]");
  72. return "";
  73. }
  74. var pModel = await PackageFrom(input, package);
  75. package.ContentInfo = package.ContentInfo.IsEmpty() ? GetPackageContentInfo(pModel) : package.ContentInfo;
  76. pModel.Components = pModel.Components ?? new List<EngineComponent>();
  77. var xmlDto = pModel.Package2Xml();
  78. xmlDto.PackageNo = package.Id;
  79. if (input.PackageNo.IsEmpty())
  80. {
  81. var xmlEntity = xmlDto.Obj2String().Str2Obj<PackageXmlInfo>();
  82. await XmlRepository.InsertAsync(xmlEntity);
  83. await PackageRepository.InsertAsync(package);
  84. }
  85. else
  86. {
  87. package.PackageName = input.Title;
  88. package.Description = input.InitFaultInfo;
  89. await PackageRepository.UpdateAsync(package);
  90. var xmlEntity = await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == input.PackageNo);
  91. xmlEntity.PackageXml = xmlDto.PackageXml;
  92. xmlEntity.FlowXml = xmlDto.FlowXml;
  93. xmlEntity.SceneXml = xmlDto.SceneXml;
  94. xmlEntity.BehaviorXml = xmlDto.BehaviorXml;
  95. xmlEntity.GuideXml = xmlDto.GuideXml;
  96. xmlEntity.EnvironResourceXml = xmlDto.EnvironResourceXml;
  97. xmlEntity.ComponentXml = xmlDto.ComponentXml;
  98. xmlEntity.AllRoles = xmlDto.AllRoles;
  99. await XmlRepository.UpdateAsync(xmlEntity);
  100. }
  101. return package.Id;
  102. }
  103. /// <summary>
  104. /// 查询方案包(松江沙盘演练)
  105. /// </summary>
  106. /// <param name="input"></param>
  107. /// <returns></returns>
  108. public async Task<SjExportPackage> Query(EntityDto<string> input)
  109. {
  110. return await QueryByNo(input.Id);
  111. }
  112. /// <summary>
  113. /// 查询方案包(松江沙盘演练)
  114. /// </summary>
  115. /// <param name="no"></param>
  116. /// <returns></returns>
  117. public async Task<SjExportPackage> QueryByNo(string no)
  118. {
  119. var package = await PackageRepository.FirstOrDefaultAsync(a => a.Id == no);
  120. var xmlEntity = await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == no);
  121. if (package == null || xmlEntity == null)
  122. {
  123. return null;
  124. }
  125. var weXmlDto = new WePackageXmlDto()
  126. {
  127. PackageXml = xmlEntity.PackageXml,
  128. FlowXml = xmlEntity.FlowXml,
  129. SceneXml = xmlEntity.SceneXml,
  130. BehaviorXml = xmlEntity.BehaviorXml,
  131. GuideXml = xmlEntity.GuideXml,
  132. EnvironResourceXml = xmlEntity.EnvironResourceXml,
  133. ComponentXml = xmlEntity.ComponentXml,
  134. AllRoles = xmlEntity.AllRoles
  135. };
  136. var packageModel= new PackageModel().BuildPackageModelByXml(weXmlDto);
  137. var behaviorModels = packageModel.AllBehaviorModels;
  138. var sceneModels = packageModel.AllSceneModels;
  139. var scenes = new List<SjExportScene>();
  140. if (sceneModels != null && sceneModels.Any())
  141. {
  142. foreach (var sceneModel in sceneModels)
  143. {
  144. var behavior = behaviorModels.FirstOrDefault(a => sceneModel.BehaviorNos == a.Id);//.Where(a => sceneModel.BehaviorNos.Contains(a.Id)).ToList();
  145. scenes.Add(new SjExportScene()
  146. {
  147. SceneNo = sceneModel.Id,
  148. Question = sceneModel.Description,
  149. Section = sceneModel.SceneTag,
  150. Description = sceneModel.Description,
  151. CorrectAnswer = behavior?.Description,
  152. StandardTotalScore = behavior?.Weights ?? 0
  153. });
  154. }
  155. }
  156. var dto = new SjExportPackage()
  157. {
  158. PackageNo = package.Id,
  159. Title = package.PackageName,
  160. InitFaultInfo = package.Description,
  161. SceneList = scenes
  162. };
  163. return dto;
  164. }
  165. private async Task<PackageModel> PackageFrom(SjExportPackage input, PackageInfo package)
  166. {
  167. PackageModel pModel;
  168. SceneFlowModel flow;
  169. if (package.ContentInfo.IsEmpty())
  170. {
  171. pModel = new PackageModel()
  172. {
  173. Id = package.Id,
  174. No = "P",
  175. Name = package.PackageName,
  176. SceneCategory = package.SceneCategory,
  177. ParentPath = null,
  178. Path = "P",
  179. Children = new List<RoundModel>()
  180. };
  181. var round = new RoundModel()
  182. {
  183. Id = "R1",
  184. No = "R1",
  185. Name = "第一轮",
  186. RoundIndex = 1,
  187. SceneCategory = package.SceneCategory,
  188. Path = $"{pModel.Path}_R1",
  189. ParentPath = pModel.Path,
  190. Children = new List<BlockModel>()
  191. };
  192. var block = new BlockModel()
  193. {
  194. Id = "SBF1",
  195. No = "SBF1",
  196. Name = "题库",
  197. SceneCategory = package.SceneCategory,
  198. Path = $"{round.Path}_SBF1",
  199. ParentPath = round.Path,
  200. Children = new List<SceneFlowModel>()
  201. };
  202. var flowId = await AppGuidManager.GetNextRecordIdAsync(DataLibType.SceneFlowInfo);
  203. flow = new SceneFlowModel()
  204. {
  205. Id = flowId,
  206. No = flowId,
  207. Name = $"题库_沙盘演练({input.Title})",
  208. SceneCategory = package.SceneCategory,
  209. Path = $"{block.Path}_{flowId}",
  210. ParentPath = block.Path,
  211. Children = new List<FlowModel>(),
  212. };
  213. flow = await FlowFrom(input.SceneList, flow);
  214. block.Children.Add(flow);
  215. round.Children.Add(block);
  216. pModel.Children.Add(round);
  217. var flowEntity = new SceneFlowInfo()
  218. {
  219. Id = flowId,
  220. FlowName = flow.Name,
  221. SceneCategory = package.SceneCategory,
  222. ContentInfo = GetFlowContentInfo(flow),
  223. ComponentInfo = "",
  224. SceneFlowState = SceneFlowStateDefinition.Solidified,
  225. Variable = ""
  226. };
  227. await FlowRepository.InsertAsync(flowEntity);
  228. }
  229. else
  230. {
  231. pModel = package.ContentInfo.Str2Obj<PackageModel>();
  232. var block =pModel?.Children?.FirstOrDefault()?.Children?.FirstOrDefault();
  233. var flowNo = block?.FlowNos;
  234. var flowEntity = await FlowRepository.FirstOrDefaultAsync(a => a.Id == flowNo);
  235. if (flowEntity != null)
  236. {
  237. flow = flowEntity.ContentInfo.Str2Obj<SceneFlowModel>();
  238. flow = await FlowFrom(input.SceneList, flow);
  239. flowEntity.FlowName = $"题库_沙盘演练({input.Title})";
  240. flowEntity.ContentInfo = GetFlowContentInfo(flow);
  241. await FlowRepository.UpdateAsync(flowEntity);
  242. }
  243. }
  244. return pModel;
  245. }
  246. private async Task<SceneFlowModel> FlowFrom(List<SjExportScene> scenes, SceneFlowModel flow)
  247. {
  248. if (scenes.Any())
  249. {
  250. var flowNode = new FlowModel()
  251. {
  252. Id = "FN1",
  253. No = "FN1",
  254. SceneCategory = flow.SceneCategory,
  255. Name = flow.Name,
  256. Path = $"{flow.Path}_FN1",
  257. ParentPath = flow.Path,
  258. Children = new List<FlowModel>(),
  259. SceneInfos = new List<SceneModel>()
  260. };
  261. var i = 0;
  262. foreach (var s in scenes)
  263. {
  264. i++;
  265. var sModel = await SceneFrom(i, s, flowNode, flow);
  266. flowNode.SceneInfos.Add(sModel);
  267. }
  268. flow.Children?.Add(flowNode);
  269. }
  270. return flow;
  271. }
  272. private async Task<SceneModel> SceneFrom(int index, SjExportScene scene, FlowModel flowNode, SceneFlowModel flow)
  273. {
  274. var sModel = new SceneModel()
  275. {
  276. Id = scene.SceneNo.IsEmpty() ? $"SN{index}" : scene.SceneNo,
  277. No = $"SN{index}",
  278. SceneCategory = flow.SceneCategory,
  279. Name = scene.Question.Length>SceneInfo.NameLength? scene.Question.Substring(0, SceneInfo.NameLength - 1):scene.Question,
  280. SceneTag = scene.Section,
  281. SceneType = (int)SceneType.NonEvolution,
  282. _description = scene.Question,
  283. Path = $"{flowNode.Path}_SN{index}",
  284. ParentPath = flowNode.Path,
  285. Children = new List<BehaviorModel>()
  286. };
  287. if (scene.CorrectAnswer.IsEmpty())
  288. {
  289. scene.CorrectAnswer = scene.Question;
  290. }
  291. var bModel = new BehaviorModel()
  292. {
  293. Id = $"BN1",
  294. No = $"BN1",
  295. SceneCategory = flow.SceneCategory,
  296. Name = scene.CorrectAnswer.Length > BehaviorInfo.NameLength
  297. ? scene.CorrectAnswer.Substring(0, BehaviorInfo.NameLength)
  298. : scene.CorrectAnswer,
  299. Description = scene.CorrectAnswer,
  300. Weights = scene.StandardTotalScore,
  301. Path = $"{sModel.Path}_BN1",
  302. ParentPath = sModel.Path,
  303. };
  304. sModel.Children.Add(bModel);
  305. var sceneEntity = await SaveScene(sModel);
  306. sModel.Id = sceneEntity.Id;
  307. return sModel;
  308. }
  309. private async Task<SceneInfo> SaveScene(SceneModel s)
  310. {
  311. var sceneEntity = await SceneRepository.FirstOrDefaultAsync(a => a.Id == s.Id || s.Name.StartsWith(a.Name));
  312. if (sceneEntity == null)
  313. {
  314. sceneEntity = new SceneInfo()
  315. {
  316. Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.SceneInfo),
  317. Name = s.Name,
  318. Description = s.Description,
  319. SceneCategory = s.SceneCategory,
  320. SceneTag = s.SceneTag,
  321. SceneType = s.SceneType,
  322. Remark = "松江EXCEL导入"
  323. };
  324. await SceneRepository.InsertAndGetIdAsync(sceneEntity);
  325. }
  326. else
  327. {
  328. sceneEntity.Name = s.Name;
  329. sceneEntity.Description = s.Description;
  330. sceneEntity.SceneTag = s.SceneTag;
  331. await SceneRepository.UpdateAsync(sceneEntity);
  332. }
  333. foreach (var child in s.Children)
  334. {
  335. var b = child;
  336. var behaviorEntity = await SaveBehavior(b, sceneEntity.Id);
  337. b.Id = behaviorEntity.Id;
  338. }
  339. return sceneEntity;
  340. }
  341. private async Task<BehaviorInfo> SaveBehavior(BehaviorModel b, string sceneNo)
  342. {
  343. var behaviorEntity = await BehaviorRepository.FirstOrDefaultAsync(a => a.Id == b.Id || b.Name.StartsWith(a.BehaviorName));
  344. if (behaviorEntity == null)
  345. {
  346. behaviorEntity = new BehaviorInfo
  347. {
  348. Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.BehaviorInfo),
  349. BehaviorName = b.Name,
  350. SceneCategory = b.SceneCategory,
  351. Description = b.Description,
  352. RoleLogicType = (int)BehaviorRoleLogicType.Or,
  353. BehaviorTag = "",
  354. };
  355. await BehaviorRepository.InsertAndGetIdAsync(behaviorEntity);
  356. await SbRepository.InsertAsync(new SceneBehaviorInfo()
  357. {
  358. BehaviorNo = behaviorEntity.Id,
  359. SceneNo = sceneNo,
  360. BehaviorEvalType = (int)BehaviorScoreType.Normal,
  361. BehaviorWeight = b.Weights
  362. });
  363. }
  364. else
  365. {
  366. if (b.Name.IsNotEmpty())
  367. {
  368. behaviorEntity.BehaviorName = b.Name;
  369. behaviorEntity.Description = b.Description;
  370. var sb = await SbRepository.FirstOrDefaultAsync(a =>
  371. a.SceneNo == sceneNo && a.BehaviorNo == behaviorEntity.Id);
  372. if (sb != null)
  373. {
  374. sb.BehaviorWeight = b.Weights;
  375. await SbRepository.UpdateAsync(sb);
  376. }
  377. }
  378. }
  379. return behaviorEntity;
  380. }
  381. private string GetPackageContentInfo(PackageModel pModel)
  382. {
  383. var pm = new PackageModel()
  384. {
  385. Id = pModel.Id,
  386. No = pModel.No,
  387. Name = pModel.Name,
  388. Path = "P",
  389. ParentPath = "",
  390. Children = new List<RoundModel>()
  391. };
  392. if (pModel.Children != null)
  393. foreach (var child in pModel.Children)
  394. {
  395. var r = child;
  396. var round = new RoundModel()
  397. {
  398. Id = r.Id,
  399. No = r.No,
  400. Name = r.Name,
  401. Path = r.Path,
  402. ParentPath = r.ParentPath,
  403. RoundFullScore = 0,
  404. ControlRate = 0,
  405. SceneCount = 0,
  406. RoundIndex = r.RoundIndex,
  407. Children = new List<BlockModel>()
  408. };
  409. if (r.Children != null)
  410. foreach (var b in r.Children)
  411. {
  412. round.Children.Add(new BlockModel()
  413. {
  414. Id = b.Id,
  415. No = b.No,
  416. Name = b.Name,
  417. Path = b.Path,
  418. ParentPath = b.ParentPath,
  419. FlowNos = string.Join(",", b.Children?.Select(a => a.Id).ToArray() ?? new string[0]),
  420. FlowNames = string.Join(",", b.Children?.Select(a => a.Name).ToArray() ?? new string[0])
  421. });
  422. }
  423. pm.Children.Add(round);
  424. }
  425. return pm.Obj2StringCamelCase();
  426. }
  427. public string GetFlowContentInfo(SceneFlowModel fModel)
  428. {
  429. var flowNode = fModel.Children.FirstOrDefault();
  430. if (flowNode != null)
  431. {
  432. var flow = new FlowModel()
  433. {
  434. Id = flowNode.Id,
  435. No = flowNode.No,
  436. Name = flowNode.Name,
  437. Path = flowNode.Path,
  438. ParentPath = "",
  439. Children = new List<FlowModel>(),
  440. };
  441. return flow.Obj2StringCamelCase();
  442. }
  443. return "";
  444. }
  445. //private async Task FlowFrom(SjExportPackage input, PackageInfo package)
  446. //{
  447. // var flow = await FlowFrom(input.SceneList, package);
  448. // SceneFlowInfo flowEntity;
  449. // if (package.ContentInfo.IsEmpty())
  450. // {
  451. // flowEntity = new SceneFlowInfo()
  452. // {
  453. // Id = flow.Id,
  454. // FlowName = flow.Name,
  455. // SceneCategory = package.SceneCategory,
  456. // };
  457. // await FlowRepository.InsertAsync(flowEntity);
  458. // }
  459. // else
  460. // {
  461. // flowEntity = await FlowRepository.FirstOrDefaultAsync(a => a.Id == flow.Id);
  462. // await FlowRepository.UpdateAsync(flowEntity);
  463. // }
  464. //}
  465. //private async Task<FlowModel> FlowFrom(List<SjExportScene> scenes, PackageInfo package)
  466. //{
  467. // var flowModel = package.ContentInfo.IsEmpty()
  468. // ? new FlowModel()
  469. // {
  470. // Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.SceneFlowInfo),
  471. // Name = $"题库_沙盘演练({package.PackageName})"
  472. // }
  473. // : package.ContentInfo.Str2Obj<FlowModel>();
  474. // if (scenes.Any())
  475. // {
  476. // var sceneModels= new List<SceneModel>();
  477. // foreach (var s in scenes)
  478. // {
  479. // var sModel = await SceneFrom(s,package);
  480. // if (sModel != null)
  481. // {
  482. // sceneModels.Add(sModel);
  483. // }
  484. // }
  485. // flowModel.SceneInfos = sceneModels;
  486. // }
  487. // return flowModel;
  488. //}
  489. //private async Task<SceneModel> SceneFrom(SjExportScene scene, PackageInfo package)
  490. //{
  491. // var sceneModel = new SceneModel()
  492. // {
  493. // Id = scene.SceneNo,
  494. // No = scene.SceneNo,
  495. // Name = scene.Question,
  496. // Description = scene.Description,
  497. // SceneTag = scene.Section
  498. // };
  499. // if (scene.SceneNo.IsEmpty())
  500. // {
  501. // sceneModel.Id = scene.SceneNo;
  502. // sceneModel.Name = scene.Question;
  503. // sceneModel.Description = scene.Description;
  504. // sceneModel.SceneTag = scene.Section;
  505. // }
  506. // else
  507. // {
  508. // var sceneEntity = await SceneRepository.FirstOrDefaultAsync(a => a.Id == scene.SceneNo);
  509. // sceneModel.Id = sceneEntity.Id;
  510. // }
  511. // return sceneModel;
  512. //}
  513. #endregion SJ
  514. }
  515. }