Procházet zdrojové kódy

完善自定义查询,增加执行sql操作

lcl před 2 roky
rodič
revize
69720abb41

+ 2 - 0
Areas/Admin/Controllers/MainServer/CustomQueryController.cs

@@ -104,6 +104,7 @@ namespace MySystem.Areas.Admin.Controllers
             Fields.Add("SqlContent", data.SqlContent); //sql语句
             Fields.Add("Title", data.Title); //标题
             Fields.Add("AdminNames", data.AdminNames); //后台账号
+            Fields.Add("ExcuteFlag", data.ExcuteFlag); //是否执行
 
             Fields.Add("SeoTitle", data.SeoTitle);
             Fields.Add("SeoKeyword", data.SeoKeyword);
@@ -150,6 +151,7 @@ namespace MySystem.Areas.Admin.Controllers
             Fields.Add("SqlContent", data.SqlContent); //sql语句
             Fields.Add("Title", data.Title); //标题
             Fields.Add("AdminNames", data.AdminNames); //后台账号
+            Fields.Add("ExcuteFlag", data.ExcuteFlag); //是否执行
 
             Fields.Add("SeoTitle", data.SeoTitle);
             Fields.Add("SeoKeyword", data.SeoKeyword);

+ 213 - 1
Areas/Admin/Controllers/MainServer/CustomQueryDoController.cs

@@ -55,6 +55,22 @@ namespace MySystem.Areas.Admin.Controllers
                     query.Add(fieldName, Title);
                 }
             }
+            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+            foreach(CustomQuerySub sub in subItems)
+            {
+                sql = sub.SqlContent;
+                mc = Regex.Matches(sql, @"\$\{.*?\}\$");
+                foreach(Match m in mc)
+                {
+                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                    string fieldName = fieldData[0];
+                    string Title = fieldData[1];
+                    if(!query.ContainsKey(fieldName))
+                    {
+                        query.Add(fieldName, Title);
+                    }
+                }
+            }
             ViewBag.query = query;
 
             string[] fieldList = item.SeoDescription.Split(',');
@@ -78,6 +94,52 @@ namespace MySystem.Areas.Admin.Controllers
         /// <returns></returns>
         public JsonResult IndexData(int Id, int page = 1, int limit = 30)
         {
+            Dictionary<string, string> dicVals = new Dictionary<string, string>();
+            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+            foreach(CustomQuerySub sub in subItems)
+            {
+                string sqlstr = sub.SqlContent;
+                MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
+                foreach(Match m in mcsub)
+                {
+                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                    string fieldName = fieldData[0];
+                    sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
+                }
+
+                mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
+                foreach(Match m in mcsub)
+                {
+                    string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                    if(dicVals.ContainsKey(fieldName))
+                    {
+                        sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
+                    }
+                }
+
+                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
+                if(dtsub.Rows.Count > 0)
+                {
+                    if(dtsub.Rows.Count > 1)
+                    {
+                        string val = "";
+                        foreach(DataRow dr in dtsub.Rows)
+                        {
+                            val += dr[0].ToString() + ",";
+                        }
+                        val = val.TrimEnd(',');
+                        dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
+                    }
+                    else
+                    {
+                        DataRow dr = dtsub.Rows[0];
+                        foreach(DataColumn dc in dtsub.Columns)
+                        {
+                            dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
+                        }
+                    }
+                }
+            }
             CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
             string sql = item.SqlContent;
             MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
@@ -87,6 +149,16 @@ namespace MySystem.Areas.Admin.Controllers
                 string fieldName = fieldData[0];
                 sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
             }
+            mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
+                string str = fieldData[0];
+                string oldStr = fieldData[1];
+                string newStr = fieldData[2];
+                str = str.Replace(oldStr, newStr);
+                sql = sql.Replace(m.Value, str);
+            }
             if(page > 1)
             {
                 int skip = (page - 1) * limit;
@@ -100,7 +172,7 @@ namespace MySystem.Areas.Admin.Controllers
             List<Dictionary<string, string>> diclist = new List<Dictionary<string, string>>();
             foreach(DataRow dr in dt.Rows)
             {
-                Dictionary<string, string> row = new Dictionary<string, string>();   
+                Dictionary<string, string> row = new Dictionary<string, string>();
                 foreach(DataColumn dc in dt.Columns)
                 {                 
                     if (dc.DataType == typeof(DateTime))
@@ -133,6 +205,53 @@ namespace MySystem.Areas.Admin.Controllers
         public string ExportExcel(int Id)
         {
             var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
+
+            Dictionary<string, string> dicVals = new Dictionary<string, string>();
+            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+            foreach(CustomQuerySub sub in subItems)
+            {
+                string sqlstr = sub.SqlContent;
+                MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
+                foreach(Match m in mcsub)
+                {
+                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                    string fieldName = fieldData[0];
+                    sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
+                }
+
+                mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
+                foreach(Match m in mcsub)
+                {
+                    string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                    if(dicVals.ContainsKey(fieldName))
+                    {
+                        sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
+                    }
+                }
+
+                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
+                if(dtsub.Rows.Count > 0)
+                {
+                    if(dtsub.Rows.Count > 1)
+                    {
+                        string val = "";
+                        foreach(DataRow dr in dtsub.Rows)
+                        {
+                            val += dr[0].ToString() + ",";
+                        }
+                        val = val.TrimEnd(',');
+                        dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
+                    }
+                    else
+                    {
+                        DataRow dr = dtsub.Rows[0];
+                        foreach(DataColumn dc in dtsub.Columns)
+                        {
+                            dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
+                        }
+                    }
+                }
+            }
             CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
             string sql = item.SqlContent;
             MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
@@ -142,6 +261,16 @@ namespace MySystem.Areas.Admin.Controllers
                 string fieldName = fieldData[0];
                 sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
             }
+            mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
+                string str = fieldData[0];
+                string oldStr = fieldData[1];
+                string newStr = fieldData[2];
+                str = str.Replace(oldStr, newStr);
+                sql = sql.Replace(m.Value, str);
+            }
             var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
             string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"" + FileName + "\",\"MaxCount\":\"0\"}";
             RedisDbconn.Instance.AddList("ExportQueue", SendData);
@@ -150,5 +279,88 @@ namespace MySystem.Areas.Admin.Controllers
 
         #endregion
 
+        #region 执行
+
+        /// <summary>
+        /// 执行
+        /// </summary>
+        /// <returns></returns>
+        public string Excute(int Id)
+        {
+            var sysAdmin = bsdb.SysAdmin.FirstOrDefault(m => m.AdminName == SysUserName && m.Status > -1);
+
+            Dictionary<string, string> dicVals = new Dictionary<string, string>();
+            List<CustomQuerySub> subItems = db.CustomQuerySub.Where(m => m.ParentId == Id).ToList();
+            foreach(CustomQuerySub sub in subItems)
+            {
+                string sqlstr = sub.SqlContent;
+                MatchCollection mcsub = Regex.Matches(sqlstr, @"\$\{.*?\}\$");
+                foreach(Match m in mcsub)
+                {
+                    string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                    string fieldName = fieldData[0];
+                    sqlstr = sqlstr.Replace(m.Value, Request.Query[fieldName].ToString());
+                }
+
+                mcsub = Regex.Matches(sqlstr, @"\#\{.*?\}\#");
+                foreach(Match m in mcsub)
+                {
+                    string fieldName = m.Value.Replace("#{", "").Replace("}#", "");
+                    if(dicVals.ContainsKey(fieldName))
+                    {
+                        sqlstr = sqlstr.Replace(m.Value, dicVals[fieldName]);
+                    }
+                }
+
+                DataTable dtsub = CustomerSqlConn.dtable(sqlstr, MysqlConn.ReadSqlConnStr);
+                if(dtsub.Rows.Count > 0)
+                {
+                    if(dtsub.Rows.Count > 1)
+                    {
+                        string val = "";
+                        foreach(DataRow dr in dtsub.Rows)
+                        {
+                            val += dr[0].ToString() + ",";
+                        }
+                        val = val.TrimEnd(',');
+                        dicVals.Add(sub.Alias + "_" + dtsub.Columns[0].ColumnName, val);
+                    }
+                    else
+                    {
+                        DataRow dr = dtsub.Rows[0];
+                        foreach(DataColumn dc in dtsub.Columns)
+                        {
+                            dicVals.Add(sub.Alias + "_" + dc.ColumnName, dr[dc.ColumnName].ToString());
+                        }
+                    }
+                }
+            }
+            CustomQuery item = db.CustomQuery.FirstOrDefault(m => m.Id == Id) ?? new CustomQuery();
+            string sql = item.SqlContent;
+            MatchCollection mc = Regex.Matches(sql, @"\$\{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("${", "").Replace("}$", "").Split('|');
+                string fieldName = fieldData[0];
+                sql = sql.Replace(m.Value, Request.Query[fieldName].ToString());
+            }
+            mc = Regex.Matches(sql, @"\$\replace{.*?\}\$");
+            foreach(Match m in mc)
+            {
+                string[] fieldData = m.Value.Replace("$replace{", "").Replace("}$", "").Split('|');
+                string str = fieldData[0];
+                string oldStr = fieldData[1];
+                string newStr = fieldData[2];
+                str = str.Replace(oldStr, newStr);
+                sql = sql.Replace(m.Value, str);
+            }
+            var FileName = item.Title + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+            string SendData = "{\"Operater\":\"" + sysAdmin.Id + "\",\"SqlString\":\"" + sql + "\",\"FileName\":\"执行\",\"MaxCount\":\"" + item.ExcuteFlag + "\"}";
+            RedisDbconn.Instance.AddList("ExportQueue", SendData);
+            return "success";
+        }
+
+        #endregion
+
     }
 }

+ 7 - 0
Areas/Admin/Views/MainServer/CustomQuery/Add.cshtml

@@ -55,6 +55,13 @@
                                     lay-verify="" placeholder="请输入后台账号"></textarea>
                             </div>
                         </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">是否执行(条数/次)</label>
+                            <div class="layui-input-inline">
+                                <input class="layui-input" type="text" id="ExcuteFlag" name="ExcuteFlag" maxlength="10" autocomplete="off"
+                                    placeholder="请输入执行条数">
+                            </div>
+                        </div>
 
                     </div>
 

+ 8 - 0
Areas/Admin/Views/MainServer/CustomQuery/Edit.cshtml

@@ -59,6 +59,14 @@
                                     lay-verify="" placeholder="请输入后台账号">@editData.AdminNames</textarea>
                             </div>
                         </div>
+                        <div class="layui-form-item">
+                            <label class="layui-form-label">是否执行(条数/次)</label>
+                            <div class="layui-input-inline">
+                                <input class="layui-input" type="text" id="ExcuteFlag" name="ExcuteFlag"
+                                    value="@editData.ExcuteFlag" maxlength="10" autocomplete="off"
+                                    placeholder="请输入执行条数">
+                            </div>
+                        </div>
 
                     </div>
 

+ 1 - 0
Areas/Admin/Views/MainServer/CustomQueryDo/Index.cshtml

@@ -61,6 +61,7 @@
             <div class="layui-card-body">
                 <div style="padding-bottom: 10px;">
                     <button class="layui-btn" data-type="ExportExcel"><i class="layui-icon layui-icon-export layuiadmin-button-btn"></i>导出</button>
+                    <button class="layui-btn" data-type="Excute"><i class="layui-icon layui-icon-add-1 layuiadmin-button-btn"></i>执行</button>
                 </div>
                 
                 <table id="LAY-list-manage" lay-filter="LAY-list-manage"></table>

+ 1 - 0
Models/CustomQuery.cs

@@ -20,5 +20,6 @@ namespace MySystem.Models
         public string AdminNames { get; set; }
         public string Title { get; set; }
         public string SqlContent { get; set; }
+        public int ExcuteFlag { get; set; }
     }
 }

+ 4 - 0
Models/WebCMSEntities.cs

@@ -2768,6 +2768,10 @@ namespace MySystem.Models
                 entity.Property(e => e.Version)
                     .HasColumnType("int(11)")
                     .HasComment("版本号");
+
+                entity.Property(e => e.ExcuteFlag)
+                    .HasColumnType("int(11)")
+                    .HasComment("是否执行");
             });
 
             modelBuilder.Entity<CustomQuerySub>(entity =>

+ 31 - 0
wwwroot/layuiadmin/modules_main/CustomQueryDo_Admin.js

@@ -342,6 +342,37 @@ layui.config({
                 }
             });
         }
+        , Excute: function () {
+            if(!exportFlag) {
+                layer.msg('请勿重复操作');
+                return;
+            }
+            exportFlag = false;
+            resetExportFlag();
+            var userdata = '';
+            $(".layuiadmin-card-header-auto input").each(function (i) {
+                userdata += $(this).attr('name') + '=' + encodeURIComponent($(this).val()) + '&';
+            });
+            $(".layuiadmin-card-header-auto select").each(function (i) {
+                userdata += $(this).attr('name') + '=' + encodeURIComponent($(this).val()) + '&';
+            });
+            $.ajax({
+                type: "GET",
+                url: "/Admin/CustomQueryDo/Excute?r=" + Math.random(1),
+                data: userdata,
+                dataType: "text",
+                success: function (data) {
+                    if (data == "success") {
+                        layer.msg('提交成功,请等待执行结果', {
+                            time: 3000
+                        }, function () {
+                        });
+                    } else {
+                        layer.msg(data);
+                    }
+                }
+            });
+        }
         , Open: function () {
             var checkStatus = table.checkStatus('LAY-list-manage')
                 , data = checkStatus.data; //得到选中的数据