using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using JNPF.Common.Extension; using Tnb.Vengine.DataAccess; namespace Tnb.Vengine.Domain { public class OutputParser { private readonly IDataAccess _dataAccess; private readonly Vmodel _root; private List _outputs; private Dictionary _selectProps = new Dictionary(); private Dictionary _navModels = new Dictionary(); public OutputParser(IDataAccess dataAccess, Vmodel rootModel, string output) { _dataAccess = dataAccess; _root = rootModel; _outputs = output.Split(',').Distinct().ToList(); ParseOutputStr(); } /// /// 按模型组织要输出的属性 /// private void ParseOutputStr() { foreach (var outStr in _outputs) { if (string.IsNullOrWhiteSpace(outStr)) { continue; } string vmPath; int n = outStr.LastIndexOf('.'); if (n < 1) { vmPath = Vmodel.MAIN_ALIES; } else { vmPath = outStr.Substring(0, n); } if (!_selectProps.ContainsKey(vmPath)) { _selectProps.Add(vmPath, new OutputSelect { navPaths = vmPath.Split(',').ToList(), vmPath = vmPath }); } var outSelect = _selectProps[vmPath]; outSelect.propCodes.Add(outStr.Substring(n + 1)); } } private async Task LoadNavModel() { var navProps = _root.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList(); await LoadVmodelNavigateAsync(navProps); } private async Task LoadVmodelNavigateAsync(List navProps) { var db = _dataAccess.GetSqlSugar(); var vmids = navProps.Select(a => a.vmid).Distinct().ToList(); var navs = await db.Queryable().Where(a => vmids.Contains(a.id)).ToDictionaryAsync(a => a.id, a => a); foreach (var navProp in navProps) { navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid); navProp.naviModel.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList(); } } } internal class OutputSelect { public string vmId { get; set; } = string.Empty; public string vmCode { get; set; } = string.Empty; public string vmPath { get; set; } = string.Empty; public eNavigateType navType { get; set; } = eNavigateType.None; public List navPaths { get; set; } = new List(); public List propCodes { get; set; } = new List(); public List fieldCodes { get; set; } = new List(); public OutputSelect() { } public OutputSelect(Vmodel model) { vmId = model.id; vmCode = model.vmCode; vmPath = Vmodel.MAIN_ALIES; } } }