SourceHelper.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. using System;
  2. using System.Data;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using System.Threading;
  6. using Library;
  7. using LitJson;
  8. using MySystem.Models.Push;
  9. namespace MySystem
  10. {
  11. public class SourceHelper
  12. {
  13. public readonly static SourceHelper Instance = new SourceHelper();
  14. private SourceHelper()
  15. {
  16. }
  17. public void Start()//启动
  18. {
  19. Thread thread = new Thread(threadStart);
  20. thread.IsBackground = true;
  21. thread.Start();
  22. }
  23. private void threadStart()
  24. {
  25. while (true)
  26. {
  27. DoSomeThing();
  28. Thread.Sleep(1000);
  29. }
  30. }
  31. //要执行的方法
  32. public void DoSomeThing()
  33. {
  34. WebCMSEntities db = new WebCMSEntities();
  35. var sources = db.SourceData.Where(m => m.Status == 1).ToList();
  36. foreach(var source in sources)
  37. {
  38. string Title = source.Title; //说明
  39. string TableName = source.TableName; //数据表
  40. TableName = MatchExpressionVal(TableName);
  41. string FieldList = source.FieldList; //原始数据字段
  42. string FlagField = source.TargetFieldList; //原始标记字段
  43. int StartId = source.QueryId;
  44. string Month = source.Month;
  45. string QueryField = "";
  46. JsonData fieldJson = JsonMapper.ToObject(FieldList);
  47. for (int i = 0; i < fieldJson.Count; i++)
  48. {
  49. JsonData item = fieldJson[i];
  50. string source_name = item["source_name"].ToString();
  51. if(source_name.StartsWith("v("))
  52. {
  53. if(source_name.Contains(" from "))
  54. {
  55. string sqlString = source_name.Replace("v(", "").Replace(")", "");
  56. Match m = Regex.Match(sqlString, "\\$\\{.*?\\}");
  57. if(m.Success)
  58. {
  59. QueryField += m.Value.Replace("${", "").Replace("}", "") + ",";
  60. }
  61. }
  62. else
  63. {
  64. QueryField += source_name.Replace("v(", "").Replace(")", "") + ",";
  65. }
  66. }
  67. else
  68. {
  69. QueryField += source_name + ",";
  70. }
  71. }
  72. //构造抓取数据
  73. string sql = "select " + QueryField.TrimEnd(',') + " from " + TableName + " where 1=1";
  74. var condiList = db.SourceCondition.Where(m => m.SourceId == source.Id && m.Status == 1).ToList();
  75. foreach(var condi in condiList)
  76. {
  77. int QueryCondition = condi.QueryCondition;
  78. if(QueryCondition == 1)
  79. {
  80. sql += " and " + condi.QueryField + "='" + condi.QueryVal + "'";
  81. }
  82. else if(QueryCondition == 2)
  83. {
  84. sql += " and " + condi.QueryField + " like '%" + condi.QueryVal + "%'";
  85. }
  86. else if(QueryCondition == 3)
  87. {
  88. sql += " and " + condi.QueryField + ">" + condi.QueryVal + "";
  89. }
  90. else if(QueryCondition == 4)
  91. {
  92. sql += " and " + condi.QueryField + "<" + condi.QueryVal + "";
  93. }
  94. else if(QueryCondition == 5)
  95. {
  96. string[] QueryValList = condi.QueryVal.Split('|');
  97. sql += " and " + condi.QueryField + ">=" + QueryValList[0] + " and " + condi.QueryField + "<=" + QueryValList[1] + "";
  98. }
  99. else if(QueryCondition == 6)
  100. {
  101. string[] QueryValList = condi.QueryVal.Split('|');
  102. sql += " and " + condi.QueryField + ">='" + QueryValList[0] + "' and " + condi.QueryField + "<='" + QueryValList[1] + "'";
  103. }
  104. else if(QueryCondition == 7)
  105. {
  106. sql += " and " + condi.QueryField + " in (" + condi.QueryVal + ")";
  107. }
  108. else if(QueryCondition == 8)
  109. {
  110. sql += " and " + condi.QueryField + " in ('" + condi.QueryVal.Replace(",", "','") + "')";
  111. }
  112. else if(QueryCondition == 9)
  113. {
  114. string[] QueryValList = condi.QueryVal.Split(',');
  115. sql += " and (";
  116. int index = 0;
  117. foreach(string QueryVal in QueryValList)
  118. {
  119. index += 1;
  120. sql += condi.QueryField + "=" + QueryVal;
  121. if(index < QueryValList.Length)
  122. {
  123. sql += " or ";
  124. }
  125. }
  126. sql += ")";
  127. }
  128. else
  129. {
  130. sql += " and " + condi.QueryField + "='" + condi.QueryVal + "'";
  131. }
  132. }
  133. //创建原始数据表
  134. if(TableName.Contains(".")) TableName = TableName.Split('.')[1];
  135. var sourceEdit = db.SourceData.FirstOrDefault(m => m.Id == source.Id && m.Version == 0);
  136. if(sourceEdit != null)
  137. {
  138. CreateTable(Title, TableName, FieldList);
  139. sourceEdit.Version = 1;
  140. db.SaveChanges();
  141. }
  142. //插入数据
  143. string TargetQueryField = "";
  144. JsonData TargetFieldJson = JsonMapper.ToObject(FieldList);
  145. for (int i = 0; i < TargetFieldJson.Count; i++)
  146. {
  147. JsonData item = TargetFieldJson[i];
  148. TargetQueryField += item["name"].ToString() + ",";
  149. }
  150. string insertSql = "";
  151. sql = sql.Replace("${QueryId}$", StartId.ToString());
  152. sql += " order by id limit 10";
  153. DataTable dt = CustomerSqlConn.dtable(sql, AppConfig.Base.JavaStatSqlConnStr);
  154. foreach(DataRow dr in dt.Rows)
  155. {
  156. string values = "";
  157. for (int i = 0; i < fieldJson.Count; i++)
  158. {
  159. JsonData item = fieldJson[i];
  160. string source_name = item["source_name"].ToString();
  161. string field_type = item["field_type"].ToString();
  162. if(!string.IsNullOrEmpty(source_name))
  163. {
  164. if(source_name.StartsWith("v("))
  165. {
  166. if(source_name.Contains(" from "))
  167. {
  168. string sqlString = source_name.Replace("v(", "").Replace(")", "").Trim('\'');
  169. Match m = Regex.Match(sqlString, "\\$\\{.*?\\}");
  170. if(m.Success)
  171. {
  172. string sourceVal = m.Value.Replace("${", "").Replace("}", "");
  173. sqlString = sqlString.Replace(m.Value, dr[sourceVal].ToString());
  174. DataTable dataTable = CustomerSqlConn.dtable(sqlString, AppConfig.Base.JavaStatSqlConnStr);
  175. if(dataTable.Rows.Count > 0)
  176. {
  177. if(field_type == "int" || field_type == "numeric")
  178. {
  179. values += "" + dataTable.Rows[0][0].ToString() + ",";
  180. }
  181. else if(field_type == "datetime")
  182. {
  183. values += "'" + DateTime.Parse(dataTable.Rows[0][0].ToString()).ToString("yyyy-MM-dd HH:mm:ss") + "',";
  184. }
  185. else
  186. {
  187. values += "'" + dataTable.Rows[0][0].ToString() + "',";
  188. }
  189. }
  190. }
  191. }
  192. else
  193. {
  194. values += source_name.Replace("v(", "").Replace(")", "") + ",";
  195. }
  196. }
  197. else
  198. {
  199. if(field_type == "int" || field_type == "numeric")
  200. {
  201. values += "" + dr[source_name].ToString() + ",";
  202. }
  203. else if(field_type == "datetime")
  204. {
  205. values += "'" + DateTime.Parse(dr[source_name].ToString()).ToString("yyyy-MM-dd HH:mm:ss") + "',";
  206. }
  207. else
  208. {
  209. values += "'" + dr[source_name].ToString() + "',";
  210. }
  211. }
  212. }
  213. }
  214. insertSql += "insert into u_" + TableName + " (" + TargetQueryField.TrimEnd(',') + ") values (" + values.TrimEnd(',') + ");";
  215. StartId = int.Parse(dr["id"].ToString());
  216. // CustomerSqlConn.op("update " + TableName + " set " + FlagField + "=1 where Id=" + StartId, AppConfig.Base.RmSourceSqlConnStr);
  217. }
  218. var edit = db.SourceData.FirstOrDefault(m => m.Id == source.Id);
  219. if(edit != null)
  220. {
  221. if(Month != DateTime.Now.ToString("yyyyMM"))
  222. {
  223. edit.Month = DateTime.Now.ToString("yyyyMM");
  224. edit.QueryId = 0;
  225. }
  226. else
  227. {
  228. edit.QueryId = StartId;
  229. if(edit.Month != Month) edit.Month = Month;
  230. }
  231. db.SaveChanges();
  232. }
  233. if(!string.IsNullOrEmpty(insertSql))
  234. {
  235. CustomerSqlConn.op(insertSql, AppConfig.Base.SqlConnStr);
  236. }
  237. }
  238. db.Dispose();
  239. }
  240. //创建表
  241. public void CreateTable(string Title, string tableName, string fieldList)
  242. {
  243. string sql = "CREATE TABLE `u_" + tableName + "` (\n";
  244. JsonData fieldJson = JsonMapper.ToObject(fieldList);
  245. string prikey = "";
  246. for (int i = 0; i < fieldJson.Count; i++)
  247. {
  248. JsonData item = fieldJson[i];
  249. string nullCondition = "";
  250. string fieldType = item["field_type"].ToString();
  251. string defaultValue = item["default"].ToString();
  252. if(!string.IsNullOrEmpty(defaultValue))
  253. {
  254. nullCondition = " NOT NULL DEFAULT " + defaultValue;
  255. }
  256. if(item["pri"].ToString() == "1" && item["name"].ToString() == "id")
  257. {
  258. sql += "`" + item["name"].ToString() + "` int NOT NULL AUTO_INCREMENT COMMENT '" + item["title"].ToString() + "',\n";
  259. }
  260. else
  261. {
  262. if(fieldType == "int")
  263. {
  264. sql += "`" + item["name"].ToString() + "` int NOT NULL DEFAULT " + defaultValue + " COMMENT '" + item["title"].ToString() + "',\n";
  265. }
  266. else if(fieldType == "numeric")
  267. {
  268. sql += "`" + item["name"].ToString() + "` numeric(18,2) NOT NULL DEFAULT " + defaultValue + " COMMENT '" + item["title"].ToString() + "',\n";
  269. }
  270. else if(fieldType == "datetime")
  271. {
  272. sql += "`" + item["name"].ToString() + "` datetime COMMENT '" + item["title"].ToString() + "',\n";
  273. }
  274. else
  275. {
  276. sql += "`" + item["name"].ToString() + "` " + fieldType + "(" + item["len"].ToString() + ")" + nullCondition + " COMMENT '" + item["title"].ToString() + "',\n";
  277. }
  278. }
  279. if(item["pri"].ToString() == "1")
  280. {
  281. prikey = item["name"].ToString();
  282. }
  283. }
  284. if(!string.IsNullOrEmpty(prikey))
  285. {
  286. sql += "PRIMARY KEY (`" + prikey + "`)\n";
  287. }
  288. sql += ") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='" + Title + "';";
  289. CustomerSqlConn.op(sql, AppConfig.Base.SqlConnStr);
  290. }
  291. public string GetExpressionVal(string str)
  292. {
  293. if(str == "#{now}#") return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  294. if(str == "#{today}#") return DateTime.Now.ToString("yyyy-MM-dd");
  295. if(str == "#{this_month}#") return DateTime.Now.ToString("yyyy-MM");
  296. if(str.StartsWith("#{now") && str.EndsWith("DAY}#")) return DateTime.Now.AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd HH:mm:ss");
  297. if(str.StartsWith("#{now") && str.EndsWith("MONTH}#")) return DateTime.Now.AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd HH:mm:ss");
  298. if(str.StartsWith("#{today") && str.EndsWith("DAY}#")) return DateTime.Now.AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd");
  299. if(str.StartsWith("#{today") && str.EndsWith("MONTH}#")) return DateTime.Now.AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd");
  300. if(str.StartsWith("#{this_month") && str.EndsWith("DAY}#")) return DateTime.Now.AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM");
  301. if(str.StartsWith("#{this_month") && str.EndsWith("MONTH}#")) return DateTime.Now.AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM");
  302. if(str.StartsWith("#{") && str.EndsWith("DAY}#")) return DateTime.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[0]).AddDays(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd HH:mm:ss");
  303. if(str.StartsWith("#{") && str.EndsWith("MONTH}#")) return DateTime.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[0]).AddMonths(int.Parse(str.Replace("#", "").Replace("{", "").Replace("}", "").Split(',')[1])).ToString("yyyy-MM-dd HH:mm:ss");
  304. if(str.StartsWith("#{split") && str.EndsWith("}#"))
  305. {
  306. string[] data = str.Replace("#{", "").Replace("}#", "").Split(',');
  307. string text = data[1];
  308. string splitTag = data[2];
  309. string index = data[3];
  310. return text.Split(new string[]{ splitTag }, StringSplitOptions.None)[int.Parse(index)];
  311. }
  312. else if(str.StartsWith("#{") && str.EndsWith("}#"))
  313. {
  314. string[] data = str.Replace("#{", "").Replace("}#", "").Split(',');
  315. string tag = data[0];
  316. string format = data[data.Length - 1];
  317. if(tag == "now" && format.StartsWith("yyyy"))
  318. {
  319. if(data.Length == 2)
  320. {
  321. return DateTime.Now.ToString(format);
  322. }
  323. else if(data.Length == 4)
  324. {
  325. if(data[2] == "DAY") return DateTime.Now.AddDays(int.Parse(data[1])).ToString(format);
  326. if(data[2] == "MONTH") return DateTime.Now.AddMonths(int.Parse(data[1])).ToString(format);
  327. }
  328. }
  329. }
  330. return str;
  331. }
  332. public string MatchExpressionVal(string str)
  333. {
  334. MatchCollection mc = Regex.Matches(str, "#\\{.*?\\}#");
  335. foreach(Match m in mc)
  336. {
  337. str = str.Replace(m.Value, GetExpressionVal(m.Value));
  338. }
  339. return str;
  340. }
  341. }
  342. }