using Common; using Infrastructure; using LitJson; using Microsoft.Extensions.Localization; using Model; using NuGet.Packaging; using Services; namespace Util { public class PrizeDo { public static string batchNo = ""; //发奖入口 public static void sendPrize(string content) { batchNo = DateTime.Now.ToString("yyyyMMddHHmmssfff") + Function.get_Random(3); int projectId = 5; string priObjString = prizeObject(projectId, content); if(!string.IsNullOrEmpty(priObjString)) { string[] priObjData = priObjString.Split('|'); string priObj = priObjData[0]; string priListIds = priObjData[1]; prizeSend(projectId, priListIds, priObj, content); } } //接收入参 public static Dictionary getRequestParams(int projectId, string content) { Dictionary dic = new Dictionary(); JsonData jsonData = JsonMapper.ToObject(content); var paramService = App.GetService(); var paramList = paramService.GetList(m => m.projectId == projectId); foreach(var param in paramList) { dic.Add(param.fieldEnName, jsonData[param.fieldEnName].ToString()); } return dic; } //数据库链接 public static SqlSugarClient initDb(int id) { var databaseSetService = App.GetService(); var connectionString = databaseSetService.GetFirst(m => m.id == id); string server = connectionString.ipAddress; int port = connectionString.port; string user = connectionString.userId; string password = connectionString.password; string database = connectionString.databaseName; var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=" + server + ";port=" + port + ";user=" + user + ";password=" + password + ";database=" + database + ";charset=utf8;", DbType = DbType.MySql, IsAutoCloseConnection = true, }); return db; } //查询条件匹配数据 public static Dictionary condition(int projectId, string content) { Dictionary dic = new Dictionary(); var queryTableService = App.GetService(); var queryFieldService = App.GetService(); var returnFieldService = App.GetService(); //查询表 var queryTables = queryTableService.GetList(m => m.projectId == projectId); foreach(var queryTable in queryTables) { //查询返回字段 string fields = ""; var returnFields = returnFieldService.GetList(m => m.queryTableId == queryTable.id); foreach(var returnField in returnFields) { fields += returnField.fieldEnName + " " + queryTable.tableEnName + "_" + returnField.fieldEnName + ","; } fields = fields.TrimEnd(','); //查询匹配条件 string condi = ""; var queryFields = queryFieldService.GetList(m => m.queryTableId == queryTable.id); foreach(var queryField in queryFields) { string fieldEnName = queryField.fieldEnName; string fieldQueryKind = queryField.fieldQueryKind; string fieldQueryModel = queryField.fieldQueryModel; string fieldQueryValue = queryField.fieldQueryValue; string fieldQueryValueType = queryField.fieldQueryValueType; if(fieldQueryKind == "1") //模糊匹配 { condi += " and " + fieldEnName + " like "; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); condi += "'%" + req[fieldQueryValue] + "%'"; } else if(fieldQueryModel == "fixed_value") { condi += "'%" + GetExpressionVal(fieldQueryValue) + "%'"; } else if(fieldQueryModel == "db_field") { condi += "'%" + GetDbExpressionVal(fieldQueryValue) + "%'"; } } else if(fieldQueryKind == "2") //精确匹配 { if(fieldQueryValue == "null" && fieldQueryValueType == "text") condi += " and " + fieldEnName + " is null"; else { condi += " and " + fieldEnName + "="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { val = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } } else if(fieldQueryKind == "5" || fieldQueryKind == "6") //数组匹配/排除 { if(fieldQueryKind == "5") condi += " and " + fieldEnName + " in ("; else if(fieldQueryKind == "6") condi += " and " + fieldEnName + " not in ("; string val = ""; string[] valList = fieldQueryValue.Split(','); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + req[sub] + "',"; } else { val += req[sub] + ","; } } } else if(fieldQueryModel == "fixed_value") { foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + GetExpressionVal(sub) + "',"; } else { val += GetExpressionVal(sub) + ","; } } } else if(fieldQueryModel == "db_field") { foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + GetDbExpressionVal(sub) + "',"; } else { val += GetDbExpressionVal(sub) + ","; } } } val = val.TrimEnd(','); condi += val + ")"; } else if(fieldQueryKind == "3") //范围匹配 { string[] val = fieldQueryValue.Split(':'); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">=" + req[val[0]]; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<=" + req[val[1]]; } else { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">='" + req[val[0]] + "'"; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<='" + req[val[1]] + "'"; } } else if(fieldQueryModel == "fixed_value") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + GetExpressionVal(val[0]) + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + GetExpressionVal(val[1]) + "'"; } } else if(fieldQueryModel == "db_field") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + GetDbExpressionVal(val[0]) + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + GetDbExpressionVal(val[1]) + "'"; } } } else if(fieldQueryKind == "4") //取反匹配 { if(fieldQueryValue == "null" && fieldQueryValueType == "text") condi += " and " + fieldEnName + " is not null"; else { condi += " and " + fieldEnName + "!="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { val = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } } } var db = initDb(queryTable.databaseId); string sql = "select " + fields + " from " + queryTable.tableEnName + " where 1=1" + condi; var items = db.Ado.GetDataTable(sql); if(items.Rows.Count > 0) { foreach(System.Data.DataColumn item in items.Columns) { dic.Add(item.ColumnName, items.Rows[0][item.ColumnName].ToString()); } } } return dic; } //奖励发放对象 public static string prizeObject(int projectId, string content) { Dictionary dic = new Dictionary(); var prizeObjectTableService = App.GetService(); var prizeObjectFieldService = App.GetService(); //查询表 var prizeObjectTable = prizeObjectTableService.GetFirst(m => m.projectId == projectId) ?? new PriPrizeObjectTable(); //查询返回字段 string field = prizeObjectTable.selectField; //查询匹配条件 string condi = ""; var queryFields = prizeObjectFieldService.GetList(m => m.objectTableId == prizeObjectTable.id); foreach(var queryField in queryFields) { string fieldEnName = queryField.fieldEnName; string fieldQueryKind = queryField.fieldQueryKind; string fieldQueryModel = queryField.fieldQueryModel; string fieldQueryValue = queryField.fieldQueryValue; string fieldQueryValueType = queryField.fieldQueryValueType; if(fieldQueryKind == "1") //模糊匹配 { condi += " and " + fieldEnName + " like "; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); condi += "'%" + req[fieldQueryValue] + "%'"; } else if(fieldQueryModel == "fixed_value") { condi += "'%" + GetExpressionVal(fieldQueryValue) + "%'"; } else if(fieldQueryModel == "db_field") { condi += "'%" + GetDbExpressionVal(fieldQueryValue) + "%'"; } } else if(fieldQueryKind == "2") //精确匹配 { condi += " and " + fieldEnName + "="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { val = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } else if(fieldQueryKind == "5" || fieldQueryKind == "6") //数组匹配/排除 { if(fieldQueryKind == "5") condi += " and " + fieldEnName + " in ("; else if(fieldQueryKind == "6") condi += " and " + fieldEnName + " not in ("; string val = ""; string[] valList = fieldQueryValue.Split(','); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + req[sub] + "',"; } else { val += req[sub] + ","; } } } else if(fieldQueryModel == "fixed_value") { foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + GetExpressionVal(sub) + "',"; } else { val += GetExpressionVal(sub) + ","; } } } else if(fieldQueryModel == "db_field") { foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + GetDbExpressionVal(sub) + "',"; } else { val += GetDbExpressionVal(sub) + ","; } } } val = val.TrimEnd(','); condi += val + ")"; } else if(fieldQueryKind == "3") //范围匹配 { string[] val = fieldQueryValue.Split(':'); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">=" + req[val[0]]; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<=" + req[val[1]]; } else { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">='" + req[val[0]] + "'"; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<='" + req[val[1]] + "'"; } } else if(fieldQueryModel == "fixed_value") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + GetExpressionVal(val[0]) + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + GetExpressionVal(val[1]) + "'"; } } else if(fieldQueryModel == "db_field") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + GetDbExpressionVal(val[0]) + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + GetDbExpressionVal(val[1]) + "'"; } } } else if(fieldQueryKind == "4") //取反匹配 { condi += " and " + fieldEnName + "!="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { val = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } } var db = initDb(prizeObjectTable.databaseId); var item = db.Ado.GetScalar("select " + field + " from " + prizeObjectTable.tableEnName + " where 1=1" + condi); if(item != null) { return item.ToString() + "|" + prizeObjectTable.prizeListIds; } return ""; } //奖励列表 public static List prizeList(int projectId, string prizeIds) { List ids = Tools.SpitIntArrary(prizeIds, ',').ToList(); var priListService = App.GetService(); var priList = priListService.GetList(m => m.projectId == projectId && ids.Contains(m.id)).ToList(); return priList; } //奖励发放 public static void prizeSend(int projectId, string prizeIds, string prizeObjectId, string content) { var priList = prizeList(projectId, prizeIds); foreach(var sub in priList) { var recursionFlag = sub.recursionFlag; //是否递归 if(recursionFlag) { var loopSetService = App.GetService(); var recursionStartTableService = App.GetService(); var loopSet = loopSetService.GetFirst(m => m.listId == sub.id) ?? new PriLoopSet(); var recursionStartTable = recursionStartTableService.GetFirst(m => m.listId == sub.id) ?? new PriRecursionStartTable(); var tableEnName = loopSet.tableEnName; //递归查询表 var parentField = loopSet.parentField; //父字段 var sonField = loopSet.sonField; //子字段 var afterPrizeFlag = loopSet.afterPrizeFlag; //发奖后是否继续 var db = initDb(recursionStartTable.databaseId); string objId = prizeObjectId; bool op = true; while(!string.IsNullOrEmpty(objId) && objId != "0" && op) { if(loopCondition(projectId, sub, objId, content)) { prizeSendDo(projectId, sub, objId, content); op = afterPrizeFlag; } var parent = db.Ado.GetScalar("select " + parentField + " from " + tableEnName + " where " + sonField + "=" + objId); if(parent != null) { objId = parent.ToString(); } } } else { prizeSendDo(projectId, sub, prizeObjectId, content); } } } public static void prizeSendDo(int projectId, PriList sub, string prizeObjectId, string content) { var recordService = App.GetService(); var conditionService = App.GetService(); var returnFieldService = App.GetService(); var queryTableService = App.GetService(); var amountSetService = App.GetService(); //查询匹配条件 var condiDic = condition(projectId, content); var prizeSourceField = sub.prizeSourceField; //奖励金额来源字段(对应条件匹配返回字段) var prizePercent = sub.prizePercent; //奖励比例 var prizeAmount = sub.prizeAmount; //奖励固定值 var prizeContent = sub.prizeContent; //奖励内容 var conditionMode = sub.conditionMode; //条件模式 var recursionFlag = sub.recursionFlag; //是否递归 var conditions = conditionService.GetList(m => m.listId == sub.id); int allCount = conditions.Count; //所有奖励条件数 int passCount = 0; //通过条件数 foreach(var condition in conditions) { var returnFieldId = condition.returnFieldId; //条件返回字段 var fieldQueryKind = condition.fieldQueryKind; //匹配条件 var fieldQueryModel = condition.fieldQueryModel; //匹配方式 var fieldQueryValue = condition.fieldQueryValue; //匹配值 var fieldQueryValueType = condition.fieldQueryValueType; //匹配值类型 var returnField = returnFieldService.GetFirst(m => m.id == returnFieldId); var queryTable = queryTableService.GetFirst(m => m.id == returnField.queryTableId); var checkObj = condiDic.ContainsKey(queryTable.tableEnName + "_" + returnField.fieldEnName) ? condiDic[queryTable.tableEnName + "_" + returnField.fieldEnName] : "0"; var checkVal = fieldQueryValue; if(fieldQueryKind == "1") //模糊匹配 { if(fieldQueryValueType == "text") { if(checkObj.ToString().Contains(GetExpressionVal(checkVal))) passCount += 1; } } else if(fieldQueryKind == "2") //精确匹配 { if(fieldQueryValueType == "int") { if(int.Parse(Function.CheckInt(checkObj.ToString())) == int.Parse(Function.CheckNum(checkVal))) passCount += 1; } else if(fieldQueryValueType == "number") { if(decimal.Parse(Function.CheckNum(checkObj.ToString())) == decimal.Parse(Function.CheckNum(checkVal))) passCount += 1; } else { if(checkObj.ToString() == GetExpressionVal(checkVal)) passCount += 1; } } else if(fieldQueryKind == "3") //范围匹配 { string[] val = checkVal.Split(':'); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(req[val[0]]) && !string.IsNullOrEmpty(req[val[1]]) && (decimal)checkObj >= decimal.Parse(Function.CheckNum(req[val[0]])) && (decimal)checkObj <= decimal.Parse(Function.CheckNum(req[val[1]]))) passCount += 1; else if(!string.IsNullOrEmpty(req[val[0]]) && string.IsNullOrEmpty(req[val[1]]) && (decimal)checkObj >= decimal.Parse(Function.CheckNum(req[val[0]]))) passCount += 1; else if(string.IsNullOrEmpty(req[val[0]]) && !string.IsNullOrEmpty(req[val[1]]) && (decimal)checkObj <= decimal.Parse(Function.CheckNum(req[val[1]]))) passCount += 1; } else if(fieldQueryValueType == "int") { if(!string.IsNullOrEmpty(req[val[0]]) && !string.IsNullOrEmpty(req[val[1]]) && (int)checkObj >= int.Parse(Function.CheckInt(req[val[0]])) && (int)checkObj <= int.Parse(Function.CheckInt(req[val[1]]))) passCount += 1; else if(!string.IsNullOrEmpty(req[val[0]]) && string.IsNullOrEmpty(req[val[1]]) && (int)checkObj >= int.Parse(Function.CheckInt(req[val[0]]))) passCount += 1; else if(string.IsNullOrEmpty(req[val[0]]) && !string.IsNullOrEmpty(req[val[1]]) && (int)checkObj <= int.Parse(Function.CheckInt(req[val[1]]))) passCount += 1; } else if(fieldQueryValueType.StartsWith("date")) { if(!string.IsNullOrEmpty(req[val[0]]) && !string.IsNullOrEmpty(req[val[1]]) && (DateTime)checkObj >= DateTime.Parse(req[val[0]]) && (DateTime)checkObj <= DateTime.Parse(req[val[1]])) passCount += 1; else if(!string.IsNullOrEmpty(req[val[0]]) && string.IsNullOrEmpty(req[val[1]]) && (DateTime)checkObj >= DateTime.Parse(req[val[0]])) passCount += 1; else if(string.IsNullOrEmpty(req[val[0]]) && !string.IsNullOrEmpty(req[val[1]]) && (DateTime)checkObj <= DateTime.Parse(req[val[1]])) passCount += 1; } } else if(fieldQueryModel == "fixed_value") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0]) && !string.IsNullOrEmpty(val[1]) && (decimal)checkObj >= decimal.Parse(Function.CheckNum(val[0])) && decimal.Parse(Function.CheckNum(checkObj.ToString())) <= decimal.Parse(Function.CheckNum(val[1]))) passCount += 1; else if(!string.IsNullOrEmpty(val[0]) && string.IsNullOrEmpty(val[1]) && decimal.Parse(Function.CheckNum(checkObj.ToString())) >= decimal.Parse(Function.CheckNum(val[0]))) passCount += 1; else if(string.IsNullOrEmpty(val[0]) && !string.IsNullOrEmpty(val[1]) && decimal.Parse(Function.CheckNum(checkObj.ToString())) <= decimal.Parse(Function.CheckNum(val[1]))) passCount += 1; } else if(fieldQueryValueType == "int") { if(!string.IsNullOrEmpty(val[0]) && !string.IsNullOrEmpty(val[1]) && (int)checkObj >= int.Parse(Function.CheckInt(val[0])) && int.Parse(Function.CheckInt(checkObj.ToString())) <= int.Parse(Function.CheckInt(val[1]))) passCount += 1; else if(!string.IsNullOrEmpty(val[0]) && string.IsNullOrEmpty(val[1]) && int.Parse(Function.CheckInt(checkObj.ToString())) >= int.Parse(Function.CheckInt(val[0]))) passCount += 1; else if(string.IsNullOrEmpty(val[0]) && !string.IsNullOrEmpty(val[1]) && int.Parse(Function.CheckInt(checkObj.ToString())) <= int.Parse(Function.CheckInt(val[1]))) passCount += 1; } else if(fieldQueryValueType.StartsWith("date")) { if(!string.IsNullOrEmpty(val[0]) && !string.IsNullOrEmpty(val[1]) && (DateTime)checkObj >= DateTime.Parse(GetExpressionVal(val[0])) && (DateTime)checkObj <= DateTime.Parse(GetExpressionVal(val[1]))) passCount += 1; else if(!string.IsNullOrEmpty(val[0]) && string.IsNullOrEmpty(val[1]) && (DateTime)checkObj >= DateTime.Parse(GetExpressionVal(val[0]))) passCount += 1; else if(string.IsNullOrEmpty(val[0]) && !string.IsNullOrEmpty(val[1]) && (DateTime)checkObj <= DateTime.Parse(GetExpressionVal(val[1]))) passCount += 1; } } } else if(fieldQueryKind == "4") //取反匹配 { if(fieldQueryValueType == "int") { if((int)checkObj != int.Parse(Function.CheckInt(checkVal))) passCount += 1; } else if(fieldQueryValueType == "number") { if((decimal)checkObj != decimal.Parse(Function.CheckNum(checkVal))) passCount += 1; } else if(fieldQueryValueType == "text") { if(checkObj.ToString() != GetExpressionVal(checkVal)) passCount += 1; } } } bool op = false; if(conditionMode == "all" && passCount == allCount) op = true; else if(conditionMode == "one" && passCount == 1) op = true; if(op) //满足条件 { decimal number = 0; if(prizeSourceField.Contains("/")) { number = decimal.Parse(prizeSourceField.Split('/')[1]); prizeSourceField = prizeSourceField.Split('/')[0]; } string prizeSourceData = condiDic.ContainsKey(prizeSourceField) ? condiDic[prizeSourceField].ToString() : "0"; if(prizeSourceField.Contains("/") && number > 0) { decimal prizeSourceDataNum = decimal.Parse(prizeSourceData) / number; prizeSourceData = prizeSourceDataNum.ToString("f2"); } decimal prizeAmt = 0; var amountSet = amountSetService.GetFirst(m => m.listId == sub.id && m.prizeSourceField == prizeSourceData); if(amountSet != null) { prizePercent = amountSet.prizePercent; prizeAmount = amountSet.prizeAmount; } if(prizePercent > 0) prizeAmt += decimal.Parse(Function.CheckNum(prizeSourceData)) * prizePercent; if(prizeAmount > 0) prizeAmt += prizeAmount; if(prizeAmt > 0) { var req = getRequestParams(projectId, content); var requestParamField = req[sub.requestParamField]; var sendFlag = recordService.Any(m => m.prizeObjId == prizeObjectId && m.listId == sub.id && m.requestParamField == requestParamField); if(!sendFlag) { recordService.Add(new PriRecord() { createDate = DateTime.Now, projectId = projectId, listId = sub.id, prizeAmount = prizeAmt, prizeObjId = prizeObjectId, requestParamField = requestParamField, batchNo = batchNo, }); // prizeToDatabase(projectId, content); //入库 } } } } //递归条件判断 public static bool loopCondition(int projectId, PriList sub, string objId, string content) { Dictionary dic = new Dictionary(); var queryTableService = App.GetService(); var queryFieldService = App.GetService(); int passCount = 0; //查询表 var queryTables = queryTableService.GetList(m => m.listId == sub.id); int allCount = queryTables.Count; foreach(var queryTable in queryTables) { //查询返回字段 string fields = "1"; //查询匹配条件 string condi = ""; var queryFields = queryFieldService.GetList(m => m.objectTableId == queryTable.id); foreach(var queryField in queryFields) { string fieldEnName = queryField.fieldEnName; string fieldQueryKind = queryField.fieldQueryKind; string fieldQueryModel = queryField.fieldQueryModel; string fieldQueryValue = queryField.fieldQueryValue; if(fieldQueryModel == "loop_field") fieldQueryValue = objId; string fieldQueryValueType = queryField.fieldQueryValueType; if(fieldQueryKind == "1") //模糊匹配 { condi += " and " + fieldEnName + " like "; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); condi += "'%" + req[fieldQueryValue] + "%'"; } else if(fieldQueryModel == "fixed_value") { condi += "'%" + GetExpressionVal(fieldQueryValue) + "%'"; } else if(fieldQueryModel == "db_field") { condi += "'%" + GetDbExpressionVal(fieldQueryValue) + "%'"; } } else if(fieldQueryKind == "2") //精确匹配 { condi += " and " + fieldEnName + "="; string val = fieldQueryValue; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { val = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } else if(fieldQueryKind == "5" || fieldQueryKind == "6") //数组匹配/排除 { if(fieldQueryKind == "5") condi += " and " + fieldEnName + " in ("; else if(fieldQueryKind == "6") condi += " and " + fieldEnName + " not in ("; string val = ""; string[] valList = fieldQueryValue.Split(','); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); foreach(string subval in valList) { if(fieldQueryValueType == "text") { val += "'" + req[subval] + "',"; } else { val += req[subval] + ","; } } } else if(fieldQueryModel == "fixed_value") { foreach(string subval in valList) { if(fieldQueryValueType == "text") { val += "'" + GetExpressionVal(subval) + "',"; } else { val += GetExpressionVal(subval) + ","; } } } else if(fieldQueryModel == "db_field") { foreach(string subval in valList) { if(fieldQueryValueType == "text") { val += "'" + GetDbExpressionVal(subval) + "',"; } else { val += GetDbExpressionVal(subval) + ","; } } } val = val.TrimEnd(','); condi += val + ")"; } else if(fieldQueryKind == "3") //范围匹配 { string[] val = fieldQueryValue.Split(':'); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">=" + req[val[0]]; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<=" + req[val[1]]; } else { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">='" + req[val[0]] + "'"; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<='" + req[val[1]] + "'"; } } else if(fieldQueryModel == "fixed_value") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + GetExpressionVal(val[0]) + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + GetExpressionVal(val[1]) + "'"; } } else if(fieldQueryModel == "db_field") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + GetDbExpressionVal(val[0]) + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + GetDbExpressionVal(val[1]) + "'"; } } } else if(fieldQueryKind == "4") //取反匹配 { condi += " and " + fieldEnName + "!="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { val = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } } var db = initDb(queryTable.databaseId); var item = db.Ado.GetScalar("select " + fields + " from " + queryTable.tableEnName + " where 1=1" + condi); if(item != null) passCount += 1; } bool op = false; if(sub.conditionMode == "all" && passCount == allCount) op = true; else if(sub.conditionMode == "one" && passCount == 1) op = true; return op; } //奖励入库 public static void prizeToDatabase(int projectId, string content) { var prizeInTableService = App.GetService(); var prizeInFieldService = App.GetService(); var prizeInQueryFieldService = App.GetService(); //入库表 var prizeInTables = prizeInTableService.GetList(m => m.projectId == projectId); foreach(var prizeInTable in prizeInTables) { var db = initDb(prizeInTable.databaseId); Dictionary doFields = new Dictionary(); //入库字段 var prizeInFields = prizeInFieldService.GetList(m => m.inTableId == prizeInTable.id); foreach(var prizeInField in prizeInFields) { string fieldEnName = prizeInField.fieldEnName; string fieldQueryModel = prizeInField.fieldQueryModel; string fieldQueryValue = prizeInField.fieldQueryValue; string fieldQueryValueType = prizeInField.fieldQueryValueType; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); fieldQueryValue = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { fieldQueryValue = GetExpressionVal(fieldQueryValue); } else if(fieldQueryModel == "db_field") { fieldQueryValue = GetDbExpressionVal(fieldQueryValue); } if(fieldQueryValueType == "text") doFields.Add(fieldEnName, fieldQueryValue); if(fieldQueryValueType == "int") doFields.Add(fieldEnName, int.Parse(fieldQueryValue)); if(fieldQueryValueType == "number") doFields.Add(fieldEnName, decimal.Parse(fieldQueryValue)); if(fieldQueryValueType == "datetime") doFields.Add(fieldEnName, DateTime.Parse(fieldQueryValue)); if(fieldQueryValueType == "bool") doFields.Add(fieldEnName, bool.Parse(fieldQueryValue)); } //查询匹配条件 string condi = ""; var queryFields = prizeInQueryFieldService.GetList(m => m.inTableId == prizeInTable.id); foreach(var queryField in queryFields) { string fieldEnName = queryField.fieldEnName; string fieldQueryKind = queryField.fieldQueryKind; string fieldQueryModel = queryField.fieldQueryModel; string fieldQueryValue = queryField.fieldQueryValue; string fieldQueryValueType = queryField.fieldQueryValueType; if(fieldQueryKind == "1") //模糊匹配 { condi += " and " + fieldEnName + " like "; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); condi += "'%" + req[fieldQueryValue] + "%'"; } else if(fieldQueryModel == "fixed_value") { condi += "'%" + fieldQueryValue + "%'"; } } else if(fieldQueryKind == "2") //精确匹配 { condi += " and " + fieldEnName + "="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = fieldQueryValue; } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } else if(fieldQueryKind == "5" || fieldQueryKind == "6") //数组匹配/排除 { if(fieldQueryKind == "5") condi += " and " + fieldEnName + " in ("; else if(fieldQueryKind == "6") condi += " and " + fieldEnName + " not in ("; string val = ""; string[] valList = fieldQueryValue.Split(','); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + req[sub] + "',"; } else { val += req[sub] + ","; } } } else if(fieldQueryModel == "fixed_value") { foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + GetExpressionVal(sub) + "',"; } else { val += GetExpressionVal(sub) + ","; } } } else if(fieldQueryModel == "db_field") { foreach(string sub in valList) { if(fieldQueryValueType == "text") { val += "'" + GetDbExpressionVal(sub) + "',"; } else { val += GetDbExpressionVal(sub) + ","; } } } val = val.TrimEnd(','); condi += val + ")"; } else if(fieldQueryKind == "3") //范围匹配 { string[] val = fieldQueryValue.Split(':'); if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">=" + req[val[0]]; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<=" + req[val[1]]; } else { if(!string.IsNullOrEmpty(req[val[0]])) condi += " and " + fieldEnName + ">='" + req[val[0]] + "'"; if(!string.IsNullOrEmpty(req[val[1]])) condi += " and " + fieldEnName + "<='" + req[val[1]] + "'"; } } else if(fieldQueryModel == "fixed_value") { if(fieldQueryValueType == "number") { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">=" + val[0]; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<=" + val[1]; } else { if(!string.IsNullOrEmpty(val[0])) condi += " and " + fieldEnName + ">='" + val[0] + "'"; if(!string.IsNullOrEmpty(val[1])) condi += " and " + fieldEnName + "<='" + val[1] + "'"; } } } else if(fieldQueryKind == "4") //取反匹配 { condi += " and " + fieldEnName + "!="; string val = ""; if(fieldQueryModel == "request_param") { Dictionary req = getRequestParams(projectId, content); val = req[fieldQueryValue]; } else if(fieldQueryModel == "fixed_value") { val = fieldQueryValue; } if(fieldQueryValueType == "text") { val = "'" + val + "'"; } condi += val; } } if(prizeInTable.excuteKind == "add") db.Insertable(doFields).ExecuteCommand(); if(prizeInTable.excuteKind == "update") db.Updateable(doFields).Where("1=1" + condi).ExecuteCommand(); } } //固定值表达式 public static string GetExpressionVal(string str) { if(str == "#{now}#") str = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if(str == "#{today}#") str = DateTime.Now.ToString("yyyy-MM-dd"); if(str == "#{this_month}#") str = DateTime.Now.ToString("yyyy-MM"); if(str.StartsWith("#{now") && str.EndsWith("DAY}#")) str = DateTime.Now.AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd HH:mm:ss"); if(str.StartsWith("#{now") && str.EndsWith("MONTH}#")) str = DateTime.Now.AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd HH:mm:ss"); if(str.StartsWith("#{today") && str.EndsWith("DAY}#")) str = DateTime.Now.AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd"); if(str.StartsWith("#{today") && str.EndsWith("MONTH}#")) str = DateTime.Now.AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd"); if(str.StartsWith("#{this_month") && str.EndsWith("DAY}#")) str = DateTime.Now.AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM"); if(str.StartsWith("#{this_month") && str.EndsWith("MONTH}#")) str = DateTime.Now.AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM"); return str; } //库内字段值表达式 public static string GetDbExpressionVal(string str) { if(str.StartsWith("#{now") && str.EndsWith("DAY}#")) str = "DATE_ADD(" + str + ",INTERVAL " + str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1] + " DAY)"; if(str.StartsWith("#{now") && str.EndsWith("MONTH}#")) str = "DATE_ADD(" + str + ",INTERVAL " + str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1] + " MONTH)"; return str; } } }