using CZFW.Core; using CZFW.Framework.Model.ViewModel; using CZFW.Framework.Tools; using CZFW.MDB.Interface; using CZFW.MDB.Util; using MongoDB.Bson; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CZFW.MDB.Logic { public class CategoryRepository : ICMSCategory { IMongoRepository _repository; ISchemaRepository _schema; IPage _pageRepository; public CategoryRepository(IMongoRepository mongoRepository, ISchemaRepository schema, IPage page) { _repository = mongoRepository; _schema = schema; _pageRepository = page; } public BsonArray GetTplCategorySrc(string tplName) { var qry = $"{{name:\"{tplName}_{Constants.CATEGORY_TABLE_NAME}\"}}"; var proj = $"{{{Constants.DATA_SOURCE_FILED}:1}}"; var categories = _schema.GetOne(tplName, qry, proj); if (categories is null) return null; return categories[Constants.DATA_SOURCE_FILED].AsBsonArray; } //将同步模板中定义的分类基础信息到网站。如果网站中已经用到了某分类,但是在模板中被删除了。将会被移除。 请注意检查数据中是否有引用已经被删除了的分类。 public ResultModel SyncTplCategorySource(string tplName, string sid) { try { var categories = GetTplCategorySrc(tplName); var pageName = $"{tplName}_{Constants.CATEGORY_TABLE_NAME}"; _repository.SetCurrentTable(pageName); var existings = _pageRepository.GetListByName(sid, pageName, pageSize:10000); foreach (var item1 in categories) { var item = item1.AsBsonDocument; var exist1 = existings.SingleOrDefault(x => x["cate_name"].AsString == item["cate_name"].AsString && x["lang"].AsString == item["lang"].AsString); if (exist1 is null) { item[Constants.SITE_NAME_FIELD] = sid; var tp = _repository.InsertBson(item.AsBsonDocument); } else { var exist = exist1.AsBsonDocument; if (!exist.Contains(Constants.SITE_NAME_FIELD)) exist.Add(Constants.SITE_NAME_FIELD, sid); if (exist.AsBsonDocument.Contains(Constants.CATEGORY_CHILDREN_FIELD)) { if (item.AsBsonDocument.Contains(Constants.CATEGORY_CHILDREN_FIELD)) item[Constants.CATEGORY_CHILDREN_FIELD] = exist[Constants.CATEGORY_CHILDREN_FIELD]; else item.Add(Constants.CATEGORY_CHILDREN_FIELD, exist[Constants.CATEGORY_CHILDREN_FIELD]); } item[Constants.SITE_NAME_FIELD] = sid; _repository.ReplaceBson(exist["_id"].AsObjectId, item.AsBsonDocument); } } var ids = categories.Select(x => x[Constants.CATEGORY_ID_FIELD].AsString).ToList(); var toRemove = existings.Where(x => !ids.Contains(x[Constants.CATEGORY_ID_FIELD].AsString)).Select(x => x[Constants.THE_ID_FILED].AsObjectId).ToList(); foreach (var item in toRemove) { _repository.RemoveByObjectId(item); } return new ResultModel(); } catch(Exception err) { return new ResultModel(false, err.Message, err); } } public static BsonDocument GetCategory(string siteName, string cateName, string tplName, string lang=null) { if (string.IsNullOrWhiteSpace(lang)) { lang = SysConfig.DefaultLanguage(); } if (!CacheHelper.TryRead(Constants.CATEGORY_CACHE_PREFIX + cateName+lang, out BsonDocument data)) { IMongoRepository mongoRepository = new MongoRepository($"{tplName}_{Constants.CATEGORY_TABLE_NAME}"); data = mongoRepository.GetOne($"{{{Constants.CATEGORY_ID_FIELD}:'{cateName}', '{Constants.LANG_FIELD}':'{lang}'}}"); CacheHelper.WriteCache(siteName, $"{Constants.CATEGORY_CACHE_PREFIX}{cateName}", data, TimeSpan.FromMinutes(ConfigHelper.GetValue("SiteCacheExpireMinutes"))); } return data; } } }