DefaultCsiRepository.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using Wicture.DbRESTFul.Infrastructure.Repository;
  8. using Wicture.DbRESTFul.PMT.Models;
  9. using Wicture.DbRESTFul.PMT.Scaffolding;
  10. namespace Wicture.DbRESTFul.PMT.Repositories
  11. {
  12. public class DefaultCsiRepository : DbRESTFulRepository
  13. {
  14. public async Task<object> CheckExistName(JToken param)
  15. {
  16. var apiData = param["apiData"].ToObject<List<ACIData>>();
  17. var tableName = string.Join("-", apiData.Select(s => s.TableName).Distinct().ToArray());
  18. var methods = param.Value<JArray>("selectedMethods").ToObject<List<Methods>>();
  19. var csiNames = new List<string>();
  20. foreach (var item in methods)
  21. {
  22. csiNames.Add($"{item.Title}_{tableName}");
  23. }
  24. return await base.InvokeAsync("CheckCSINames", new { csiNames, projectId = param.Value<int>("projectId") });
  25. }
  26. public object LoadTablesForProject(JToken param)
  27. {
  28. var connectionString = param.Value<string>("connectionString");
  29. var projectId = param.Value<int>("projectId");
  30. var helper = new ScaffoldingHelper(connectionString, projectId);
  31. var table = helper.ListTables().Select(t => new { title = t.name, key = 1, children = t.columns });
  32. return table;
  33. }
  34. public async Task<object> CreateCsis(JToken param)
  35. {
  36. var projectId = param.Value<int>("projectId");
  37. var methods = param.Value<JArray>("selectedMethods").ToObject<List<Methods>>();
  38. var module = param["module"].ToObject<Module>();
  39. var apiData = param["apiData"].ToObject<List<ACIData>>();
  40. var helper = new ScaffoldingHelper(param.Value<string>("connectionString"), param.Value<int>("projectId"));
  41. var tableNames = apiData.Select(s => s.TableName).Distinct().ToArray();
  42. var tables = helper.ListTables().Where(w => (tableNames.Contains(w.name)));
  43. var allColumns = new List<DefaultACIColumn>();
  44. tables.ForEach(f =>
  45. {
  46. var columns = new List<DefaultACIColumn>();
  47. f.columns.ForEach(cf =>
  48. {
  49. if (apiData.Where(w => w.TableName == f.name).Select(s => s.ColumnName).Contains(cf.name))
  50. columns.Add(cf);
  51. });
  52. allColumns.AddRange(columns);
  53. });
  54. using (var cnn = ConnectionManager.GetConnection(false))
  55. {
  56. cnn.Open();
  57. var transaction = cnn.BeginTransaction();
  58. try
  59. {
  60. int databaseType = (await InvokeSingleOrDefaultAsync<dynamic>("GetProjectDbType", new { projectId }, cnn)).databaseType;
  61. foreach (var item in methods)
  62. {
  63. var data = this.ParamIntegration(projectId, module, item.Title, string.Join("-", tableNames), allColumns, databaseType);
  64. await base.InvokeAsync("CreateCSI", data, cnn, transaction);
  65. }
  66. transaction.Commit();
  67. }
  68. catch (Exception)
  69. {
  70. transaction.Rollback();
  71. throw;
  72. }
  73. }
  74. return null;
  75. }
  76. #region Private Methods
  77. private object ParamIntegration(int projectId, Module module, Method method, string tableName, IReadOnlyCollection<DefaultACIColumn> columns, int databaseType = 0)
  78. {
  79. var result = new CsiCreateData();
  80. var allColumnNames = columns.Select(c => c.name);
  81. switch (method)
  82. {
  83. case Method.Get:
  84. {
  85. var primaryKey = string.Join(", ", columns.Where(w => (w.primary_key)).Select(c => c.name));
  86. result.code = $"SELECT {string.Join(", ", allColumnNames)} FROM { tableName } WHERE { primaryKey } = @{ primaryKey };";
  87. result.rawCode = $"SELECT {string.Join(", \n\t", allColumnNames)} \nFROM { tableName } \nWHERE { primaryKey } = @{ primaryKey };";
  88. result.name = $"Get_{ tableName }";
  89. result.module = module.ModuleName;
  90. result.moduleId = module.ModuleId;
  91. result.projectId = projectId;
  92. result.queryOnly = true;
  93. result.requiredTransaction = false;
  94. result.resultSet = "S";
  95. }
  96. break;
  97. case Method.List:
  98. {
  99. result.name = $"List_{ tableName }";
  100. result.module = module.ModuleName;
  101. result.moduleId = module.ModuleId;
  102. result.projectId = projectId;
  103. result.queryOnly = true;
  104. result.requiredTransaction = false;
  105. result.resultSet = "M";
  106. // MYSQL 0
  107. if (databaseType == 0)
  108. {
  109. result.code = $"SELECT {string.Join(", ", allColumnNames)} FROM { tableName } WHERE 1 = 1 LIMIT @pageStart, @pageSize;";
  110. result.rawCode = $"SELECT {string.Join(", \n\t", allColumnNames)} \nFROM { tableName } \nWHERE 1 = 1 \nLIMIT @pageStart, @pageSize;";
  111. result.middleWares = "{\"pagination\":{\"size\":\"pageSize\",\"count\":\"totalCount\",\"page\":\"pageIndex\"}}";
  112. }
  113. // SQLSERVER 1
  114. else
  115. {
  116. var primaryKey = string.Join(", ", columns.Where(w => (w.primary_key)).Select(c => c.name));
  117. result.code = $"SELECT Top @pageSize * FROM(SELECT ROW_NUMBER() OVER(ORDER BY t.{ primaryKey }) AS RowNumber, t.* FROM { tableName } t) P WHERE RowNumber > ((@pageIndex - 1) * @pageSize);";
  118. result.rawCode = $"SELECT Top @pageSize * FROM\n\t(SELECT ROW_NUMBER() OVER(ORDER BY t.{ primaryKey }) AS RowNumber, t.* FROM { tableName } t) P \nWHERE RowNumber > ((@pageIndex - 1) * @pageSize);";
  119. result.middleWares = JsonConvert.SerializeObject(new
  120. {
  121. pagination = new
  122. {
  123. size = "pageSize",
  124. count = "totalCount",
  125. page = "pageIndex"
  126. },
  127. replace = new object[]
  128. {
  129. "pageSize"
  130. }
  131. });
  132. }
  133. }
  134. break;
  135. case Method.Create:
  136. {
  137. var columnNames = string.Join(", ", columns.Where(w => (!w.primary_key)).Select(c => c.name));
  138. var columnValues = string.Join(", ", columns.Where(w => (!w.primary_key)).Select(c => "@" + c.name));
  139. var rawColumnNames = string.Join(", \n\t", columns.Where(w => (!w.primary_key)).Select(c => c.name));
  140. var rawColumnValues = string.Join(", \n\t", columns.Where(w => (!w.primary_key)).Select(c => "@" + c.name));
  141. result.name = $"Create_{ tableName }";
  142. result.module = module.ModuleName;
  143. result.moduleId = module.ModuleId;
  144. result.projectId = projectId;
  145. result.queryOnly = false;
  146. result.requiredTransaction = true;
  147. result.resultSet = "S";
  148. // MYSQL 0
  149. if (databaseType == 0)
  150. {
  151. result.code = $"INSERT INTO { tableName }({ columnNames }) VALUES ({ columnValues });SELECT LAST_INSERT_ID() AS id;";
  152. result.rawCode = $"INSERT INTO { tableName }(\n\t{ rawColumnNames }) \nVALUES (\n\t{ rawColumnValues });\nSELECT LAST_INSERT_ID() AS id;";
  153. }
  154. // SQLSERVER 1
  155. else
  156. {
  157. result.code = $"INSERT INTO { tableName }({ columnNames }) VALUES ({ columnValues });SELECT @@IDENTITY AS id;";
  158. result.rawCode = $"INSERT INTO { tableName }(\n\t{ rawColumnNames }) \nVALUES (\n\t{ rawColumnValues });\nSELECT @@IDENTITY AS id;";
  159. }
  160. }
  161. break;
  162. case Method.Update:
  163. {
  164. var primaryKey = string.Join(", ", columns.Where(w => (w.primary_key)).Select(c => c.name));
  165. var nameValues = string.Join(", ", columns.Where(w => (!w.primary_key)).Select(c => $"{c.name} = @{c.name}"));
  166. var rawNameValues = string.Join(", ", columns.Where(w => (!w.primary_key)).Select(c => $"\n\t{c.name} = @{c.name}"));
  167. result.name = $"Update_{ tableName }";
  168. result.module = module.ModuleName;
  169. result.moduleId = module.ModuleId;
  170. result.projectId = projectId;
  171. result.queryOnly = false;
  172. result.requiredTransaction = true;
  173. result.resultSet = "S";
  174. // MYSQL 0
  175. if (databaseType == 0)
  176. {
  177. result.code = $"UPDATE { tableName } SET { nameValues } WHERE { primaryKey } = @{ primaryKey }; SELECT ROW_COUNT() AS count;";
  178. result.rawCode = $"Update { tableName } SET { rawNameValues } \nWHERE { primaryKey } = @{ primaryKey }; \nSELECT ROW_COUNT() AS count;";
  179. }
  180. // SQLSERVER 1
  181. else
  182. {
  183. result.code = $"UPDATE { tableName } SET { nameValues } WHERE { primaryKey } = @{ primaryKey }; SELECT @@ROWCOUNT AS count;";
  184. result.rawCode = $"Update { tableName } SET { rawNameValues } \nWHERE { primaryKey } = @{ primaryKey }; \nSELECT @@ROWCOUNT AS count;";
  185. }
  186. }
  187. break;
  188. case Method.Delete:
  189. {
  190. var primaryKey = string.Join(", ", columns.Where(w => (w.primary_key)).Select(c => c.name));
  191. result.name = $"Delete_{ tableName }";
  192. result.module = module.ModuleName;
  193. result.moduleId = module.ModuleId;
  194. result.projectId = projectId;
  195. result.queryOnly = false;
  196. result.requiredTransaction = true;
  197. result.resultSet = "S";
  198. // MYSQL 0
  199. if (databaseType == 0)
  200. {
  201. result.code = $"DELETE FROM { tableName } WHERE { primaryKey } = @{ primaryKey }; SELECT ROW_COUNT() AS count;";
  202. result.rawCode = $"DELETE FROM { tableName } \nWHERE { primaryKey } = @{ primaryKey }; \nSELECT ROW_COUNT() AS count;";
  203. }
  204. // SQLSERVER 1
  205. else
  206. {
  207. result.code = $"DELETE FROM { tableName } WHERE { primaryKey } = @{ primaryKey }; SELECT @@ROWCOUNT AS count;";
  208. result.rawCode = $"DELETE FROM { tableName } \nWHERE { primaryKey } = @{ primaryKey }; \nSELECT @@ROWCOUNT AS count;";
  209. }
  210. }
  211. break;
  212. default:
  213. throw new ArgumentOutOfRangeException(nameof(method), method, null);
  214. }
  215. return result;
  216. }
  217. #endregion
  218. }
  219. }