CustomQueryDoController.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  98. foreach(CustomQuerySub sub in subItems)
  99. {
  100. string sqlstr = sub.SqlContent;
  101. MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
  102. foreach(Match m in mcsub)
  103. {
  104. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  105. string fieldName = fieldData[0];
  106. sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
  107. }
  108. mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
  109. foreach(Match m in mcsub)
  110. {
  111. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  112. if(dicVals.ContainsKey(fieldName))
  113. {
  114. sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
  115. }
  116. else
  117. {
  118. sqlstr = sqlstr.Replace(m.Value, "");
  119. }
  120. }
  121. DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
  122. if(dtsub.Rows.Count > 0)
  123. {
  124. if(dtsub.Rows.Count > 1)
  125. {
  126. string val = "";
  127. foreach(DataRow dr in dtsub.Rows)
  128. {
  129. val += dr[0].ToString() + ",";
  130. }
  131. val = val.TrimEnd(',');
  132. dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
  133. }
  134. else
  135. {
  136. DataRow dr = dtsub.Rows[0];
  137. foreach(DataColumn dc in dtsub.Columns)
  138. {
  139. dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
  140. }
  141. }
  142. }
  143. }
  144. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  145. string sql = item.SqlContent;
  146. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  147. foreach(Match m in mc)
  148. {
  149. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  150. string fieldName = fieldData[0];
  151. sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
  152. }
  153. mc = Regex.Matches(sql, @"\#\{.*?\}\#");
  154. foreach(Match m in mc)
  155. {
  156. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  157. if(dicVals.ContainsKey(fieldName))
  158. {
  159. sql = sql.Replace(m.Value, dicVals[fieldName]);
  160. }
  161. else
  162. {
  163. sql = sql.Replace(m.Value, "");
  164. }
  165. }
  166. mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
  167. foreach(Match m in mc)
  168. {
  169. string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
  170. string str = fieldData[0];
  171. string oldStr = fieldData[1];
  172. string newStr = fieldData[2];
  173. str = str.Replace(oldStr, newStr);
  174. sql = sql.Replace(m.Value, str);
  175. }
  176. if(page > 1)
  177. {
  178. int skip = (page - 1) * limit;
  179. sql += " limit " + skip + "," + limit;
  180. }
  181. else
  182. {
  183. sql += " limit " + limit;
  184. }
  185. DataTable dt = CustomerSqlConn.dtable(sql, MysqlConn.ReadSqlConnStr);
  186. List<Dictionary<string, string>> diclist = new List<Dictionary<string, string>>();
  187. foreach(DataRow dr in dt.Rows)
  188. {
  189. Dictionary<string, string> row = new Dictionary<string, string>();
  190. foreach(DataColumn dc in dt.Columns)
  191. {
  192. if (dc.DataType == typeof(DateTime))
  193. {
  194. row.Add(dc.ColumnName, string.IsNullOrEmpty(dr[dc.ColumnName].ToString()) ? "" : DateTime.Parse(dr[dc.ColumnName].ToString()).ToString("yyyy-MM-dd HH:mm:ss"));
  195. }
  196. else
  197. {
  198. row.Add(dc.ColumnName, dr[dc.ColumnName].ToString());
  199. }
  200. }
  201. diclist.Add(row);
  202. }
  203. Dictionary<string, object> obj = new Dictionary<string, object>();
  204. obj.Add("code", 0);
  205. obj.Add("msg", "");
  206. obj.Add("count", 300);
  207. obj.Add("data", diclist);
  208. return Json(obj);
  209. }
  210. #endregion
  211. #region 导出Excel
  212. /// <summary>
  213. /// 导出Excel
  214. /// </summary>
  215. /// <returns></returns>
  216. public string ExportExcel(int Id)
  217. {
  218. var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
  219. Dictionary<string, string> dicVals = new Dictionary<string, string>();
  220. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  221. foreach(CustomQuerySub sub in subItems)
  222. {
  223. string sqlstr = sub.SqlContent;
  224. MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
  225. foreach(Match m in mcsub)
  226. {
  227. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  228. string fieldName = fieldData[0];
  229. sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
  230. }
  231. mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
  232. foreach(Match m in mcsub)
  233. {
  234. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  235. if(dicVals.ContainsKey(fieldName))
  236. {
  237. sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
  238. }
  239. }
  240. DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
  241. if(dtsub.Rows.Count > 0)
  242. {
  243. if(dtsub.Rows.Count > 1)
  244. {
  245. string val = "";
  246. foreach(DataRow dr in dtsub.Rows)
  247. {
  248. val += dr[0].ToString() + ",";
  249. }
  250. val = val.TrimEnd(',');
  251. dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
  252. }
  253. else
  254. {
  255. DataRow dr = dtsub.Rows[0];
  256. foreach(DataColumn dc in dtsub.Columns)
  257. {
  258. dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
  259. }
  260. }
  261. }
  262. }
  263. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  264. string sql = item.SqlContent;
  265. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  266. foreach(Match m in mc)
  267. {
  268. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  269. string fieldName = fieldData[0];
  270. sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
  271. }
  272. mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
  273. foreach(Match m in mc)
  274. {
  275. string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
  276. string str = fieldData[0];
  277. string oldStr = fieldData[1];
  278. string newStr = fieldData[2];
  279. str = str.Replace(oldStr, newStr);
  280. sql = sql.Replace(m.Value, str);
  281. }
  282. var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  283. string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"" + FileName + "\",\"MaxCount\":\"0\"}";
  284. RedisDbconn.Instance.AddList("ExportQueue", SendData);
  285. return "success";
  286. }
  287. #endregion
  288. #region 执行
  289. /// <summary>
  290. /// 执行
  291. /// </summary>
  292. /// <returns></returns>
  293. public string Excute(int Id)
  294. {
  295. var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
  296. Dictionary<string, string> dicVals = new Dictionary<string, string>();
  297. List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
  298. foreach(CustomQuerySub sub in subItems)
  299. {
  300. string sqlstr = sub.SqlContent;
  301. MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
  302. foreach(Match m in mcsub)
  303. {
  304. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  305. string fieldName = fieldData[0];
  306. sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
  307. }
  308. mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
  309. foreach(Match m in mcsub)
  310. {
  311. string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
  312. if(dicVals.ContainsKey(fieldName))
  313. {
  314. sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
  315. }
  316. }
  317. DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
  318. if(dtsub.Rows.Count > 0)
  319. {
  320. if(dtsub.Rows.Count > 1)
  321. {
  322. string val = "";
  323. foreach(DataRow dr in dtsub.Rows)
  324. {
  325. val += dr[0].ToString() + ",";
  326. }
  327. val = val.TrimEnd(',');
  328. dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
  329. }
  330. else
  331. {
  332. DataRow dr = dtsub.Rows[0];
  333. foreach(DataColumn dc in dtsub.Columns)
  334. {
  335. dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
  336. }
  337. }
  338. }
  339. }
  340. CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
  341. string sql = item.SqlContent;
  342. MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
  343. foreach(Match m in mc)
  344. {
  345. string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
  346. string fieldName = fieldData[0];
  347. sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
  348. }
  349. mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
  350. foreach(Match m in mc)
  351. {
  352. string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
  353. string str = fieldData[0];
  354. string oldStr = fieldData[1];
  355. string newStr = fieldData[2];
  356. str = str.Replace(oldStr, newStr);
  357. sql = sql.Replace(m.Value, str);
  358. }
  359. var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  360. string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"执行\",\"MaxCount\":\"" + item.ExcuteFlag + "\"}";
  361. RedisDbconn.Instance.AddList("ExportQueue", SendData);
  362. return "success";
  363. }
  364. #endregion
  365. }
  366. }