using System; using System.Collections.Generic; using System.Linq; using System.Text; using Furion.DependencyInjection; using Microsoft.Extensions.Localization; using Newtonsoft.Json.Linq; using RoadFlow.Data; using RoadFlow.Utility; namespace RoadFlow.Data { public class Dictionary : RoadFlowRepository, IDictionary, ITransient { /// /// 值字段 /// public enum ValueField { Id, Title, Code, Value, Other, Note } /// /// 得到所有下级ID /// /// /// 是包含自己 /// public List GetAllChildsId(string id, bool isMe = true) { List guids = new(); if (isMe) { guids.Add(id); } var allChilds = GetAllChilds(id); foreach (var child in allChilds) { guids.Add(child.Id); } return guids; } /// /// 根据ID得到所有下级 /// /// /// 是否包含自己 /// public List GetAllChilds(string id, bool isMe = false) { List dictionaries = new(); var dict =id.IsGuid()? this.GetOneById(id):this.GetOneBy(x=>x.Code==id); if (null == dict) { return dictionaries; } if (isMe) { dictionaries.Add(dict); } AddChilds(dict, dictionaries); return dictionaries; } /// /// 递归添加下级 /// /// /// private void AddChilds(RoadFlow.Model.rf_dictionary dictionary, List dictionaries) { var childs = GetChilds(dictionary.Id); if (childs.Count == 0) { return; } foreach (RoadFlow.Model.rf_dictionary child in childs) { dictionaries.Add(child); AddChilds(child, dictionaries); } } /// /// 根据ID得到下级 /// /// /// public List GetChilds(string id) { return this.GetAll().FindAll(p => p.ParentId == id.ToString()).OrderBy(p => p.Sort).ToList(); } /// /// 根据唯一代码得到ID /// /// /// public string GetIdByCode(string code) { var dict = this.GetOneBy(a => a.Code.EqualsIgnoreCase(code)); return null == dict ? string.Empty : dict.Id; } /// /// 得到字典根 /// /// public RoadFlow.Model.rf_dictionary GetRoot() { return this.GetAll().Find(p => p.ParentId == string.Empty); } /// /// 判断一个字典是否有下级字典 /// /// /// public bool HasChilds(string id) { return this.GetAll().Exists(p => p.ParentId == id.ToString()); } /// /// 得到多语言标题 /// /// 字典实体 /// 语言 /// public string GetLanguageTitle(RoadFlow.Model.rf_dictionary dictionary, string language = "") { string title = string.Empty; if (null == dictionary) { return title; } if (language.IsNullOrWhiteSpace()) { language = Tools.GetCurrentLanguage(); } switch (language) { case "en-US": title = dictionary.Title_en; break; case "zh": title = dictionary.Title_zh; break; default: title = dictionary.Title; break; } if (title.IsNullOrWhiteSpace()) { title = dictionary.Title; } return title; } /// /// 根据ID查询字典标题 /// /// /// 语言 /// public string GetTitle(string id, string language = "") { var dict = this.GetOneById(id); return null == dict ? "" : GetLanguageTitle(dict, language); } /// /// 按code获取字典项 /// /// /// public RoadFlow.Model.rf_dictionary GetOneByCode(string code) { return code.IsNullOrWhiteSpace() ? null : this.GetAll().Find(x => x.Code.EqualsIgnoreCase(code)); } /// /// 根据ID得到选项 /// /// /// 值字段,默认id /// 默认值 /// 是否显示所有下级 /// 是否包含流程分类(流程设计时选表单不能选择流程分类) /// public string GetOptionsByID(string id, ValueField valueField = ValueField.Id, string value = "", bool isAllChild = true, bool existsFlowType = true) { if (id.IsNullOrWhiteSpace()) { return ""; } var childs = isAllChild ? GetAllChilds(id) : GetChilds(id); StringBuilder options = new StringBuilder(childs.Count * 60); StringBuilder space = new StringBuilder(); var flowChilds = existsFlowType ? new List() : GetAllChilds("system_applibrarytype_flow", true);//取出流程分类的下级,为了如果不包含流程分类时要排除 foreach (var child in childs) { if (child.Status == 1)//标记为已删除的不作为选项 { continue; } if (!existsFlowType && flowChilds.Exists(p => p.Id == child.Id))//如果不包含流程分类要排除 { continue; } space.Clear(); int parentCount = GetParentCount(childs, child); for (int i = 0; i < parentCount; i++) { space.Append("  "); } if (parentCount > 0) { space.Append("├"); } string value1 = GetOptionValue(valueField, child); options.AppendFormat("", value1, value1.Equals(value) ? " selected=\"selected\"" : "", space.ToString(), GetLanguageTitle(child)); } return options.ToString(); } /// /// 得到一个字典项的上级节点数 /// /// /// /// private int GetParentCount(List dictList, Model.rf_dictionary dict) { int parent = 0; Model.rf_dictionary parentDict = dictList.Find(p => p.Id == dict.ParentId); while (parentDict != null) { parentDict = dictList.Find(p => p.Id == parentDict.ParentId); parent++; } return parent; } /// /// 得到选项值 /// /// /// /// private string GetOptionValue(ValueField valueField, Model.rf_dictionary dictionary) { string value = string.Empty; switch (valueField) { case ValueField.Id: value = dictionary.Id.ToString(); break; case ValueField.Code: value = dictionary.Code; break; case ValueField.Note: value = dictionary.Note; break; case ValueField.Other: value = dictionary.Other; break; case ValueField.Title: value = GetLanguageTitle(dictionary, Tools.GetCurrentLanguage()); break; case ValueField.Value: value = dictionary.Value; break; } return value ?? string.Empty; } /// /// 根据字符串得到ValueField /// /// /// public ValueField GetValueField(string valueField) { return valueField.IsNullOrEmpty() ? ValueField.Id : valueField switch { "code" => ValueField.Code, "value" => ValueField.Value, "title" => ValueField.Title, "note" => ValueField.Note, "other" => ValueField.Other, _ => ValueField.Id, }; } /// /// 根据ID得到选项(返回jarray,vue项目用) /// /// /// 值字段,默认id /// 默认值 /// 是否显示所有下级 /// 是否可以选择上级 /// public JArray GetArrayOptionsByID(string id, ValueField valueField = ValueField.Id, string value = "", bool isAllChild = true, bool isSelectParent = true) { JArray jArray = new JArray(); if (id.IsNullOrWhiteSpace()) { return jArray; } string lang = Tools.GetCurrentLanguage(); var childs = isAllChild ? GetAllChilds(id) : GetChilds(id); StringBuilder space = new StringBuilder(); foreach (var child in childs) { if (child.Status == 1)//标记为已删除的不作为选项 { continue; } space.Clear(); int parentCount = GetParentCount(childs, child); for (int i = 0; i < parentCount; i++) { space.Append("    "); } if (parentCount > 0) { space.Append("├"); } string value1 = GetOptionValue(valueField, child); jArray.Add(new JObject() { { "value", value1 }, { "title", space.ToString() + GetLanguageTitle(child, lang) }, { "selected", value1.EqualsIgnoreCase(value) }, }); } return jArray; } /// /// 根据ID得到所有下级(控件选项) /// /// 根节点字典id /// 值字段 /// 是否显示根节点 /// 标题语言 /// public JArray GetAllChildsArray(string id, ValueField valueField, bool isRoot = false, string lang = "") { var childs = GetChilds(id); JArray jArray = new JArray(); foreach (Model.rf_dictionary child in childs) { JObject jObject = child.ToJObject(); jObject.Add("Value1", child.Value); jObject.Remove("Value"); jObject.Add("value", GetOptionValue(valueField, child)); jObject.Add("label", GetLanguageTitle(child, lang)); jArray.Add(jObject); AddChildsArray(child, jObject, valueField, lang); } JArray jArray1; if (isRoot) { var rootDict = GetOneById(id); if (null == rootDict) { return new JArray(); } JObject rootObj = rootDict.ToJObject(); rootObj.Add("Value1", rootDict.Value); rootObj.Add("value", GetOptionValue(valueField, rootDict)); rootObj.Add("label", GetLanguageTitle(rootDict, lang)); rootObj.Add("children", jArray); rootObj.Add("isLeaf", jArray.Count == 0); rootObj.Add("slots", new JObject() { { "icon", "custom" } }); jArray1 = new JArray() { rootObj }; } else { jArray1 = jArray; } return jArray1; } /// /// 递归添加下级(控件选项) /// /// /// private void AddChildsArray(Model.rf_dictionary dictionary, JObject jObject, ValueField valueField, string lang = "") { var childs = GetChilds(dictionary.Id); if (childs.Count == 0) { jObject.Add("isLeaf", true); jObject.Add("slots", new JObject() { { "icon", "custom" } }); return; } JArray jArray = new JArray(); jObject.Add("children", jArray); jObject.Add("isLeaf", false); jObject.Add("slots", new JObject() { { "icon", "custom" } }); foreach (Model.rf_dictionary child in childs) { JObject jObject1 = child.ToJObject(); jObject1.Add("Value1", child.Value); jObject1.Remove("Value"); jObject1.Add("value", GetOptionValue(valueField, child)); jObject1.Add("label", GetLanguageTitle(child, lang)); jArray.Add(jObject1); AddChildsArray(child, jObject1, valueField, lang); } } /// /// 根据ID得到选项(返回jarray,vue项目用) /// /// /// 值字段,默认id /// 默认值 /// 是否显示所有下级 /// 是否可以选择上级 /// public JArray GetArrayComboxsByID(string id, ValueField valueField = ValueField.Id, string value = "", bool isAllChild = true, bool isSelectParent = true) { JArray jArray = new JArray(); if (id.IsNullOrWhiteSpace()) { return jArray; } var childs = isAllChild ? GetAllChilds(id) : GetChilds(id); string lang = Tools.GetCurrentLanguage(); foreach (var child in childs) { if (child.Status == 1)//标记为已删除的不作为选项 { continue; } int parentCount = GetParentCount(childs, child); string value1 = GetOptionValue(valueField, child); jArray.Add(new JObject() { { "value", value1 }, { "title", GetLanguageTitle(child, lang)}, { "selected", value1.EqualsIgnoreCase(value) }, { "parentCount", parentCount }, { "group", !isSelectParent && childs.Exists(p=>p.ParentId == child.Id) }, }); } return jArray; } /// /// 得到单选或复选按钮组选项 /// /// /// 值字段 /// public JArray GetRadioOrCheckboxItems(string id, ValueField valueField = ValueField.Id) { JArray jArray = new JArray(); if (id.IsNullOrWhiteSpace()) { return jArray; } var childs = GetChilds(id); string lang = Tools.GetCurrentLanguage(); foreach (var child in childs) { if (child.Status == 1) { continue; } string value1 = GetOptionValue(valueField, child); jArray.Add(new JObject() { { "value", value1 }, { "title", GetLanguageTitle(child, lang) }, }); } return jArray; } /// /// 得到一个字典下级的最大排序号 /// /// /// public int GetMaxSort(string id) { var childs = GetChilds(id); return childs.Count == 0 ? 5 : childs.Max(p => p.Sort) + 5; } /// /// 检查唯一代码是否重复 /// /// /// /// true 没有重复 false 重复 public bool CheckCode(string id, string code) { var dict = GetOneById(code); return null == dict ? true : dict.Id == id; } /// /// 得到字典根ID /// /// public string GetRootId() { var root = GetRoot(); return null == root ? string.Empty : root.Id; } /// /// 导入数据字典 /// /// /// 语言包 public string Import(string json, IStringLocalizer localizer = null) { if (json.IsNullOrWhiteSpace()) { return localizer == null ? "要导入的json为空!" : localizer["ImportJsonEmpty"].Value; } Newtonsoft.Json.Linq.JArray jArray = null; try { jArray = Newtonsoft.Json.Linq.JArray.Parse(json); } catch { jArray = null; } if (null == jArray) { return localizer == null ? "json解析错误!" : localizer["JsonParseError"].Value; } StringBuilder stringBuilder = new StringBuilder(); foreach (Newtonsoft.Json.Linq.JObject jObject in jArray) { try { Model.rf_dictionary dictionaryModel = jObject.ToObject(); if (null == dictionaryModel) { continue; } if (GetOneById(dictionaryModel.Id) != null) { Update(dictionaryModel); } else { Add(dictionaryModel); } } catch (Exception err) { stringBuilder.Append(err.Message + ";"); new Log().Add(err); } } return stringBuilder.Length == 0 ? "1" : stringBuilder.ToString(); } } }