DocumentVerThanService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using Glendale.Design.Dtos.DocumentVerThan;
  2. using Glendale.Design.Dtos.ModelTree;
  3. using Glendale.Design.Models;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using Volo.Abp;
  10. using Volo.Abp.Application.Dtos;
  11. using Volo.Abp.Application.Services;
  12. using Volo.Abp.Domain.Repositories;
  13. using Volo.Abp.Linq;
  14. using Glendale.Design.Core.Extensions;
  15. using Glendale.Design.Dtos.DocumentVer;
  16. namespace Glendale.Design.Services
  17. {
  18. public class DocumentVerThanService : CrudAppService<DocumentVerThan, DocumentVerThanDto, DocumentVerThanListDto, Guid, GetListDocumentVerThanInput, DocumentVerThanCreateUpdateDto, DocumentVerThanCreateUpdateDto>, IDocumentVerThanService
  19. {
  20. public IAsyncQueryableExecuter AsyncQueryableExecuter { get; set; }
  21. private readonly IModelTreeAppService _modelTreeAppService;
  22. private readonly IRepository<ModelProperty, int> _modelPropertyRepository;
  23. private readonly IRepository<DocumentVer,Guid> _documentVerRepository;
  24. public DocumentVerThanService(IRepository<DocumentVerThan, Guid> repository,IModelTreeAppService modelTreeAppService,
  25. IRepository<ModelProperty, int> modelPropertyRepository,IRepository<DocumentVer, Guid> documentVerRepository): base(repository)
  26. {
  27. _modelTreeAppService = modelTreeAppService;
  28. _modelPropertyRepository = modelPropertyRepository;
  29. _documentVerRepository = documentVerRepository;
  30. }
  31. /// <summary>
  32. /// 新增
  33. /// </summary>
  34. /// <param name="input"></param>
  35. /// <returns></returns>
  36. public override Task<DocumentVerThanDto> CreateAsync(DocumentVerThanCreateUpdateDto input)
  37. {
  38. //input.AddMetadata = null;
  39. //input.UpdateMetadata = null;
  40. //input.DeleteMetadata = null;
  41. return base.CreateAsync(input);
  42. }
  43. /// <summary>
  44. /// 获取对象
  45. /// </summary>
  46. /// <param name="sourceId"></param>
  47. /// <param name="destinationId"></param>
  48. /// <returns></returns>
  49. public async Task<DocumentVerThanDto> GetEntity(Guid sourceId, Guid destinationId)
  50. {
  51. var entity= Repository.Where(p => p.SourceDocVerId == sourceId && p.DestinationDocVerId == destinationId).FirstOrDefault();
  52. var dto=await MapToGetOutputDtoAsync(entity);
  53. if (dto == null)
  54. {
  55. return null;
  56. }
  57. dto.SourceDocVer = ObjectMapper.Map<DocumentVer, DocumentVerDto>(await _documentVerRepository.GetAsync(dto.SourceDocVerId));
  58. dto.DestinationDocVer = ObjectMapper.Map<DocumentVer, DocumentVerDto>(await _documentVerRepository.GetAsync(dto.DestinationDocVerId));
  59. dto.AddMetadatas = SerializeExtensions.FromJson<List<MetadataCreateDto>>(dto.AddMetadata);
  60. dto.UpdateMetadatas = SerializeExtensions.FromJson<List<MetadataCreateDto>>(dto.UpdateMetadata);
  61. dto.DeleteMetadatas = SerializeExtensions.FromJson<List<MetadataCreateDto>>(dto.DeleteMetadata);
  62. dto.AddMetadata = null;
  63. dto.UpdateMetadata = null;
  64. dto.DeleteMetadata = null;
  65. return dto;
  66. }
  67. /// <summary>
  68. /// 获取对象
  69. /// </summary>
  70. /// <param name="id"></param>
  71. /// <returns></returns>
  72. public override async Task<DocumentVerThanDto> GetAsync(Guid id)
  73. {
  74. var dto=await base.GetAsync(id);
  75. dto.SourceDocVer = ObjectMapper.Map<DocumentVer, DocumentVerDto>(await _documentVerRepository.GetAsync(dto.SourceDocVerId));
  76. dto.DestinationDocVer =ObjectMapper.Map<DocumentVer,DocumentVerDto>(await _documentVerRepository.GetAsync(dto.DestinationDocVerId));
  77. dto.AddMetadatas = SerializeExtensions.FromJson<List<MetadataCreateDto>>(dto.AddMetadata);
  78. dto.UpdateMetadatas = SerializeExtensions.FromJson<List<MetadataCreateDto>>(dto.UpdateMetadata);
  79. dto.DeleteMetadatas = SerializeExtensions.FromJson<List<MetadataCreateDto>>(dto.DeleteMetadata);
  80. dto.AddMetadata = null;
  81. dto.UpdateMetadata = null;
  82. dto.DeleteMetadata = null;
  83. return dto;
  84. }
  85. [RemoteService(false)]
  86. public override Task<DocumentVerThanDto> UpdateAsync(Guid id, DocumentVerThanCreateUpdateDto input)
  87. {
  88. return base.UpdateAsync(id, input);
  89. }
  90. [RemoteService(false)]
  91. public override Task DeleteAsync(Guid id)
  92. {
  93. return base.DeleteAsync(id);
  94. }
  95. /// <summary>
  96. /// 分页查询
  97. /// </summary>
  98. /// <param name="input"></param>
  99. /// <returns></returns>
  100. public override Task<PagedResultDto<DocumentVerThanListDto>> GetListAsync(GetListDocumentVerThanInput input)
  101. {
  102. return base.GetListAsync(input);
  103. }
  104. /// <summary>
  105. /// 开始比对
  106. /// </summary>
  107. /// <param name="id">比对表主键Id</param>
  108. /// <param name="glid">旧版图层glid</param>
  109. /// <param name="newglid">新版图层glid</param>
  110. /// <returns></returns>
  111. public async Task<MetadataListDto> StartThan(Guid id, string glid,string newglid)
  112. {
  113. var guid = String.Format("{0}#{1}", glid, newglid);
  114. var result = new MetadataListDto();
  115. var entity = await base.GetAsync(id);
  116. var addList = SerializeExtensions.FromJson<List<MetadataCreateDto>>(entity.AddMetadata);
  117. var updateList = SerializeExtensions.FromJson<List<MetadataCreateDto>>(entity.UpdateMetadata);
  118. var deleteList = SerializeExtensions.FromJson<List<MetadataCreateDto>>(entity.DeleteMetadata);
  119. addList = addList != null ? addList : new List<MetadataCreateDto>();
  120. updateList = updateList != null ? updateList : new List<MetadataCreateDto>();
  121. deleteList = deleteList != null ? deleteList : new List<MetadataCreateDto>();
  122. entity.SourceDocVer = ObjectMapper.Map<DocumentVer, DocumentVerDto>(await _documentVerRepository.GetAsync(entity.SourceDocVerId));
  123. entity.DestinationDocVer = ObjectMapper.Map<DocumentVer, DocumentVerDto>(await _documentVerRepository.GetAsync(entity.DestinationDocVerId));
  124. //源模型构件
  125. var arraySource = await _modelTreeAppService.GetTreeChildId(entity.SourceDocVer.ModelName, glid);
  126. //目标模型构件
  127. var arrayDestination = await _modelTreeAppService.GetTreeChildId(entity.DestinationDocVer.ModelName, newglid);
  128. #region 若已经保存,则返回保存的;若未保存,则返回比对结果
  129. var addCurrent = addList.FirstOrDefault(p => p.Guid == guid);
  130. if (addCurrent != null)
  131. {
  132. result.AddMetadata = addCurrent;
  133. }
  134. else
  135. {
  136. //新增的构件
  137. result.AddMetadata = new MetadataCreateDto()
  138. {
  139. Guid = guid,
  140. ExternalIdList = arrayDestination.Except(arraySource).ToArray(),//Des有,Source没有(新增)
  141. };
  142. }
  143. var updateCurrent=updateList.FirstOrDefault(p => p.Guid == guid);
  144. if (updateCurrent != null)
  145. {
  146. result.UpdateMetadata = updateCurrent;
  147. }
  148. else
  149. {
  150. //修改的构件
  151. var someIds = arrayDestination.Intersect(arraySource).ToArray();//两者都有
  152. result.UpdateMetadata = new MetadataCreateDto()
  153. {
  154. Guid = guid,
  155. ExternalIdList = await GetExternalIdList(someIds, entity.SourceDocVer.ModelName, entity.DestinationDocVer.ModelName)
  156. };
  157. }
  158. var deleteCurrent=deleteList.FirstOrDefault(p => p.Guid == guid);
  159. if (deleteCurrent != null)
  160. {
  161. result.DeleteMetadata = deleteCurrent;
  162. }
  163. else
  164. {
  165. //删除的构件
  166. result.DeleteMetadata = new MetadataCreateDto()
  167. {
  168. Guid = guid,
  169. ExternalIdList = arraySource.Except(arrayDestination).ToArray(),//Source有,Des没有(删除)
  170. };
  171. }
  172. #endregion
  173. #region 分别返回选中楼层的构件集合
  174. result.SourceMetadata = new MetadataCreateDto()
  175. {
  176. Guid = glid,
  177. ExternalIdList = arraySource.ToArray(),
  178. };
  179. result.DestinationMetadata = new MetadataCreateDto()
  180. {
  181. Guid = newglid,
  182. ExternalIdList = arrayDestination.ToArray(),
  183. };
  184. #endregion
  185. return result;
  186. }
  187. /// <summary>
  188. /// 计算update构件Id
  189. /// </summary>
  190. /// <param name="someIds">两个版本都存在的构件Id</param>
  191. /// <param name="modelNameSource"></param>
  192. /// <param name="modelNameDestination"></param>
  193. /// <returns></returns>
  194. private async Task<string[]> GetExternalIdList(string[] someIds, string modelNameSource, string modelNameDestination)
  195. {
  196. List<string> result = new List<string>();
  197. var ProListSource =await _modelPropertyRepository.GetListAsync(p => p.ModelName == modelNameSource && someIds.Contains(p.ExternalId));
  198. var ProListDestination = await _modelPropertyRepository.GetListAsync(p => p.ModelName == modelNameDestination && someIds.Contains(p.ExternalId));
  199. for (int i = 0; i < someIds.Length; i++)
  200. {
  201. var propertySource = ProListSource.Where(p => p.ExternalId == someIds[i]).Select(p => p.Value).ToArray();
  202. var propertyDestination = ProListDestination.Where(p => p.ExternalId == someIds[i]).Select(p => p.Value).ToArray();
  203. //比较属性的数量是否不同
  204. if (propertySource.Length != propertyDestination.Length)
  205. {
  206. result.Add(someIds[i]);
  207. continue;
  208. }
  209. //如果属性数量一致,比较属性值是否相同
  210. if(!Enumerable.SequenceEqual(propertySource, propertyDestination))
  211. {
  212. result.Add(someIds[i]);
  213. }
  214. }
  215. return result.ToArray();
  216. }
  217. /// <summary>
  218. /// 保存构件变更
  219. /// </summary>
  220. /// <param name="id">比对表主键Id</param>
  221. /// <param name="method">1=新增 2=修改 3=删除</param>
  222. /// <param name="metadata">构件列表(Guid=旧版plid#新版plid))</param>
  223. /// <returns></returns>
  224. public async Task<bool> MetadataSave(Guid id, int method, MetadataCreateDto metadata)
  225. {
  226. var entity = await Repository.GetAsync(id);
  227. var addList= SerializeExtensions.FromJson<List<MetadataCreateDto>>(entity.AddMetadata);
  228. var updateList= SerializeExtensions.FromJson<List<MetadataCreateDto>>(entity.UpdateMetadata);
  229. var deleteList= SerializeExtensions.FromJson<List<MetadataCreateDto>>(entity.DeleteMetadata);
  230. addList = addList != null? addList : new List<MetadataCreateDto>();
  231. updateList = updateList != null? updateList : new List<MetadataCreateDto>();
  232. deleteList = deleteList != null? deleteList : new List<MetadataCreateDto>();
  233. if (method == 1)
  234. {
  235. if (addList.Any())
  236. {
  237. var current = addList.FirstOrDefault(p => p.Guid == metadata.Guid);
  238. if (current != null)
  239. {
  240. addList.Remove(current); //移除旧的
  241. }
  242. }
  243. addList.Add(metadata);//添加新的
  244. }
  245. else if (method == 2)
  246. {
  247. if (updateList.Any())
  248. {
  249. var current = updateList.FirstOrDefault(p => p.Guid == metadata.Guid);
  250. if (current != null)
  251. {
  252. updateList.Remove(current); //移除旧的
  253. }
  254. }
  255. updateList.Add(metadata);//添加新的
  256. }
  257. else if (method == 3)
  258. {
  259. if (deleteList.Any())
  260. {
  261. var current = deleteList.FirstOrDefault(p => p.Guid == metadata.Guid);
  262. if (current != null)
  263. {
  264. deleteList.Remove(current); //移除旧的
  265. }
  266. }
  267. deleteList.Add(metadata);//添加新的
  268. }
  269. else
  270. {
  271. throw new UserFriendlyException("参数method不是有效的值");
  272. }
  273. entity.AddMetadata = SerializeExtensions.ToJson(addList);
  274. entity.UpdateMetadata = SerializeExtensions.ToJson(updateList);
  275. entity.DeleteMetadata = SerializeExtensions.ToJson(deleteList);
  276. await Repository.UpdateAsync(entity);
  277. return true;
  278. }
  279. }
  280. }