PackageApplicationService.cs 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073
  1. using Abp.Application.Services.Dto;
  2. using Abp.Auditing;
  3. using Abp.Authorization;
  4. using Abp.Domain.Repositories;
  5. using Abp.Runtime.Caching;
  6. using IwbZero.AppServiceBase;
  7. using IwbZero.Auditing;
  8. using IwbZero.ToolCommon.Lambda;
  9. using IwbZero.ToolCommon.StringModel;
  10. using System.Collections.Generic;
  11. using System.Data.Entity;
  12. using System.Linq;
  13. using System.Threading.Tasks;
  14. using System.Web.Mvc;
  15. using WeEngine.CommonDto.WeInfo;
  16. using WeEngine.ComponentInfo;
  17. using WeEngine.ModelInfo;
  18. using WePlatform.Authorization;
  19. using WePlatform.Configuration;
  20. using WePlatform.WeBase;
  21. using WePlatform.WeLib.Package.Dto;
  22. namespace WePlatform.WeLib.Package
  23. {
  24. [AbpAuthorize, AuditLog("方案包")]
  25. public class PackageAppService : IwbAsyncCrudAppService<PackageInfo, PackageDto, string, IwbPagedRequestDto, PackageCreateDto, PackageUpdateDto>, IPackageAppService
  26. {
  27. public PackageAppService(
  28. ICacheManager cacheManager,
  29. IRepository<PackageInfo, string> repository, IRepository<SceneFlowInfo, string> flowRepository, IRepository<SceneInfo, string> sceneRepository, IRepository<EnvironResourceRelatedInfo> errRepository, IRepository<BehaviorInfo, string> behaviorRepository, IRepository<BehaviorRelateRoleInfo> brrRepository, IRepository<GuideRelatedInfo> grRepository, IRepository<SceneBehaviorInfo> sbRepository, IRepository<BehaviorRoleInfo, string> behaviorRoleRepository, IRepository<PackageXmlInfo> xmlRepository, IRepository<GuideInfo, string> guideRepository, IRepository<BehaviorKnowledgeInfo> bkRepository) : base(repository, "Id")
  30. {
  31. FlowRepository = flowRepository;
  32. SceneRepository = sceneRepository;
  33. ErrRepository = errRepository;
  34. BehaviorRepository = behaviorRepository;
  35. BrrRepository = brrRepository;
  36. GrRepository = grRepository;
  37. SbRepository = sbRepository;
  38. BehaviorRoleRepository = behaviorRoleRepository;
  39. XmlRepository = xmlRepository;
  40. GuideRepository = guideRepository;
  41. BkRepository = bkRepository;
  42. CacheManager = cacheManager;
  43. }
  44. protected override bool KeyIsAuto { get; set; } = false;
  45. protected IRepository<SceneFlowInfo, string> FlowRepository { get; }
  46. protected IRepository<SceneInfo, string> SceneRepository { get; }
  47. protected IRepository<SceneBehaviorInfo> SbRepository { get; }
  48. protected IRepository<BehaviorInfo, string> BehaviorRepository { get; }
  49. protected IRepository<BehaviorRoleInfo, string> BehaviorRoleRepository { get; }
  50. protected IRepository<GuideInfo, string> GuideRepository { get; }
  51. protected IRepository<BehaviorRelateRoleInfo> BrrRepository { get; }
  52. protected IRepository<GuideRelatedInfo> GrRepository { get; }
  53. protected IRepository<EnvironResourceRelatedInfo> ErrRepository { get; }
  54. protected IRepository<PackageXmlInfo> XmlRepository { get; }
  55. protected IRepository<BehaviorKnowledgeInfo> BkRepository { get; }
  56. #region GetSelect
  57. [DisableAuditing]
  58. public override async Task<List<SelectListItem>> GetSelectList()
  59. {
  60. var list = await Repository.GetAllListAsync();
  61. var sList = new List<SelectListItem> { new SelectListItem { Text = @"请选择...", Value = "", Selected = true } };
  62. foreach (var l in list)
  63. {
  64. sList.Add(new SelectListItem { Value = l.Id, Text = l.PackageName });
  65. }
  66. return sList;
  67. }
  68. [DisableAuditing]
  69. public override async Task<string> GetSelectStr()
  70. {
  71. var list = await Repository.GetAllListAsync();
  72. string str = "<option value=\"\" selected>请选择...</option>";
  73. foreach (var l in list)
  74. {
  75. str += $"<option value=\"{l.Id}\">{l.PackageName}</option>";
  76. }
  77. return str;
  78. }
  79. #endregion GetSelect
  80. #region CURD
  81. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgCreate)]
  82. public override async Task Create(PackageCreateDto input)
  83. {
  84. input.Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.PackageInfo);
  85. input.PackageState = PackageStateDefinition.New;
  86. await CreateEntity(input);
  87. }
  88. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgUpdate)]
  89. public override async Task Update(PackageUpdateDto input)
  90. {
  91. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id);
  92. if (entity?.PackageState == PackageStateDefinition.Solidified)
  93. {
  94. CheckErrors("方案包已固化确认,不能再操作!");
  95. return;
  96. }
  97. await UpdateEntity(input);
  98. await CacheManager.GetCache(IwbCacheNames.PackageModelCache).RemoveAsync($"PM-{input.Id}");
  99. }
  100. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgDelete)]
  101. public override async Task Delete(EntityDto<string> input)
  102. {
  103. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id);
  104. if (entity?.PackageState == PackageStateDefinition.Solidified)
  105. {
  106. CheckErrors($"方案包已固化确认,不能再操作!");
  107. return;
  108. }
  109. await base.Delete(input);
  110. await CacheManager.GetCache(IwbCacheNames.PackageModelCache).RemoveAsync($"PM-{input.Id}-0");
  111. await CacheManager.GetCache(IwbCacheNames.PackageModelCache).RemoveAsync($"PM-{input.Id}-1");
  112. }
  113. [DisableAuditing]
  114. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  115. public override async Task<PagedResultDto<PackageDto>> GetAll(IwbPagedRequestDto input)
  116. {
  117. var query = CreateFilteredQuery(input);
  118. //query = ApplyFilter(query, input);
  119. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  120. query = ApplySorting(query, input);
  121. query = ApplyPaging(query, input);
  122. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  123. var dtoList = new PagedResultDto<PackageDto>(totalCount, entities.Select(MapToEntityDto).ToList());
  124. return dtoList;
  125. }
  126. #region GetEntity/Dto
  127. /// <summary>
  128. /// 查询实体Dto
  129. /// </summary>
  130. /// <param name="input"></param>
  131. /// <returns></returns>
  132. [DisableAuditing]
  133. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  134. public override async Task<PackageDto> GetDto(EntityDto<string> input)
  135. {
  136. var entity = await GetEntity(input);
  137. return MapToEntityDto(entity);
  138. }
  139. /// <summary>
  140. /// 查询实体Dto
  141. /// </summary>
  142. /// <param name="id"></param>
  143. /// <returns></returns>
  144. [DisableAuditing]
  145. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  146. public override async Task<PackageDto> GetDtoById(string id)
  147. {
  148. var entity = await GetEntityById(id);
  149. return MapToEntityDto(entity);
  150. }
  151. /// <summary>
  152. /// 查询实体Dto(需指明自定义字段)
  153. /// </summary>
  154. /// <param name="no"></param>
  155. /// <returns></returns>
  156. [DisableAuditing]
  157. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  158. public override async Task<PackageDto> GetDtoByNo(string no)
  159. {
  160. var entity = await GetEntityByNo(no);
  161. return MapToEntityDto(entity);
  162. }
  163. /// <summary>
  164. /// 查询实体
  165. /// </summary>
  166. /// <param name="input"></param>
  167. /// <returns></returns>
  168. [DisableAuditing]
  169. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  170. public override async Task<PackageInfo> GetEntity(EntityDto<string> input)
  171. {
  172. var entity = await GetEntityById(input.Id);
  173. return entity;
  174. }
  175. /// <summary>
  176. /// 查询实体
  177. /// </summary>
  178. /// <param name="id"></param>
  179. /// <returns></returns>
  180. [DisableAuditing]
  181. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  182. public override async Task<PackageInfo> GetEntityById(string id)
  183. {
  184. return await Repository.FirstOrDefaultAsync(a => a.Id == id);
  185. }
  186. /// <summary>
  187. /// 查询实体(需指明自定义字段)
  188. /// </summary>
  189. /// <param name="no"></param>
  190. /// <returns></returns>
  191. [DisableAuditing]
  192. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgQuery)]
  193. public override async Task<PackageInfo> GetEntityByNo(string no)
  194. {
  195. //CheckGetPermission();
  196. if (string.IsNullOrEmpty(KeyFiledName))
  197. {
  198. ThrowError("NoKeyFieldName");
  199. }
  200. return await base.GetEntityByNo(no);
  201. }
  202. #endregion GetEntity/Dto
  203. #region Hide
  204. /// <summary>
  205. /// 根据给定的<see cref="IwbPagedRequestDto"/>创建 <see cref="IQueryable{PackageInfo}"/>过滤查询.
  206. /// </summary>
  207. /// <param name="input">The input.</param>
  208. protected override IQueryable<PackageInfo> CreateFilteredQuery(IwbPagedRequestDto input)
  209. {
  210. var query = Repository.GetAllIncluding(a => a.SceneCategoryInfo);
  211. var pagedInput = input as IIwbPagedRequest;
  212. if (pagedInput == null)
  213. {
  214. return query;
  215. }
  216. if (!string.IsNullOrEmpty(pagedInput.KeyWords))
  217. {
  218. object keyWords = pagedInput.KeyWords;
  219. LambdaObject obj = new LambdaObject()
  220. {
  221. FieldType = (LambdaFieldType)pagedInput.FieldType,
  222. FieldName = pagedInput.KeyField,
  223. FieldValue = keyWords,
  224. ExpType = (LambdaExpType)pagedInput.ExpType
  225. };
  226. var exp = obj.GetExp<PackageInfo>();
  227. query = exp != null ? query.Where(exp) : query;
  228. }
  229. if (pagedInput.SearchList != null && pagedInput.SearchList.Count > 0)
  230. {
  231. List<LambdaObject> objList = new List<LambdaObject>();
  232. foreach (var o in pagedInput.SearchList)
  233. {
  234. if (string.IsNullOrEmpty(o.KeyWords))
  235. continue;
  236. if (o.KeyField.ToLower() == "sceneCategory".ToLower())
  237. {
  238. query = query.Where(a => a.SceneCategoryInfo.CategoryPath.Contains(o.KeyWords));
  239. continue;
  240. }
  241. object keyWords = o.KeyWords;
  242. objList.Add(new LambdaObject
  243. {
  244. FieldType = (LambdaFieldType)o.FieldType,
  245. FieldName = o.KeyField,
  246. FieldValue = keyWords,
  247. ExpType = (LambdaExpType)o.ExpType
  248. });
  249. }
  250. var exp = objList.GetExp<PackageInfo>();
  251. query = exp != null ? query.Where(exp) : query;
  252. }
  253. return query;
  254. }
  255. //protected override IQueryable<PackageInfo> ApplySorting(IQueryable<PackageInfo> query, IwbPagedRequestDto input)
  256. //{
  257. // return query.OrderBy(a => a.No);
  258. //}
  259. //protected override IQueryable<PackageInfo> ApplyPaging(IQueryable<PackageInfo> query, IwbPagedRequestDto input)
  260. //{
  261. // if (input is IPagedResultRequest pagedInput)
  262. // {
  263. // return query.Skip(pagedInput.SkipCount).Take(pagedInput.MaxResultCount);
  264. // }
  265. // return query;
  266. //}
  267. #endregion Hide
  268. #endregion CURD
  269. /// <summary>
  270. /// 拷贝方案包
  271. /// </summary>
  272. /// <param name="input"></param>
  273. /// <returns></returns>
  274. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgCopy), AuditLog("拷贝方案包")]
  275. public async Task Copy(EntityDto<string> input)
  276. {
  277. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id);
  278. if (entity == null)
  279. {
  280. CheckErrors($"没有查询到编号为{input.Id}的方案包!");
  281. }
  282. var dto = MapToEntityDto(entity);
  283. var newEntity = ObjectMapper.Map<PackageInfo>(dto);
  284. newEntity.Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.PackageInfo);
  285. newEntity.PackageName = $"{newEntity.PackageName}_副本";
  286. newEntity.PackageState = PackageStateDefinition.New;
  287. await Repository.InsertAsync(newEntity);
  288. }
  289. /// <summary>
  290. /// 固化方案包
  291. /// </summary>
  292. /// <param name="input"></param>
  293. /// <returns></returns>
  294. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgSolidify), AuditLog("固化方案包")]
  295. public async Task<bool> Solidify(SolidifyDto input)
  296. {
  297. var entity = await Repository.GetAllIncluding(a => a.EvalModelInfo).FirstOrDefaultAsync(a => a.Id == input.Id);
  298. if (entity == null)
  299. {
  300. CheckErrors($"没有查询到编号为{input.Id}的方案包!");
  301. return false;
  302. }
  303. if (entity.PackageState == PackageStateDefinition.Solidified)
  304. {
  305. CheckErrors($"情景流已固化确认,请勿重复操作!");
  306. return false;
  307. }
  308. var flag = await PackageVerify(input.Id);
  309. if (flag)
  310. {
  311. entity.PackageName = input.NewName.IsEmpty() ? entity.PackageName : input.NewName;
  312. entity.PackageState = PackageStateDefinition.Solidified;
  313. var xmlDto = await PackageFillXml(entity);
  314. var xmlEntity = await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == input.Id);
  315. if (xmlEntity == null)
  316. {
  317. xmlEntity = ObjectMapper.Map<PackageXmlInfo>(xmlDto);
  318. await XmlRepository.InsertAsync(xmlEntity);
  319. }
  320. else
  321. {
  322. xmlEntity.PackageXml = xmlDto.PackageXml;
  323. xmlEntity.FlowXml = xmlDto.FlowXml;
  324. xmlEntity.SceneXml = xmlDto.SceneXml;
  325. xmlEntity.BehaviorXml = xmlDto.BehaviorXml;
  326. xmlEntity.GuideXml = xmlDto.GuideXml;
  327. xmlEntity.EnvironResourceXml = xmlDto.EnvironResourceXml;
  328. xmlEntity.ComponentXml = xmlDto.ComponentXml;
  329. xmlEntity.AllRoles = xmlDto.AllRoles;
  330. await XmlRepository.UpdateAsync(xmlEntity);
  331. }
  332. }
  333. return flag;
  334. }
  335. /// <summary>
  336. /// 固化方案包详情
  337. /// </summary>
  338. /// <param name="no"></param>
  339. /// <returns></returns>
  340. [AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgDetail), AuditLog("固化方案包详情")]
  341. public async Task<PackageDetailDto> Detail(string no)
  342. {
  343. return await CacheManager.GetCache(IwbCacheNames.PackageCache).GetAsync($"PD_D-{no}", async () =>
  344. {
  345. var detail = await GetSolidifiedPackageDetail(no);
  346. detail.Flows = detail.Flows.IwbDistinct(a => a.Id).ToList();
  347. detail.Scenes = detail.Scenes.IwbDistinct(a => a.Id).ToList();
  348. detail.Behaviors = detail.Behaviors.IwbDistinct(a => a.Id).ToList();
  349. detail.Guides = detail.Guides.IwbDistinct(a => a.Id).ToList();
  350. detail.EnvironResources = detail.EnvironResources.IwbDistinct(a => a.Id).ToList();
  351. return detail;
  352. });
  353. }
  354. /// <summary>
  355. /// 获取方案包变量
  356. /// </summary>
  357. /// <param name="no"></param>
  358. /// <returns></returns>
  359. public async Task<List<ComponentVariable>> GetVariable(string no)
  360. {
  361. var list = new List<ComponentVariable>();
  362. if (no.IsEmpty())
  363. {
  364. return list;
  365. }
  366. var variableStr = (await Repository.FirstOrDefaultAsync(a => a.Id == no))?.Variable;
  367. var variableArr = variableStr?.Split(',');
  368. if (variableArr != null)
  369. {
  370. foreach (var v in variableArr)
  371. {
  372. list.Add(new ComponentVariable(v));
  373. }
  374. }
  375. return list;
  376. }
  377. #region ROLE
  378. /// <summary>
  379. /// 设置考核角色
  380. /// </summary>
  381. /// <param name="input"></param>
  382. /// <returns></returns>
  383. [AuditLog("设定考核角色")]
  384. public async Task SetAssessRole(AssessRoleDto input)
  385. {
  386. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id);
  387. if (entity == null)
  388. {
  389. CheckErrors($"未查询到编号为【{input.Id}】的方案包!");
  390. return;
  391. }
  392. entity.AssessAuto = input.AssessAuto;
  393. entity.AssessRoleNos = input.AssessRoleNos;
  394. entity.AssessRoleNames = input.AssessRoleNames;
  395. await CacheManager.GetCache(IwbCacheNames.PackageModelCache).RemoveAsync($"PM-{entity.Id}");
  396. await Repository.UpdateAsync(entity);
  397. }
  398. /// <summary>
  399. /// 获取方案包角色
  400. /// </summary>
  401. /// <param name="no"></param>
  402. /// <returns></returns>
  403. [DisableAuditing, AllowAnonymous]
  404. public async Task<AssessRoleDto> GetPackageRoles(string no)
  405. {
  406. if (no.IsEmpty())
  407. {
  408. CheckErrors("请确认方案包已保存后再进行角色配置!");
  409. }
  410. var entity = await Repository.GetAllIncluding(a => a.EvalModelInfo).FirstOrDefaultAsync(a => a.Id == no);
  411. if (entity == null)
  412. {
  413. CheckErrors($"未查询到编号为【{no}】的方案包!");
  414. return null;
  415. }
  416. var package = await GetPackageModel(entity);
  417. var roles = package.RoleInfos.OrderByDescending(a => a.RolePer).ToList();
  418. var dto = new AssessRoleDto()
  419. {
  420. AllRoles = roles,
  421. AllRoleNames = roles.Select(a => a.RoleName).ToList(),
  422. AssessRoleNames = entity.AssessRoleNames,
  423. AssessRoleNos = entity.AssessRoleNos,
  424. AssessAuto = entity.AssessAuto
  425. };
  426. return dto;
  427. }
  428. /// <summary>
  429. /// 获取方案包角色
  430. /// </summary>
  431. /// <param name="no"></param>
  432. /// <param name="roleModels"></param>
  433. /// <returns></returns>
  434. [DisableAuditing, AllowAnonymous]
  435. public async Task<List<WeRoleDto>> GetPackageRoleLists(string no, List<RoleModel> roleModels = null)
  436. {
  437. return await CacheManager.GetCache(IwbCacheNames.PackageModelCache).Get($"PR{no}", async () =>
  438. {
  439. if (roleModels != null)
  440. {
  441. return roleModels.Select(a => new WeRoleDto(a.RoleNo, a.RoleName, a.RoleWeight, a.TotalWeight))
  442. .ToList();
  443. }
  444. var names = (await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == no))?.AllRoles;
  445. var list = new List<WeRoleDto>();
  446. if (!string.IsNullOrEmpty(names))
  447. {
  448. var arr = names.Split(',');
  449. foreach (var s in arr)
  450. {
  451. list.Add(WeRoleDto.DtoFrom(s));
  452. }
  453. }
  454. return list;
  455. });
  456. }
  457. #endregion ROLE
  458. #region 校验方案包
  459. /// <summary>
  460. /// 方案包验证
  461. /// </summary>
  462. /// <param name="no"></param>
  463. /// <returns></returns>
  464. public async Task<bool> PackageVerify(string no)
  465. {
  466. var entity = await Repository.GetAllIncluding(a => a.EvalModelInfo).FirstOrDefaultAsync(a => a.Id == no);
  467. if (entity == null)
  468. {
  469. CheckErrors($"没有查询到编号为{no}的方案包!");
  470. return false;
  471. }
  472. if (entity.AssessRoleNames.IsEmpty())
  473. {
  474. CheckErrors("没有检查到考核角色,请配置考核角色!");
  475. return false;
  476. }
  477. await CacheManager.GetCache(IwbCacheNames.PackageModelCache).RemoveAsync($"PM-{entity.Id}");
  478. var packageModel = await GetPackageModel(entity);
  479. if (packageModel.AssessRoles.IsEmpty())
  480. {
  481. CheckErrors("没有检查到考核角色,请配置考核角色!");
  482. return false;
  483. }
  484. if (packageModel.AssessRoleNos.IsEmpty())
  485. {
  486. CheckErrors("没有检查到考核角色,请配置考核角色!");
  487. return false;
  488. }
  489. var assessRoles = packageModel.AssessRoleNos.Split(',');
  490. decimal per = 0, minRolePer = 60;
  491. if (packageModel.RoleInfos?.Count > 0)
  492. {
  493. foreach (var roleNo in assessRoles)
  494. {
  495. var role = packageModel.RoleInfos?.FirstOrDefault(a => a.RoleNo == roleNo);
  496. per += role?.RolePer ?? 0;
  497. }
  498. if (per < minRolePer)
  499. {
  500. CheckErrors($"设置的考核角色占比小于{minRolePer}%,请重新配置!");
  501. return false;
  502. }
  503. }
  504. foreach (var child in packageModel.Children)
  505. {
  506. if (!CheckRound(child))
  507. {
  508. return false;
  509. }
  510. }
  511. return true;
  512. }
  513. private bool CheckRound(RoundModel round)
  514. {
  515. if (round.Children != null && round.Children.Count > 0)
  516. {
  517. foreach (var child in round.Children)
  518. {
  519. if (!CheckBlock(child))
  520. {
  521. return false;
  522. }
  523. }
  524. }
  525. else
  526. {
  527. CheckErrors($"轮次{round.RoundIndex}没有配置情景块,请检查后再试!");
  528. }
  529. return true;
  530. }
  531. private bool CheckBlock(BlockModel block)
  532. {
  533. if (block.Children != null && block.Children.Count > 0)
  534. {
  535. foreach (var child in block.Children)
  536. {
  537. if (!CheckFlow(child))
  538. {
  539. return false;
  540. }
  541. }
  542. }
  543. else
  544. {
  545. CheckErrors($"情景块[{block.Path}]没有配置情景流,请检查后再试!");
  546. }
  547. return true;
  548. }
  549. private bool CheckFlow(SceneFlowModel flow)
  550. {
  551. if (flow.Children != null && flow.Children.Count > 0)
  552. {
  553. foreach (var child in flow.Children)
  554. {
  555. if (!CheckFlowNode(child))
  556. {
  557. return false;
  558. }
  559. }
  560. }
  561. else
  562. {
  563. CheckErrors($"情景流{flow.Path}没有配置节点,请检查后再试!");
  564. }
  565. return true;
  566. }
  567. private bool CheckFlowNode(FlowModel flow)
  568. {
  569. if (flow.SceneInfos?.Count <= 0)
  570. {
  571. CheckErrors($"情景节点{flow.Path}没有配置情景,请检查后再试!");
  572. return false;
  573. }
  574. if (flow.Children != null && flow.Children.Count > 0)
  575. {
  576. foreach (var child in flow.Children)
  577. {
  578. if (!CheckFlowNode(child))
  579. {
  580. return false;
  581. }
  582. }
  583. }
  584. return true;
  585. }
  586. #endregion 校验方案包
  587. #region Package
  588. /// <summary>
  589. /// 保存方案包xml信息
  590. /// </summary>
  591. /// <param name="entity"></param>
  592. /// <returns></returns>
  593. private async Task<PackageXmlDto> PackageFillXml(PackageInfo entity)
  594. {
  595. var package = await GetPackageModel(entity);
  596. package.AssessAuto = entity.AssessAuto;
  597. package.AssessRoles = entity.AssessRoleNames;
  598. package.AssessRoleNos = entity.AssessRoleNos;
  599. package.VariableStr = entity.Variable;
  600. package.RoundScore = 0;
  601. package.AutoNextRound = false;
  602. var xmlDto = package.Package2Xml();
  603. xmlDto.PackageNo = entity.Id;
  604. return new PackageXmlDto(xmlDto);
  605. }
  606. /// <summary>
  607. /// 组建 方案包模型
  608. /// </summary>
  609. /// <param name="entity"></param>
  610. /// <returns></returns>
  611. private async Task<PackageModel> GetPackageModel(PackageInfo entity)
  612. {
  613. PackageModel model = await CacheManager.GetCache(IwbCacheNames.PackageModelCache).GetAsync($"PM-{entity.Id}",
  614. async () =>
  615. {
  616. var package = entity.ContentInfo.Str2Obj<PackageModel>();
  617. if (package != null)
  618. {
  619. package.No = package.No.IsEmpty() ? "P" : package.No;
  620. var components = entity.ComponentInfo?.Str2Obj<List<EngineComponent>>();
  621. package.Id = entity.Id;
  622. package.AssessRoles = entity.AssessRoleNames;
  623. package.AssessRoleNos = entity.AssessRoleNos;
  624. package.Name = entity.PackageName;
  625. package.VariableStr = entity.Variable;
  626. package.EvalQualitativeExpression = entity.EvalModelInfo?.QualitativeExpression;
  627. package.Components = components ?? new List<EngineComponent>();
  628. package = await PackageFrom(package);
  629. }
  630. return package;
  631. });
  632. return model;
  633. }
  634. /// <summary>
  635. /// 构建方案包
  636. /// </summary>
  637. /// <param name="model"></param>
  638. /// <returns></returns>
  639. private async Task<PackageModel> PackageFrom(PackageModel model)
  640. {
  641. foreach (var round in model.Children)
  642. {
  643. round.GuideInfos = await QueryGuidesModel(round.Id);
  644. foreach (var block in round.Children)
  645. {
  646. block.GuideInfos = await QueryGuidesModel(block.Id);
  647. block.Children = new List<SceneFlowModel>();
  648. var flowNoArr = block.FlowNos.IsEmpty() ? null : block.FlowNos.Split(',');
  649. if (flowNoArr != null && flowNoArr.Length > 0)
  650. {
  651. foreach (var no in flowNoArr)
  652. {
  653. var flowEntity = await FlowRepository.GetAllIncluding(a => a.SceneCategoryInfo).Where(a => a.Id == no).FirstOrDefaultAsync();
  654. if (flowEntity == null)
  655. {
  656. continue;
  657. }
  658. var flowComponents = flowEntity.ComponentInfo?.Str2Obj<List<EngineComponent>>() ?? new List<EngineComponent>();
  659. foreach (var component in flowComponents)
  660. {
  661. if (model.Components.All(a => a.No != component.No))
  662. {
  663. component.Id = component.No;
  664. model.Components.Add(component);
  665. }
  666. }
  667. var sceneFlow = new SceneFlowModel()
  668. {
  669. Id = flowEntity.Id,
  670. No = flowEntity.Id,
  671. Name = flowEntity.FlowName,
  672. SceneCategory = flowEntity.SceneCategory,
  673. SceneCategoryName = flowEntity.SceneCategoryName,
  674. Path = $"{block.Path}_{flowEntity.Id}",
  675. ParentPath = $"{block.Path}",
  676. GuideInfos = await QueryGuidesModel(no),
  677. Children = new List<FlowModel>(),
  678. };
  679. var flowModel = flowEntity.ContentInfo.Str2Obj<FlowModel>();
  680. flowModel.Id = flowEntity.Id;
  681. flowModel.Name = flowEntity.FlowName;
  682. flowModel.Path = $"{sceneFlow.Path}_{flowModel.No}";
  683. flowModel.ParentPath = $"{sceneFlow.Path}";
  684. flowModel = await FlowFrom(flowModel, model.Components);
  685. flowModel.PreComponent = ConvertComponentStr(flowModel.PreComponent, model.Components);
  686. flowModel.RunningComponent = ConvertComponentStr(flowModel.RunningComponent, model.Components);
  687. flowModel.PostComponent = ConvertComponentStr(flowModel.PostComponent, model.Components);
  688. sceneFlow.Children.Add(flowModel);
  689. block.Children.Add(sceneFlow);
  690. }
  691. }
  692. }
  693. }
  694. return model;
  695. }
  696. /// <summary>
  697. /// 构建情景流
  698. /// </summary>
  699. /// <param name="model"></param>
  700. /// <param name="components"></param>
  701. /// <returns></returns>
  702. private async Task<FlowModel> FlowFrom(FlowModel model, List<EngineComponent> components)
  703. {
  704. model.SceneInfos = new List<SceneModel>();
  705. int i = 0;
  706. if (model.SceneNos.IsNotEmpty())
  707. {
  708. var sceneNoArr = model.SceneNos.Split(',');
  709. foreach (var sceneNo in sceneNoArr)
  710. {
  711. i++;
  712. var scene = await SceneRepository.GetAllIncluding(a => a.SceneCategoryInfo).Where(a => a.Id == sceneNo).FirstOrDefaultAsync();
  713. if (scene == null)
  714. {
  715. continue;
  716. }
  717. var sceneModal = await SceneFrom(new SceneModel()
  718. {
  719. Id = scene.Id,
  720. No = $"S{i}",
  721. Path = $"{model.Path}_S{i}",
  722. ParentPath = $"{model.Path}",
  723. Name = scene.Name,
  724. SceneCategory = scene.SceneCategory,
  725. SceneCategoryName = scene.SceneCategoryInfo.CategoryName,
  726. SceneType = scene.SceneType,
  727. SceneTag = scene.SceneTag,
  728. _description = scene.Description,
  729. VariableStr = scene.Variable.IsEmpty() ? "" : $"{scene.Variable}",
  730. GuideInfos = await QueryGuidesModel(sceneNo),
  731. EnvironResources = await QueryEnvironResourcesModel(sceneNo, DataLibType.SceneInfo.ToInt()),
  732. Children = new List<BehaviorModel>()
  733. });
  734. model.SceneInfos.Add(sceneModal);
  735. }
  736. }
  737. i = 1;
  738. foreach (var child in model.Children)
  739. {
  740. i++;
  741. child.No = child.No.IsEmpty() ? child.Id : child.No;
  742. child.ParentPath = model.Path;
  743. child.Path = $"{model.Path}_{child.No}";
  744. child.PreComponent = ConvertComponentStr(child.PreComponent, components);
  745. child.RunningComponent = ConvertComponentStr(child.RunningComponent, components);
  746. child.PostComponent = ConvertComponentStr(child.PostComponent, components);
  747. await FlowFrom(child, components);
  748. }
  749. return model;
  750. }
  751. private string ConvertComponentStr(string compStr, List<EngineComponent> components)
  752. {
  753. if (compStr.EndsWith("|") && components.Any(a => compStr.StartsWith(a.No)))
  754. {
  755. compStr += "已配置事务";
  756. }
  757. return compStr;
  758. }
  759. /// <summary>
  760. /// 构建情景
  761. /// </summary>
  762. /// <param name="model"></param>
  763. /// <returns></returns>
  764. private async Task<SceneModel> SceneFrom(SceneModel model)
  765. {
  766. var behaviors = await SbRepository.GetAllIncluding(a => a.BehaviorInfo, a => a.BehaviorInfo.SceneCategoryInfo).Where(a => a.SceneNo == model.Id).Select(a =>
  767. new BehaviorModel()
  768. {
  769. Id = a.BehaviorNo,
  770. Name = a.BehaviorInfo.BehaviorName,
  771. SceneCategory = a.BehaviorInfo.SceneCategory,
  772. SceneCategoryName = a.BehaviorInfo.SceneCategoryInfo.CategoryName,
  773. BehaviorTag = a.BehaviorInfo.BehaviorTag,
  774. Description = a.BehaviorInfo.Description,
  775. RuleKeyword = a.BehaviorInfo.RuleKeyword,
  776. RoleLogicType = a.BehaviorInfo.RoleLogicType,
  777. Weights = a.BehaviorWeight,
  778. BehaviorScoreType = a.BehaviorEvalType,
  779. }).ToListAsync();
  780. int i = 0;
  781. foreach (var behavior in behaviors)
  782. {
  783. i++;
  784. behavior.No = $"B{i}";
  785. behavior.Path = $"{model.Path}_{behavior.No}";
  786. behavior.ParentPath = $"{model.Path}";
  787. var roles = BrrRepository.GetAllIncluding(a => a.RoleInfo).Where(s => s.BehaviorNo == behavior.Id).ToList();
  788. behavior.BehaviorRoles = roles.Select(d => new RoleModel(d.RoleInfo.Id, d.RoleInfo.RoleName)).ToList();
  789. behavior.KnowledgeNos = string.Join(",", BkRepository.GetAll().Where(a => a.BehaviorNo == behavior.Id).Select(a => a.KnowledgeNo));
  790. behavior.GuideInfos = await QueryGuidesModel(behavior.Id);
  791. behavior.EnvironResources =
  792. await QueryEnvironResourcesModel(behavior.Id, DataLibType.BehaviorInfo.ToInt());
  793. }
  794. model.Children.AddRange(behaviors);
  795. return model;
  796. }
  797. ///// <summary>
  798. ///// 固化方案包
  799. ///// </summary>
  800. ///// <param name="input"></param>
  801. ///// <returns></returns>
  802. //[AbpAuthorize(PermissionNames.PagesWePlayerMgPackageMgSolidify), AuditLog("强制固化方案包")]
  803. //public async Task EnforceSolidify(SolidifyDto input)
  804. //{
  805. // var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id);
  806. // if (entity == null)
  807. // {
  808. // CheckErrors($"没有查询到编号为{input.Id}的方案包!");
  809. // return;
  810. // }
  811. // if (entity.PackageState == PackageStateDefinition.Solidified)
  812. // {
  813. // CheckErrors($"情景流已固化确认,请勿重复操作!");
  814. // return;
  815. // }
  816. // entity.PackageName = input.NewName.IsEmpty() ? entity.PackageName : input.NewName;
  817. // entity.PackageState = PackageStateDefinition.Solidified;
  818. // var xmlDto = await PackageFillXml(entity);
  819. // var xmlEntity = await XmlRepository.FirstOrDefaultAsync(a => a.PackageNo == input.Id);
  820. // if (xmlEntity == null)
  821. // {
  822. // xmlEntity = ObjectMapper.Map<PackageXmlInfo>(xmlDto);
  823. // await XmlRepository.InsertAsync(xmlEntity);
  824. // }
  825. // else
  826. // {
  827. // ObjectMapper.Map(xmlEntity, xmlDto);
  828. // await XmlRepository.UpdateAsync(xmlEntity);
  829. // }
  830. // await Repository.UpdateAsync(entity);
  831. //}
  832. /// <summary>
  833. /// 获取固化方案包详情
  834. /// </summary>
  835. /// <param name="no"></param>
  836. /// <returns></returns>
  837. public async Task<PackageDetailDto> GetSolidifiedPackageDetail(string no)
  838. {
  839. var detail = await CacheManager.GetCache(IwbCacheNames.PackageCache + "_S").GetAsync($"PD-{no}", async () =>
  840. {
  841. var xmlEntity = await XmlRepository.GetAllIncluding(a => a.PackageInfo)
  842. .FirstOrDefaultAsync(a => a.PackageNo == no);
  843. if (xmlEntity == null)
  844. {
  845. CheckErrors($"未查询到编号为【{no}】的方案包详情,请确认方案包已固化!");
  846. return null;
  847. }
  848. var weXmlDto = new WePackageXmlDto()
  849. {
  850. PackageXml = xmlEntity.PackageXml,
  851. FlowXml = xmlEntity.FlowXml,
  852. SceneXml = xmlEntity.SceneXml,
  853. BehaviorXml = xmlEntity.BehaviorXml,
  854. GuideXml = xmlEntity.GuideXml,
  855. EnvironResourceXml = xmlEntity.EnvironResourceXml,
  856. ComponentXml = xmlEntity.ComponentXml,
  857. AllRoles = xmlEntity.AllRoles
  858. };
  859. var packageModel = new PackageModel().BuildPackageModelByXml(weXmlDto);
  860. var dto = new PackageDetailDto
  861. {
  862. PackageNo = no,
  863. Detail = ObjectMapper.Map<PackageDto>(xmlEntity.PackageInfo),
  864. Flows = packageModel.AllFlowModels,
  865. Scenes = packageModel.AllSceneModels,
  866. Behaviors = packageModel.AllBehaviorModels,
  867. Guides = packageModel.AllGuideModels,
  868. Components = new EngineComponent().BuildByXml(xmlEntity.ComponentXml),
  869. EnvironResources = packageModel.AllEnvironResourceModels,
  870. AllRoles = await GetPackageRoleLists(no, packageModel.RoleInfos)
  871. };
  872. var roleNos = xmlEntity.PackageInfo.AssessRoleNames?.StrToArray() ?? new string[0];
  873. dto.AssessRoleNames = string.Join(",", dto.AllRoles.Where(a => roleNos.Any(s => s.StartsWith(a.RoleName + "("))).Select(d => d.RoleName).ToArray());
  874. return dto;
  875. });
  876. return detail;
  877. //var xmlEntity = await XmlRepository.GetAllIncluding(a => a.PackageInfo)
  878. // .FirstOrDefaultAsync(a => a.PackageNo == no);
  879. //if (xmlEntity == null)
  880. //{
  881. // CheckErrors($"未查询到编号为【{no}】的方案包详情,请确认方案包已固化!");
  882. // return null;
  883. //}
  884. //var weXmlDto = new WePackageXmlDto()
  885. //{
  886. // PackageXml = xmlEntity.PackageXml,
  887. // FlowXml = xmlEntity.FlowXml,
  888. // SceneXml = xmlEntity.SceneXml,
  889. // BehaviorXml = xmlEntity.BehaviorXml,
  890. // GuideXml = xmlEntity.GuideXml,
  891. // EnvironResourceXml = xmlEntity.EnvironResourceXml,
  892. // ComponentXml = xmlEntity.ComponentXml,
  893. // AllRoles = xmlEntity.AllRoles
  894. //};
  895. //var packageModel = new PackageModel().BuildPackageModelByXml(weXmlDto);
  896. //var dto = new PackageDetailDto
  897. //{
  898. // PackageNo = no,
  899. // Detail = ObjectMapper.Map<PackageDto>(xmlEntity.PackageInfo),
  900. // Flows = packageModel.AllFlowModels,
  901. // Scenes = packageModel.AllSceneModels,
  902. // Behaviors = packageModel.AllBehaviorModels,
  903. // Guides = packageModel.AllGuideModels,
  904. // Components = new EngineComponent().BuildByXml(xmlEntity.ComponentXml),
  905. // EnvironResources = packageModel.AllEnvironResourceModels,
  906. // AllRoles = await GetPackageRoleLists(no, packageModel.RoleInfos)
  907. //};
  908. //var roleNos = xmlEntity.PackageInfo.AssessRoleNames?.StrToArray() ?? new string[0];
  909. //dto.AssessRoleNames = string.Join(",", dto.AllRoles.Where(a => roleNos.Any(s => s.StartsWith(a.RoleName + "("))).Select(d => d.RoleName).ToArray());
  910. //return dto;
  911. }
  912. //private async Task<BehaviorRoleInfo> GetBehaviorRoleInfo(string roleNo)
  913. //{
  914. // return await CacheManager.GetCache(IwbCacheNames.BehaviorRoleCache).GetAsync(roleNo,
  915. // async () =>
  916. // {
  917. // var r = await BehaviorRoleRepository.FirstOrDefaultAsync(a =>
  918. // a.Id == roleNo);
  919. // return r;
  920. // });
  921. //}
  922. #endregion Package
  923. #region Guide
  924. /// <summary>
  925. /// 查询关联的引导信息
  926. /// </summary>
  927. /// <param name="relatedNo"></param>
  928. /// <returns></returns>
  929. private async Task<List<GuideModel>> QueryGuidesModel(string relatedNo)
  930. {
  931. var guides = await GrRepository.GetAllIncluding(a => a.GuideInfo).Where(s => s.RelatedNo == relatedNo).Select(a => a.GuideInfo).ToListAsync();
  932. return guides.Select(GuideModelFrom).ToList();
  933. }
  934. private GuideModel GuideModelFrom(GuideInfo entity)
  935. {
  936. if (entity == null)
  937. {
  938. return null;
  939. }
  940. return new GuideModel()
  941. {
  942. Id = entity.Id,
  943. Name = entity.Name,
  944. GuideType = entity.GuideType,
  945. Description = entity.Description
  946. };
  947. }
  948. #endregion Guide
  949. #region EnvironResource
  950. /// <summary>
  951. /// 查询关联的引导信息
  952. /// </summary>
  953. /// <param name="relatedNo"></param>
  954. /// <param name="type"></param>
  955. /// <returns></returns>
  956. private async Task<List<EnvironResourceModel>> QueryEnvironResourcesModel(string relatedNo, int type)
  957. {
  958. var entities = await ErrRepository.GetAllIncluding(a => a.EnvironResourceInfo)
  959. .Where(a => a.RelatedNo == relatedNo && a.RelatedType == type).Select(a => a.EnvironResourceInfo
  960. ).ToListAsync();
  961. return entities.Select(EnvironResourceModelFrom).ToList();
  962. }
  963. private EnvironResourceModel EnvironResourceModelFrom(EnvironResourceInfo entity)
  964. {
  965. if (entity == null)
  966. {
  967. return null;
  968. }
  969. return new EnvironResourceModel()
  970. {
  971. Id = entity.Id,
  972. ResourceName = entity.ResourceName,
  973. ResourcePath = entity.ResourcePath,
  974. ResourceType = entity.ResourceType,
  975. MessageCode = entity.MessageCode,
  976. Description = entity.Description,
  977. };
  978. }
  979. #endregion EnvironResource
  980. }
  981. }