using Hotline.Caching.Interfaces; using Hotline.SeedData; using Hotline.Settings; using Hotline.Share.Dtos.Settings; using Hotline.Share.Tools; using Mapster; using XF.Domain.Cache; using XF.Domain.Dependency; using XF.Domain.Repository; namespace Hotline.Caching.Services { public class SysDicDataCacheManager : ISystemDicDataCacheManager, IScopeDependency { private readonly IRepository _sysDicDataRepository; private readonly IRepository _systemDicTypeRepository; private readonly ITypedCache> _cacheSysDicData; public SysDicDataCacheManager(IRepository sysDicDataRepository, ITypedCache> cacheSysDicData, IRepository systemDicTypeRepository) { _sysDicDataRepository = sysDicDataRepository; _cacheSysDicData = cacheSysDicData; _systemDicTypeRepository = systemDicTypeRepository; } public IReadOnlyList GetSysDicDataCache(string code) { var sysDicDataList = _cacheSysDicData.GetOrSet(code, k => { return _sysDicDataRepository.Queryable().Where(x => x.DicTypeCode == code && x.IsShow == true).OrderBy(x => x.Sort).ToTreeAsync(x => x.Children, it => it.ParentId, "").GetAwaiter().GetResult(); }); return sysDicDataList; } public IReadOnlyList GetOrAdd(string code) { return GetOrAddDic(code).Adapt>(); } public IReadOnlyList GetOrAddDic(string code) { var items = GetSysDicDataCache(code); if (items.NotNullOrEmpty()) return items; var any = _sysDicDataRepository.Queryable().Where(m => m.DicTypeCode == code).Any(); if (any) return []; var sysDicType = _systemDicTypeRepository.Get(x => x.DicTypeCode == code); var seedData = new SystemDicDataSeedData(); if (sysDicType == null) { sysDicType = seedData.GetType(code); sysDicType.Id = _systemDicTypeRepository.AddAsync(sysDicType).GetAwaiter().GetResult(); } var sysDicDatas = seedData.GetData(code); AssignChilderDicType(sysDicDatas.ToList(), code, sysDicType.Id); RemoveSysDicDataCache(code); return GetSysDicDataCache(code); } private void AssignChilderDicType(IList sysDicDatas, string code, string dicTypeId, string parentId = "") { foreach (var item in sysDicDatas) { item.DicTypeCode = code; item.DicTypeId = dicTypeId; item.ParentId = parentId; item.IsShow = true; _sysDicDataRepository.AddAsync(item).GetAwaiter().GetResult(); if (item.Children.NotNullOrEmpty()) AssignChilderDicType(item.Children, code, dicTypeId, item.Id); } } public IReadOnlyList GetVisitSatisfaction() => GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction); public IReadOnlyList AcceptType => GetSysDicDataCache(SysDicTypeConsts.AcceptType); public IReadOnlyList LeaderSMS => GetSysDicDataCache(SysDicTypeConsts.LeaderSMS); public IReadOnlyList CallForwardingSource => GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource); /// /// 工作场所 /// public IReadOnlyList Workplace => GetOrAdd(SysDicTypeConsts.Workplace); /// /// 作业区域 /// public IReadOnlyList WorkplaceName => GetOrAdd(SysDicTypeConsts.WorkplaceName); /// /// 作业类型 /// public IReadOnlyList JobType => GetOrAdd(SysDicTypeConsts.JobType); /// /// 经营单位类别 /// public IReadOnlyList BusinessUnitType => GetOrAdd(SysDicTypeConsts.BusinessUnitType); public IReadOnlyList BulletinType => GetSysDicDataCache(SysDicTypeConsts.AcceptType); /// /// 随手拍公告类型 /// public IReadOnlyList SnapshotBulletinType => GetOrAdd(SysDicTypeConsts.SnapshotBulletinType); public SystemDicDataOutDto GetSnapshotBulletinType(string dicDataValue) => this.SnapshotBulletinType.FirstOrDefault(x => x.DicDataValue == dicDataValue) ?? new SystemDicDataOutDto(); /// /// 作业区域 /// public IReadOnlyList WorkArea => GetOrAdd(SysDicTypeConsts.WorkArea); public IReadOnlyList VisitMananer => GetSysDicDataCache(SysDicTypeConsts.VisitManner); public IReadOnlyList SourceChannel => GetSysDicDataCache(SysDicTypeConsts.SourceChannel); /// /// 随手拍公告来源 /// public IReadOnlyCollection SnapshotBulletinSource => GetOrAdd(SysDicTypeConsts.SnapshotBulletinSource); /// /// 红包补充发放类型 /// public IReadOnlyCollection SnapshotReplenishType => GetOrAdd(SysDicTypeConsts.SnapshotReplenishType); /// /// 随手拍工单标签 /// public IReadOnlyCollection SnapshotOrderLabel => GetOrAdd(SysDicTypeConsts.SnapshotOrderLabel); /// /// 工单标签 /// public IReadOnlyCollection OrderTag => GetOrAdd(SysDicTypeConsts.OrderTag); /// /// 回访满意度 /// public IReadOnlyCollection VisitSatisfaction => GetOrAdd(SysDicTypeConsts.VisitSatisfaction); /// /// 随手拍特殊红包审核类型 /// public IReadOnlyCollection SnapshotRedPackSpecialType => GetOrAdd(SysDicTypeConsts.SnapshotRedPackSpecialType); /// /// 额外扣除积分类型 /// public IReadOnlyCollection ExtraDeductionPointsType => GetOrAdd(SysDicTypeConsts.ExtraDeductionPointsType); /// /// 兴唐动作状态映射 /// public IReadOnlyCollection XingTangOperationMap => GetOrAdd(SysDicTypeConsts.XingTangOperationMap); public IReadOnlyList InstaShotSpecialReason => GetOrAddDic(SysDicTypeConsts.InstaShotSpecialReason); /// /// 随手拍安全员类型 /// public IReadOnlyList SafetyType => GetOrAddDic(SysDicTypeConsts.SafetyType); public void RemoveSysDicDataCache(string code) { _cacheSysDicData.Remove(code); } /// /// 获取用户头像图片 /// /// /// /// public string HeaderImages(string value) { var dto = GetOrAdd(SysDicTypeConsts.HeaderImages).Where(m => m.DicDataValue == value).FirstOrDefault() ?? new SystemDicDataOutDto(); if (dto.DicDataName == "LocalHeadImageDefault") { return SystemDicDataSeedData.LocalHeadImageDefault; } if (dto.DicDataName == "LocalHeadImageAQWS") { return SystemDicDataSeedData.LocalHeadImageAQWS; } return dto.DicDataName; } } }