using Furion.DependencyInjection; using Furion.DynamicApiController; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RoadFlow.Utility; using Furion; using RoadFlow.Data; using Microsoft.AspNetCore.Authorization; using Ewide.RoadFlowLite.Utility; using Furion.FriendlyException; using Ewide.Core; namespace Ewide.RoadFlowLite.Serivce.Dictionary { /// /// 工作流字典服务 /// [Route("/api/roadflow/Dictionary/")] [ApiDescriptionSettings("RoadFlow")] public class DictionaryService : IDictionaryService, IDynamicApiController, ITransient { private readonly IDictionary _repo; private readonly ILog _log; private readonly IUserManager _userManager; public DictionaryService(IDictionary repo ,ILog log, IUserManager userManager) { _repo = repo; _log = log; _userManager = userManager; } /// /// 获取数据字典树 /// /// /// [HttpPost("GetTreeJson")] [AllowAnonymous] public async Task GetTreeJson([FromBody] JObject args) { string rootId = (string)args["rootid"]; bool showRoot = ((string)args["showroot"]).IsNullOrWhiteSpace() || "1".Equals((string)args["showroot"]);//是否显示根节点 bool isEle = "1".Equals((string)args["isele"]);//是否是ELE,ELE只返回根一级,返回两级 rootId = rootId.IsGuid(out Guid rid) ? rootId : _repo.GetIdByCode(rootId); var dict = string.IsNullOrWhiteSpace(rootId) ? _repo.GetRoot() : _repo.GetOneById(rootId); if (dict == null) { return ""; } string language = RoadFlow.Utility.Tools.GetCurrentLanguage(App.HttpContext); JArray jArray = new JArray(); JObject rootJson = new JObject { { "id", dict.Id }, { "parentId", dict.ParentId }, { "title", _repo.GetLanguageTitle(dict, language) }, { "open", true }, { "current", false }, { "ico", "icon-wallet" }, { "code", dict.Code }, { "value", dict.Value }, { "note", dict.Note }, { "other", dict.Other }, { "status", dict.Status }, { "slots", new JObject() { { "icon", "custom" } } } }; JArray childsArray = new JArray(); var dictChilds = _repo.GetChilds(dict.Id); if (!isEle) { foreach (var dictChild in dictChilds) { JObject dictJson = new JObject { { "id", dictChild.Id }, { "parentId", dictChild.ParentId }, { "title", _repo.GetLanguageTitle(dictChild, language) }, { "current", false }, { "ico", "" }, { "code", dictChild.Code }, { "value", dictChild.Value }, { "note", dictChild.Note }, { "other", dictChild.Other }, { "status", dictChild.Status }, { "slots", new JObject() { { "icon", "custom" } } } }; if (_repo.HasChilds(dictChild.Id)) { dictJson.Add("open", false); dictJson.Add("childs", new JArray()); dictJson.Add("isLeaf", false); } else { dictJson.Add("isLeaf", true); } childsArray.Add(dictJson); } } rootJson.Add("childs", childsArray); rootJson.Add("isLeaf", dictChilds.Count == 0); jArray.Add(rootJson); return showRoot ? jArray : childsArray; } /// /// /// /// [HttpGet("GetTreeChildsJson")] public dynamic GetTreeChildsJson(string parentid) { string parentGuid = parentid;//(string)args["parentid"]; var dictChilds = _repo.GetChilds(parentGuid); JArray jArray = new JArray(); foreach (var dictChild in dictChilds) { JObject dictJson = new JObject() { { "id", dictChild.Id }, { "parentId", dictChild.ParentId }, { "title", dictChild.Title }, { "current", false }, { "ico", "" }, { "code", dictChild.Code }, { "value", dictChild.Value }, { "note", dictChild.Note }, { "other", dictChild.Other }, { "status", dictChild.Status }, { "slots", new JObject() { { "icon", "custom" } } } }; if (_repo.HasChilds(dictChild.Id)) { dictJson.Add("open", false); dictJson.Add("childs", new JArray()); dictJson.Add("isLeaf", false); } else { dictJson.Add("isLeaf", true); } jArray.Add(dictJson); } return jArray; } /// /// 根据值得到标题 /// /// [HttpPost("GetText")] //[ApiValidate] public dynamic GetText([FromBody] JObject args) { string value = (string)args["value"]; JArray jArray = new JArray(); foreach (string val in value.Split(',')) { if (!val.IsGuid(out Guid vId)) { continue; } jArray.Add(new JObject() { { "value", val }, { "title", _repo.GetTitle(val, "") } }); } return jArray; } [HttpGet("hello")] [AllowAnonymous] public dynamic Hello() { string hello = "hello".DESEncrypt(); return hello+":"+hello.DESDecrypt(); } /// /// antd版获取字典树json /// /// [HttpGet("GetTreeJsonEle")] public dynamic GetTreeJsonEle(string rootId, string showroot) { bool showRoot = showroot.IsNullOrEmpty() || showroot == "1";//是否显示根节点 string rootGuid = rootId.IsGuid() ? rootId : _repo.GetIdByCode(rootId.Trim()); var dict = rootGuid.IsNullOrEmpty() ? _repo.GetRoot() : _repo.GetOneById(rootGuid); if (dict == null) { return new JArray(); // return RoadFlowCommon.Tools.GetReturnJsonString(jArray: new JArray()); } string language = RoadFlow.Utility.Tools.GetCurrentLanguage(Furion.App.HttpContext); JArray jArray = new JArray(); JObject rootJson = new JObject { { "id", dict.Id }, { "parentId", dict.ParentId }, { "title", _repo.GetLanguageTitle(dict, language) }, { "code", dict.Code }, { "value", dict.Value }, { "note", dict.Note }, { "other", dict.Other }, { "status", dict.Status }, }; JArray childsArray = new JArray(); var dictChilds = _repo.GetChilds(dict.Id); if (!showRoot) { foreach (var dictChild in dictChilds) { JObject dictJson = new JObject { { "id", dictChild.Id }, { "parentId", dictChild.ParentId }, { "title", _repo.GetLanguageTitle(dictChild, language) }, { "code", dictChild.Code }, { "value", dictChild.Value }, { "note", dictChild.Note }, { "other", dictChild.Other }, { "status", dictChild.Status }, }; dictJson.Add("leaf", !_repo.HasChilds(dictChild.Id)); childsArray.Add(dictJson); } } //rootJson.Add("childs", childsArray); rootJson.Add("leaf", dictChilds.Count == 0); jArray.Add(rootJson); return showRoot ? jArray : childsArray; //RoadFlowCommon.Tools.GetReturnJsonString(jArray: showRoot ? jArray : childsArray); } /// /// antd版获取字典下级json /// /// [HttpGet("GetTreeChildsJsonEle")] public dynamic GetTreeChildsJsonEle(string parentId) { if (!parentId.IsGuid(out Guid parentGuid)) { return new JArray(); // return RoadFlowCommon.Tools.GetReturnJsonString(jArray: new JArray()); } string language = RoadFlow.Utility.Tools.GetCurrentLanguage(Furion.App.HttpContext); var dictChilds = _repo.GetChilds(parentId); JArray jArray = new JArray(); foreach (var dictChild in dictChilds) { JObject dictJson = new JObject() { { "id", dictChild.Id }, { "parentId", dictChild.ParentId }, { "title", _repo.GetLanguageTitle(dictChild, language) }, { "code", dictChild.Code }, { "value", dictChild.Value }, { "note", dictChild.Note }, { "other", dictChild.Other }, { "status", dictChild.Status }, }; dictJson.Add("leaf", !_repo.HasChilds(dictChild.Id)); jArray.Add(dictJson); } return jArray; //RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray); } /// /// antd版得到select选项 /// /// [HttpPost("GetSelectOptions")] public dynamic GetSelectOptions([FromBody] JObject args) { string param = args.GetJsonValue("params"); if (param.IsNullOrWhiteSpace()) { return new JObject(); //return RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject()); } JArray paramArray = param.ToJArray(); if (paramArray.IsEmptyJArray()) { return new JObject(); //return RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject()); } JObject returnObject = new JObject(); int i = 0; foreach (JObject jObject in paramArray) { string id = jObject.Value("id");//字典id或code string key = jObject.Value("key");//返回json key string type = jObject.Value("type");//类型 select(下拉选择), cascader(级联选择器) string valueField = jObject.Value("valuefield");//值字段 bool childs = jObject.Value("childs").ToInt(0) == 1;//是否加载所有下级 bool isRoot = jObject.Value("root").ToInt(0) == 1;//是否包含根节点 key = key.IsNullOrWhiteSpace() ? "options" + i++.ToString() : key; if (returnObject.ContainsKey(key)) { continue; } if (id.IsNullOrWhiteSpace()) { continue; } if (type.IsNullOrWhiteSpace()) { type = "select"; } if (valueField.IsNullOrWhiteSpace()) { valueField = "id"; } if (!id.IsGuid(out Guid guid)) { guid = _repo.GetIdByCode(id).ToGuid(); } string lang = RoadFlow.Utility.Tools.GetCurrentLanguage(Furion.App.HttpContext); if (type.EqualsIgnoreCase("select")) { JArray jArray = _repo.GetArrayOptionsByID(guid.ToString(), _repo.GetValueField(valueField), string.Empty, childs); returnObject.Add(key, jArray); } else if (type.EqualsIgnoreCase("cascader")) { JArray jArray = _repo.GetAllChildsArray(guid.ToString(), _repo.GetValueField(valueField), isRoot, lang); returnObject.Add(key, jArray); } } return returnObject; ;//RoadFlowCommon.Tools.GetReturnJsonString(jObject: returnObject); } /// /// 得到select下拉选项 /// /// [HttpPost("GetOptions")] public dynamic GetOptions([FromBody] JObject args) { string dictId = args.GetJsonValue("dictid"); string childs = args.GetJsonValue("childs"); string valueField = args.GetJsonValue("valuefield"); string value = args.GetJsonValue("value"); string parentValue = args.GetJsonValue("parentvalue");//上一个选择的值,联动的时候获取 string selectParent = args.GetJsonValue("selectparent");//是否可以选择上级 JArray optionsArray = new JArray(); foreach (string pValue in (parentValue.IsNullOrWhiteSpace() ? dictId : parentValue).Split(',')) { if (!pValue.IsGuid(out Guid dictGuid)) { continue; } JArray jArray = _repo.GetArrayOptionsByID(dictGuid.ToString(), _repo.GetValueField(valueField), value, "1".Equals(childs), "1".Equals(selectParent)); foreach (JObject jObject in jArray) { optionsArray.Add(jObject); } } return optionsArray; //RoadFlowCommon.Tools.GetReturnJsonString(jArray: optionsArray); } /// /// 得到combox下拉选项 /// /// [HttpPost("GetComboxOptions")] public dynamic GetComboxOptions([FromBody] JObject args) { string dictId = args.GetJsonValue("dictid"); string childs = args.GetJsonValue("childs"); string valueField = args.GetJsonValue("valuefield"); string value = args.GetJsonValue("value"); string parentValue = args.GetJsonValue("parentvalue");//上一个选择的值,联动的时候获取 string selectParent = args.GetJsonValue("selectparent");//是否可以选择上级 JArray optionsArray = new JArray(); foreach (string pValue in (parentValue.IsNullOrWhiteSpace() ? dictId : parentValue).Split(',')) { if (!pValue.IsGuid(out Guid dictGuid)) { continue; } JArray jArray = _repo.GetArrayComboxsByID(dictGuid.ToString(), _repo.GetValueField(valueField), value, "1".Equals(childs), "1".Equals(selectParent)); foreach (JObject jObject in jArray) { optionsArray.Add(jObject); } } return optionsArray;// RoadFlowCommon.Tools.GetReturnJsonString(jArray: optionsArray); } /// /// 得到单选按钮组选项 /// /// [HttpPost("GetRadioOrCheckboxItems")] public dynamic GetRadioOrCheckboxItems([FromBody] JObject args) { string dictId = args.GetJsonValue("dictid"); string valueField = args.GetJsonValue("valuefield"); JArray jArray = _repo.GetRadioOrCheckboxItems(dictId, _repo.GetValueField(valueField)); return jArray; //RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray); } /* /// /// 根据值得到标题 /// /// [HttpPost("GetText")] public dynamic GetText([FromBody] JObject args) { string value = args.GetJsonValue("value"); JArray jArray = new JArray(); string lang = RoadFlow.Utility.Tools.GetCurrentLanguage(Furion.App.HttpContext); foreach (string val in value.Split(',')) { if (!val.IsGuid(out Guid vId)) { continue; } jArray.Add(new JObject() { { "value", val }, { "title", _repo.GetTitle(vId, lang) } }); } return jArray; //RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray); } */ /// /// 验证Code是否重复 /// /// [HttpPost("ValidCode")] public dynamic ValidCode([FromBody] JObject args) { string id = args.GetJsonValue("id"); int type = args.GetJsonValue("type").ToInt(1);//0保存 1保存为下级 string code = args.GetJsonValue("value"); if (code.IsNullOrWhiteSpace()) { throw Oops.Oh("编码不能为空"); // return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CodeEmpty"].Value); } var dictModel = _repo.GetOneById(code.Trim()); if (dictModel == null) { return new JObject() { { "success", true }, { "msg", string.Empty } }; //return RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject() { { "success", true }, { "msg", string.Empty } }); } if (dictModel.Id == id && type == 0) { return new JObject() { { "success", true }, { "msg", string.Empty } }; //RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject() { { "success", true }, { "msg", string.Empty } }); } return new JObject() { { "success", false }, { "msg", "编码重复" } }; //RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject() { { "success", false }, { "msg", localizer["CodeDuplicate"].Value } }); } [HttpGet("Get")] public dynamic Get(string id) { if (!id.IsGuid(out Guid guid)) { return new JObject(); //RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject()); } var dictModel = _repo.GetOneById(id); if (null == dictModel) { return new JObject(); //RoadFlowCommon.Tools.GetReturnJsonString(jObject: new JObject()); } return JObject.FromObject(dictModel); //RoadFlowCommon.Tools.GetReturnJsonString(jObject: JObject.FromObject(dictModel)); } /// /// 得到排序的项 /// /// [HttpGet("GetSortItems")] public dynamic GetSortItems(string id) { if (!id.IsGuid(out Guid dictId)) { throw Oops.Oh("ID错误"); //return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["IdError"].Value); } var dictChilds = _repo.GetChilds(id); string lang = RoadFlow.Utility.Tools.GetCurrentLanguage(Furion.App.HttpContext); JArray jArray = new JArray(); foreach (var dictChild in dictChilds) { JObject jObject = new JObject() { { "id", dictChild.Id }, { "title", _repo.GetLanguageTitle(dictChild, lang) } }; jArray.Add(jObject); } return jArray; //RoadFlowCommon.Tools.GetReturnJsonString(jArray: jArray); } /// /// 保存 /// /// [HttpPost("Save")] public string Save(RoadFlow.Model.rf_dictionary dictModel) { int type = Furion.App.HttpContext.Request.Querys("type").ToInt(); string id = Furion.App.HttpContext.Request.Querys("id"); //保存为下级 if (type == 1) { dictModel.ParentId = dictModel.Id; dictModel.Id = GuidExtensions.NewGuid().ToString(); dictModel.Sort = _repo.GetMaxSort(dictModel.ParentId); } //检查唯一代码 if (!_repo.CheckCode(dictModel.Id, dictModel.Code)) { throw Oops.Oh("编码重复"); // return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CodeDuplicate"].Value); } if (id.IsGuid(out Guid dictId) && type == 0) { var oldModel = _repo.GetOneById(id); _repo.Update(dictModel); _log.Add("修改了数据字典-" + dictModel.Title, type: LogType.系统管理, oldContents: oldModel.ToString(), newContents: dictModel.ToString()); } else { _repo.Add(dictModel); _log.Add("添加了数据字典-" + dictModel.Title,_userManager.UserId ,dictModel.ToString(),LogType.系统管理); } return "保存成功"; //RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["SaveSuccess"].Value); } /// /// 保存排序 /// /// [HttpPost("SaveSort")] public string SaveSort([FromBody] JObject args) { string[] ids = args.GetJsonValue("ids").Split(','); List dictionaries = new List(); for (int i = 0; i < ids.Length; i++) { if (!ids[i].IsGuid(out Guid dictId)) { continue; } var dictModel = _repo.GetOneById(ids[i]); if (null == dictModel) { continue; } dictModel.Sort = (i + 1) * 5; dictionaries.Add(dictModel); } _repo.Update(dictionaries); return "保存成功"; //RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["SaveSuccess"].Value); } /// /// 删除 /// /// [HttpPost("Delete")] public string Delete([FromBody] JObject args) { string id = args.GetJsonValue("id"); if (!id.IsGuid(out Guid dictId)) { throw Oops.Oh("ID错误"); // return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["IdError"].Value); } if (id == _repo.GetRootId()) { throw Oops.Oh("不能删除根对象"); // return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["CannotDeleteRoot"].Value); } var dictModel = _repo.GetOneById(id); if (null == dictModel) { throw Oops.Oh("未找到字典对象"); //return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NotFoundDict"].Value); } var list =_repo.GetAllChilds(id,true); var count = _repo.DeleteBy(x=>x.Id==id); count += _repo.DeleteBy(x => x.ParentId == id); _log.Add("删除了数据字典-共" + count + "项",_userManager.UserId ,list.Serialize(), LogType.系统管理); return "成功删除" + count + "条"; //RoadFlowCommon.Tools.GetReturnJsonString(true, localizer["DeleteSuccess"].Value + dictList.Count + localizer["DeleteItems"].Value); } /// /// 导入数据字典 /// /// [HttpPost("Import")] public string Import([FromBody] JObject args) { var files = args.GetJsonValue("files"); if (files.IsNullOrWhiteSpace()) { throw Oops.Oh("未选择要导入的文件"); // return RoadFlowCommon.Tools.GetReturnJsonString(false, localizer["NoSelectImportFile"].Value); } System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder(); foreach (string file in files.Split(',')) { string filePath = RoadFlow.Utility.Config.FilePath + file.DESDecrypt(); if (!System.IO.File.Exists(filePath)) { continue; } var stream = System.IO.File.OpenRead(filePath); int count = (int)stream.Length; byte[] b = new byte[count]; stream.Read(b, 0, count); string json = System.Text.Encoding.UTF8.GetString(b); string msg = _repo.Import(json, null);//localizer); stream.Close(); stream.DisposeAsync(); try { System.IO.File.Delete(filePath); } catch (System.IO.IOException err) { _log.Add(err); } if (!"1".Equals(msg)) { stringBuilder.Append(msg + ","); } } string msg1 = stringBuilder.ToString().TrimEnd(','); if (msg1.IsNullOrWhiteSpace()) return "导入成功"; else throw Oops.Oh(msg1); //RoadFlowCommon.Tools.GetReturnJsonString(msg1.IsNullOrWhiteSpace(), msg1.IsNullOrWhiteSpace() ? localizer["ImportSuccess"].Value : msg1); } } }