CustomQueryDoController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. /*
  2. * 自定义查询
  3. */
  4. using System;
  5. using System.Web;
  6. using System.Collections.Generic;
  7. using System.Diagnostics;
  8. using System.Linq;
  9. using System.Data;
  10. using System.Threading.Tasks;
  11. using System.Text.RegularExpressions;
  12. using Microsoft.AspNetCore.Mvc;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.Extensions.Logging;
  15. using Microsoft.Extensions.Options;
  16. using MySystem.Models;
  17. using Library;
  18. using LitJson;
  19. using MySystemLib;
  20. namespace MySystem.Areas.Admin.Controllers
  21. {
  22. [Area("Admin")]
  23. [Route("Admin/[controller]/[action]")]
  24. public class CustomQueryDoController : BaseController
  25. {
  26. public CustomQueryDoController(IHttpContextAccessor accessor, ILogger<BaseController> logger, IOptions<Setting> setting) : base(accessor, logger, setting)
  27. {
  28. OtherMySqlConn.connstr = ConfigurationManager.AppSettings["SqlConnStr"].ToString();
  29. }
  30. #region 自定义查询列表
  31. /// <summary>
  32. /// 根据条件查询自定义查询列表
  33. /// </summary>
  34. /// <returns></returns>
  35. public IActionResult Index(int Id, string right)
  36. {
  37. ViewBag.RightInfo = RightInfo;
  38. ViewBag.right = right;
  39. ViewBag.Id = Id.ToString();
  40. Dictionary<string, string> query = new Dictionary<string, string>();
  41. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  42. if(SysUserName != "admin")
  43. {
  44. string checkString = "," + item.AdminNames + ",";
  45. if(!checkString.Contains("," + SysUserName + ","))
  46. {
  47. return Content("无权限");
  48. }
  49. }
  50. string sql = item.SqlContent;
  51. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  52. foreach(Match m in mc)
  53. {
  54. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  55. string fieldName = fieldData[0];
  56. string Title = fieldData[1];
  57. if(!query.ContainsKey(fieldName))
  58. {
  59. query.Add(fieldName, Title);
  60. }
  61. }
  62. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  63. foreach(CustomQuerySub sub in subItems)
  64. {
  65. sql = sub.SqlContent;
  66. mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  67. foreach(Match m in mc)
  68. {
  69. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  70. string fieldName = fieldData[0];
  71. string Title = fieldData[1];
  72. if(!query.ContainsKey(fieldName))
  73. {
  74. query.Add(fieldName, Title);
  75. }
  76. }
  77. }
  78. ViewBag.query = query;
  79. string[] fieldList = item.SeoDescription.Split(',');
  80. string cols = "";
  81. foreach(string Title in fieldList)
  82. {
  83. cols += ",{field:'" + Title + "', width: 200, title:'" + Title + "'}";
  84. }
  85. ViewBag.cols = cols;
  86. return View();
  87. }
  88. #endregion
  89. #region 根据条件查询自定义查询列表
  90. /// <summary>
  91. /// 自定义查询列表
  92. /// </summary>
  93. /// <returns></returns>
  94. public JsonResult IndexData(int Id, int page = 1, int limit = 30)
  95. {
  96. Dictionary<string, string> dicVals = new Dictionary<string, string>();
  97. string ConnectStr = "";
  98. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  99. foreach(CustomQuerySub sub in subItems)
  100. {
  101. ConnectStr = sub.DatabaseConnect;
  102. if(!string.IsNullOrEmpty(ConnectStr))
  103. {
  104. ConnectStr = GetConnectStr(sub.DatabaseConnect);
  105. }
  106. else
  107. {
  108. ConnectStr = MysqlConn.ReadSqlConnStr;
  109. }
  110. string sqlstr = sub.SqlContent;
  111. MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
  112. foreach(Match m in mcsub)
  113. {
  114. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  115. string fieldName = fieldData[0];
  116. sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
  117. }
  118. mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
  119. foreach(Match m in mcsub)
  120. {
  121. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  122. if(dicVals.ContainsKey(fieldName))
  123. {
  124. sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
  125. }
  126. else
  127. {
  128. sqlstr = sqlstr.Replace(m.Value, "");
  129. }
  130. }
  131. DataTable dtsub = CustomerSqlConn.dtable(sqlstr, ConnectStr);
  132. if(dtsub.Rows.Count > 0)
  133. {
  134. if(dtsub.Rows.Count > 1)
  135. {
  136. string val = "";
  137. foreach(DataRow dr in dtsub.Rows)
  138. {
  139. val += dr[0].ToString() + ",";
  140. }
  141. val = val.TrimEnd(',');
  142. dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
  143. }
  144. else
  145. {
  146. DataRow dr = dtsub.Rows[0];
  147. foreach(DataColumn dc in dtsub.Columns)
  148. {
  149. dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
  150. }
  151. }
  152. }
  153. }
  154. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  155. ConnectStr = item.DatabaseConnect;
  156. if(!string.IsNullOrEmpty(ConnectStr))
  157. {
  158. ConnectStr = GetConnectStr(item.DatabaseConnect);
  159. }
  160. else
  161. {
  162. ConnectStr = MysqlConn.ReadSqlConnStr;
  163. }
  164. string sql = item.SqlContent;
  165. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  166. foreach(Match m in mc)
  167. {
  168. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  169. string fieldName = fieldData[0];
  170. sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
  171. }
  172. mc = Regex.Matches(sql, @"\#\{.*?\}\#");
  173. foreach(Match m in mc)
  174. {
  175. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  176. if(dicVals.ContainsKey(fieldName))
  177. {
  178. sql = sql.Replace(m.Value, dicVals[fieldName]);
  179. }
  180. else
  181. {
  182. sql = sql.Replace(m.Value, "");
  183. }
  184. }
  185. mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
  186. foreach(Match m in mc)
  187. {
  188. string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
  189. string str = fieldData[0];
  190. string oldStr = fieldData[1];
  191. string newStr = fieldData[2];
  192. str = str.Replace(oldStr, newStr);
  193. sql = sql.Replace(m.Value, str);
  194. }
  195. if(page > 1)
  196. {
  197. int skip = (page - 1) * limit;
  198. sql += " limit " + skip + "," + limit;
  199. }
  200. else
  201. {
  202. sql += " limit " + limit;
  203. }
  204. DataTable dt = CustomerSqlConn.dtable(sql, ConnectStr);
  205. List<Dictionary<string, string>> diclist = new List<Dictionary<string, string>>();
  206. foreach(DataRow dr in dt.Rows)
  207. {
  208. Dictionary<string, string> row = new Dictionary<string, string>();
  209. foreach(DataColumn dc in dt.Columns)
  210. {
  211. if (dc.DataType == typeof(DateTime))
  212. {
  213. row.Add(dc.ColumnName, string.IsNullOrEmpty(dr[dc.ColumnName].ToString()) ? "" : DateTime.Parse(dr[dc.ColumnName].ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
  214. }
  215. else
  216. {
  217. row.Add(dc.ColumnName, dr[dc.ColumnName].ToString());
  218. }
  219. }
  220. diclist.Add(row);
  221. }
  222. Dictionary<string, object> obj = new Dictionary<string, object>();
  223. obj.Add("code", 0);
  224. obj.Add("msg", "");
  225. obj.Add("count", 300);
  226. obj.Add("data", diclist);
  227. return Json(obj);
  228. }
  229. #endregion
  230. #region 导出Excel
  231. /// <summary>
  232. /// 导出Excel
  233. /// </summary>
  234. /// <returns></returns>
  235. public string ExportExcel(int Id)
  236. {
  237. var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
  238. Dictionary<string, string> dicVals = new Dictionary<string, string>();
  239. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  240. foreach(CustomQuerySub sub in subItems)
  241. {
  242. string ConnectStr = sub.DatabaseConnect;
  243. if(!string.IsNullOrEmpty(ConnectStr))
  244. {
  245. ConnectStr = GetConnectStr(sub.DatabaseConnect);
  246. }
  247. else
  248. {
  249. ConnectStr = MysqlConn.ReadSqlConnStr;
  250. }
  251. string sqlstr = sub.SqlContent;
  252. MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
  253. foreach(Match m in mcsub)
  254. {
  255. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  256. string fieldName = fieldData[0];
  257. sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
  258. }
  259. mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
  260. foreach(Match m in mcsub)
  261. {
  262. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  263. if(dicVals.ContainsKey(fieldName))
  264. {
  265. sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
  266. }
  267. }
  268. DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
  269. if(dtsub.Rows.Count > 0)
  270. {
  271. if(dtsub.Rows.Count > 1)
  272. {
  273. string val = "";
  274. foreach(DataRow dr in dtsub.Rows)
  275. {
  276. val += dr[0].ToString() + ",";
  277. }
  278. val = val.TrimEnd(',');
  279. dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
  280. }
  281. else
  282. {
  283. DataRow dr = dtsub.Rows[0];
  284. foreach(DataColumn dc in dtsub.Columns)
  285. {
  286. dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
  287. }
  288. }
  289. }
  290. }
  291. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  292. string sql = item.SqlContent;
  293. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  294. foreach(Match m in mc)
  295. {
  296. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  297. string fieldName = fieldData[0];
  298. sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
  299. }
  300. mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
  301. foreach(Match m in mc)
  302. {
  303. string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
  304. string str = fieldData[0];
  305. string oldStr = fieldData[1];
  306. string newStr = fieldData[2];
  307. str = str.Replace(oldStr, newStr);
  308. sql = sql.Replace(m.Value, str);
  309. }
  310. var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  311. string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"" + FileName + "\",\"MaxCount\":\"0\"}";
  312. RedisDbconn.Instance.AddList("ExportQueue", SendData);
  313. return "success";
  314. }
  315. #endregion
  316. #region 执行
  317. /// <summary>
  318. /// 执行
  319. /// </summary>
  320. /// <returns></returns>
  321. public string Excute(int Id)
  322. {
  323. var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
  324. Dictionary<string, string> dicVals = new Dictionary<string, string>();
  325. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  326. foreach(CustomQuerySub sub in subItems)
  327. {
  328. string ConnectStr = sub.DatabaseConnect;
  329. if(!string.IsNullOrEmpty(ConnectStr))
  330. {
  331. ConnectStr = GetConnectStr(sub.DatabaseConnect);
  332. }
  333. else
  334. {
  335. ConnectStr = MysqlConn.ReadSqlConnStr;
  336. }
  337. string sqlstr = sub.SqlContent;
  338. MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
  339. foreach(Match m in mcsub)
  340. {
  341. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  342. string fieldName = fieldData[0];
  343. sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
  344. }
  345. mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
  346. foreach(Match m in mcsub)
  347. {
  348. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  349. if(dicVals.ContainsKey(fieldName))
  350. {
  351. sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
  352. }
  353. }
  354. DataTable dtsub = CustomerSqlConn.dtable(sqlstr, ConnectStr);
  355. if(dtsub.Rows.Count > 0)
  356. {
  357. if(dtsub.Rows.Count > 1)
  358. {
  359. string val = "";
  360. foreach(DataRow dr in dtsub.Rows)
  361. {
  362. val += dr[0].ToString() + ",";
  363. }
  364. val = val.TrimEnd(',');
  365. dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
  366. }
  367. else
  368. {
  369. DataRow dr = dtsub.Rows[0];
  370. foreach(DataColumn dc in dtsub.Columns)
  371. {
  372. dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
  373. }
  374. }
  375. }
  376. }
  377. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  378. string sql = item.SqlContent;
  379. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  380. foreach(Match m in mc)
  381. {
  382. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  383. string fieldName = fieldData[0];
  384. sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
  385. }
  386. mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
  387. foreach(Match m in mc)
  388. {
  389. string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
  390. string str = fieldData[0];
  391. string oldStr = fieldData[1];
  392. string newStr = fieldData[2];
  393. str = str.Replace(oldStr, newStr);
  394. sql = sql.Replace(m.Value, str);
  395. }
  396. var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  397. string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"执行\",\"MaxCount\":\"" + item.ExcuteFlag + "\"}";
  398. RedisDbconn.Instance.AddList("ExportQueue", SendData);
  399. return "success";
  400. }
  401. #endregion
  402. #region 获取链接数据库字符串
  403. public string GetConnectStr(string key)
  404. {
  405. return Library.ConfigurationManager.AppSettings[key].ToString();
  406. }
  407. #endregion
  408. }
  409. }