using Common.Models.JsonModels; using Common.Models.UnqTables; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Http; using SqlSugar; using Common.DbExtends.Extends; using System.Reflection; using static Common.DbExtends.Extends.ReplyExtend; using Server.MyClass.Views; using Newtonsoft.Json; using Common.Utils; using Newtonsoft.Json.Linq; using Common.Models.Enums; namespace Server.Controllers.FunctionSetting { public class ReplyController : DefaultController { /// /// 查询变量 /// /// [HttpPost, ErrorFilter] public WebResult GetReply() { var Id = GetInt("ConfigId", true); var Config = Db.GetReplyConfigById(Id); var List = TranslationByObj(Config); return PutData(List); } /// /// 新增基础配置模板 /// /// [HttpPost, ErrorFilter] public WebResult AddConfig() { string Name = GetString("Name", true); var json = JObject.Parse(GetString("Cfg", true)); var config = Db.Queryable().Where(f => f.Name == Name && f.Type == Common.Models.Enums.ConfigType.文案).First(); if (config != null) return PutData("新增失败,此模板名称已存在"); ReplyConfig wenan_config = new ReplyConfig(); Util.CopyToObj(json, wenan_config); var Cfg = JsonConvert.SerializeObject(wenan_config); config = new ConfigData(); config.Type = ConfigType.文案; config.JsonContent = Cfg; config.Name = Name; Db.Save(config); return PutSuccess; } /// /// 编辑配置 /// /// [HttpPost, ErrorFilter] public WebResult UpdConfig() { var Id = GetInt("Id", true); var jsondata = GetString("Cfg", true); var config = Db.GetConfigData(Id); if (config == null) return PutData("编辑失败,没有此模板"); if (config.Type != Common.Models.Enums.ConfigType.文案) { return PutData("编辑失败,此模板类型不匹配"); } ReplyConfig wenan_config = TranslationByJson(jsondata); var Cfg = JsonConvert.SerializeObject(wenan_config); config.JsonContent = Cfg; Db.Save(config); var Robots = Db.Queryable().Where(f => f.ConfigReplyId == Id).Select(f => f.Id).ToList(); if (Robots.Count != 0) { foreach (var RobotId in Robots) Client.SendClientMsg(RobotId, DeviceMessageType.返利配置修改, new { ConfigId = Id }); } return PutSuccess; } private ReplyConfig TranslationByJson(string json) { var jArray = JsonConvert.DeserializeObject(json); var replyConfig = new ReplyConfig(); foreach (var item in jArray) { var pname = item["Name"].Value(); var property = replyConfig.GetType().GetProperty(pname); if (property != null) { var pobj = Activator.CreateInstance(property.PropertyType); property.SetValue(replyConfig, pobj); TranslationByJson(item, pobj); } } return replyConfig; } private void TranslationByJson(JToken token, object obj) { var menuTokens = token["Menus"].ToArray(); if (!menuTokens.Any()) { return; } foreach (var item in menuTokens) { var pname = item["Name"].Value(); var context = item["Content"].Value(); var property = obj.GetType().GetProperty(pname); if (property == null) { continue; } if (property.PropertyType == typeof(string)) { property.SetValue(obj, context); } else { var pobj = Activator.CreateInstance(property.PropertyType); property.SetValue(obj, pobj); TranslationByJson(item, pobj); } } } //private ReplyConfig TranslationByJson(ReplyShowClass obj, ReplyConfig config) //{ // PropertyInfo[] propertys = obj.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); // foreach (PropertyInfo item in propertys) // { // var value = item.GetValue(obj) as ReplyShowClass; // if (value == null) continue; // //有子菜单 // if (value.Menus != null && value.Menus.Count > 0) // { // TranslationByJson(obj, config); // } // //没有子菜单,到了跟类 // else // { // } // } //} private List TranslationByObj(object obj) { if (obj == null) { return new List(); } var replys = new List(); var stringType = typeof(string); var atrType = typeof(ReplyAttribute); PropertyInfo[] propertys = obj.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public); foreach (var item in propertys) { if (item.IsDefined(atrType, true)) { var curAttribute = item.GetCustomAttribute(); if (curAttribute == null)//防止异常 { continue; } var respose = new ReplyShowClass() { Name = item.Name, Description = curAttribute.Describe }; var propertyValue = item.GetValue(obj); if (item.PropertyType == stringType) { respose.PrivateVariables = curAttribute.PrivateVariables; respose.Content = propertyValue?.ToString(); } else { respose.Menus = new List(); respose.Menus.AddRange(TranslationByObj(propertyValue)); } replys.Add(respose); } } return replys; } } }