CategoryRepository.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using CZFW.Core;
  2. using CZFW.Framework.Model.ViewModel;
  3. using CZFW.Framework.Tools;
  4. using CZFW.MDB.Interface;
  5. using CZFW.MDB.Util;
  6. using MongoDB.Bson;
  7. using Newtonsoft.Json.Linq;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. namespace CZFW.MDB.Logic
  13. {
  14. public class CategoryRepository : ICMSCategory
  15. {
  16. IMongoRepository _repository;
  17. ISchemaRepository _schema;
  18. IPage _pageRepository;
  19. public CategoryRepository(IMongoRepository mongoRepository, ISchemaRepository schema, IPage page)
  20. {
  21. _repository = mongoRepository;
  22. _schema = schema;
  23. _pageRepository = page;
  24. }
  25. public BsonArray GetTplCategorySrc(string tplName)
  26. {
  27. var qry = $"{{name:\"{tplName}_{Constants.CATEGORY_TABLE_NAME}\"}}";
  28. var proj = $"{{{Constants.DATA_SOURCE_FILED}:1}}";
  29. var categories = _schema.GetOne(tplName, qry, proj);
  30. if (categories is null) return null;
  31. return categories[Constants.DATA_SOURCE_FILED].AsBsonArray;
  32. }
  33. //将同步模板中定义的分类基础信息到网站。如果网站中已经用到了某分类,但是在模板中被删除了。将会被移除。 请注意检查数据中是否有引用已经被删除了的分类。
  34. public ResultModel SyncTplCategorySource(string tplName, string sid)
  35. {
  36. try
  37. {
  38. var categories = GetTplCategorySrc(tplName);
  39. var pageName = $"{tplName}_{Constants.CATEGORY_TABLE_NAME}";
  40. _repository.SetCurrentTable(pageName);
  41. var existings = _pageRepository.GetListByName(sid, pageName, pageSize:10000);
  42. foreach (var item1 in categories)
  43. {
  44. var item = item1.AsBsonDocument;
  45. var exist1 = existings.SingleOrDefault(x => x["cate_name"].AsString == item["cate_name"].AsString && x["lang"].AsString == item["lang"].AsString);
  46. if (exist1 is null)
  47. {
  48. item[Constants.SITE_NAME_FIELD] = sid;
  49. var tp = _repository.InsertBson(item.AsBsonDocument);
  50. }
  51. else
  52. {
  53. var exist = exist1.AsBsonDocument;
  54. if (!exist.Contains(Constants.SITE_NAME_FIELD))
  55. exist.Add(Constants.SITE_NAME_FIELD, sid);
  56. if (exist.AsBsonDocument.Contains(Constants.CATEGORY_CHILDREN_FIELD))
  57. {
  58. if (item.AsBsonDocument.Contains(Constants.CATEGORY_CHILDREN_FIELD))
  59. item[Constants.CATEGORY_CHILDREN_FIELD] = exist[Constants.CATEGORY_CHILDREN_FIELD];
  60. else
  61. item.Add(Constants.CATEGORY_CHILDREN_FIELD, exist[Constants.CATEGORY_CHILDREN_FIELD]);
  62. }
  63. item[Constants.SITE_NAME_FIELD] = sid;
  64. _repository.ReplaceBson(exist["_id"].AsObjectId, item.AsBsonDocument);
  65. }
  66. }
  67. var ids = categories.Select(x => x[Constants.CATEGORY_ID_FIELD].AsString).ToList();
  68. var toRemove = existings.Where(x => !ids.Contains(x[Constants.CATEGORY_ID_FIELD].AsString)).Select(x => x[Constants.THE_ID_FILED].AsObjectId).ToList();
  69. foreach (var item in toRemove)
  70. {
  71. _repository.RemoveByObjectId(item);
  72. }
  73. return new ResultModel();
  74. }
  75. catch(Exception err)
  76. {
  77. return new ResultModel(false, err.Message, err);
  78. }
  79. }
  80. public static BsonDocument GetCategory(string siteName, string cateName, string tplName, string lang=null)
  81. {
  82. if (string.IsNullOrWhiteSpace(lang)) {
  83. lang = SysConfig.DefaultLanguage();
  84. }
  85. if (!CacheHelper.TryRead(Constants.CATEGORY_CACHE_PREFIX + cateName+lang, out BsonDocument data))
  86. {
  87. IMongoRepository mongoRepository = new MongoRepository($"{tplName}_{Constants.CATEGORY_TABLE_NAME}");
  88. data = mongoRepository.GetOne($"{{{Constants.CATEGORY_ID_FIELD}:'{cateName}', '{Constants.LANG_FIELD}':'{lang}'}}");
  89. CacheHelper.WriteCache(siteName, $"{Constants.CATEGORY_CACHE_PREFIX}{cateName}", data, TimeSpan.FromMinutes(ConfigHelper.GetValue<int>("SiteCacheExpireMinutes")));
  90. }
  91. return data;
  92. }
  93. }
  94. }