APIJSONService.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // 大名科技(天津)有限公司版权所有 电话:18020030720 QQ:515096995
  2. //
  3. // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证
  4. namespace Admin.NET.Core.Service;
  5. /// <summary>
  6. /// APIJSON服务 💥
  7. /// </summary>
  8. [ApiDescriptionSettings(Order = 100)]
  9. public class APIJSONService : IDynamicApiController, ITransient
  10. {
  11. private readonly ISqlSugarClient _db;
  12. private readonly IdentityService _identityService;
  13. private readonly TableMapper _tableMapper;
  14. private readonly SelectTable _selectTable;
  15. public APIJSONService(ISqlSugarClient db,
  16. IdentityService identityService,
  17. TableMapper tableMapper)
  18. {
  19. _db = db;
  20. _tableMapper = tableMapper;
  21. _identityService = identityService;
  22. _selectTable = new SelectTable(_identityService, _tableMapper, _db);
  23. }
  24. /// <summary>
  25. /// 统一查询入口 🔖
  26. /// </summary>
  27. /// <param name="jobject"></param>
  28. /// <remarks>参数:{"[]":{"SYSLOGOP":{}}}</remarks>
  29. /// <returns></returns>
  30. [HttpPost("get")]
  31. [DisplayName("APIJSON统一查询")]
  32. public JObject Query([FromBody] JObject jobject)
  33. {
  34. return _selectTable.Query(jobject);
  35. }
  36. /// <summary>
  37. /// 查询 🔖
  38. /// </summary>
  39. /// <param name="table"></param>
  40. /// <param name="jobject"></param>
  41. /// <returns></returns>
  42. [HttpPost("get/{table}")]
  43. [DisplayName("APIJSON查询")]
  44. public JObject QueryByTable([FromRoute] string table, [FromBody] JObject jobject)
  45. {
  46. var ht = new JObject
  47. {
  48. { table + "[]", jobject }
  49. };
  50. // 自动添加总计数量
  51. if (jobject["query"] != null && jobject["query"].ToString() != "0" && jobject["total@"] == null)
  52. ht.Add("total@", "");
  53. // 每页最大1000条数据
  54. if (jobject["count"] != null && int.Parse(jobject["count"].ToString()) > 1000)
  55. throw Oops.Bah("count分页数量最大不能超过1000");
  56. jobject.Remove("@debug");
  57. var hasTableKey = false;
  58. var ignoreConditions = new List<string> { "page", "count", "query" };
  59. var tableConditions = new JObject(); // 表的其它查询条件,比如过滤、字段等
  60. foreach (var item in jobject)
  61. {
  62. if (item.Key.Equals(table, StringComparison.CurrentCultureIgnoreCase))
  63. {
  64. hasTableKey = true;
  65. break;
  66. }
  67. if (!ignoreConditions.Contains(item.Key.ToLower()))
  68. tableConditions.Add(item.Key, item.Value);
  69. }
  70. foreach (var removeKey in tableConditions)
  71. {
  72. jobject.Remove(removeKey.Key);
  73. }
  74. if (!hasTableKey)
  75. jobject.Add(table, tableConditions);
  76. return Query(ht);
  77. }
  78. /// <summary>
  79. /// 新增 🔖
  80. /// </summary>
  81. /// <param name="tables">表对象或数组,若没有传Id则后端生成Id</param>
  82. /// <returns></returns>
  83. [HttpPost("add")]
  84. [DisplayName("APIJSON新增")]
  85. [UnitOfWork]
  86. public JObject Add([FromBody] JObject tables)
  87. {
  88. var ht = new JObject();
  89. foreach (var table in tables)
  90. {
  91. var talbeName = table.Key.Trim();
  92. var role = _identityService.GetRole();
  93. if (!role.Insert.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase))
  94. throw Oops.Bah($"没权限添加{talbeName}");
  95. JToken result;
  96. // 批量插入
  97. if (table.Value is JArray)
  98. {
  99. var ids = new List<object>();
  100. foreach (var record in table.Value)
  101. {
  102. var cols = record.ToObject<JObject>();
  103. var id = _selectTable.InsertSingle(talbeName, cols, role);
  104. ids.Add(id);
  105. }
  106. result = JToken.FromObject(new { id = ids, count = ids.Count });
  107. }
  108. // 单条插入
  109. else
  110. {
  111. var cols = table.Value.ToObject<JObject>();
  112. var id = _selectTable.InsertSingle(talbeName, cols, role);
  113. result = JToken.FromObject(new { id });
  114. }
  115. ht.Add(talbeName, result);
  116. }
  117. return ht;
  118. }
  119. /// <summary>
  120. /// 更新(只支持Id作为条件) 🔖
  121. /// </summary>
  122. /// <param name="tables">支持多表、多Id批量更新</param>
  123. /// <returns></returns>
  124. [HttpPost("update")]
  125. [DisplayName("APIJSON更新")]
  126. [UnitOfWork]
  127. public JObject Edit([FromBody] JObject tables)
  128. {
  129. var ht = new JObject();
  130. foreach (var table in tables)
  131. {
  132. var tableName = table.Key.Trim();
  133. var role = _identityService.GetRole();
  134. var count = _selectTable.UpdateSingleTable(tableName, table.Value, role);
  135. ht.Add(tableName, JToken.FromObject(new { count }));
  136. }
  137. return ht;
  138. }
  139. /// <summary>
  140. /// 删除(支持非Id条件、支持批量) 🔖
  141. /// </summary>
  142. /// <param name="tables"></param>
  143. /// <returns></returns>
  144. [HttpPost("delete")]
  145. [DisplayName("APIJSON删除")]
  146. [UnitOfWork]
  147. public JObject Delete([FromBody] JObject tables)
  148. {
  149. var ht = new JObject();
  150. var role = _identityService.GetRole();
  151. foreach (var table in tables)
  152. {
  153. var talbeName = table.Key.Trim();
  154. if (role.Delete == null || role.Delete.Table == null)
  155. throw Oops.Bah("delete权限未配置");
  156. if (!role.Delete.Table.Contains(talbeName, StringComparer.CurrentCultureIgnoreCase))
  157. throw Oops.Bah($"没权限删除{talbeName}");
  158. //if (!value.ContainsKey("id"))
  159. // throw Oops.Bah("未传主键id");
  160. var value = JObject.Parse(table.Value.ToString());
  161. var sb = new StringBuilder(100);
  162. var parameters = new List<SugarParameter>();
  163. foreach (var f in value)
  164. {
  165. if (f.Value is JArray)
  166. {
  167. sb.Append($"{f.Key} in (@{f.Key}) and ");
  168. var paraArray = FuncList.TransJArrayToSugarPara(f.Value);
  169. parameters.Add(new SugarParameter($"@{f.Key}", paraArray));
  170. }
  171. else
  172. {
  173. sb.Append($"{f.Key}=@{f.Key} and ");
  174. parameters.Add(new SugarParameter($"@{f.Key}", FuncList.TransJObjectToSugarPara(f.Value)));
  175. }
  176. }
  177. if (!parameters.Any())
  178. throw Oops.Bah("请输入删除条件");
  179. var whereSql = sb.ToString().TrimEnd(" and ");
  180. var count = _db.Deleteable<object>().AS(talbeName).Where(whereSql, parameters).ExecuteCommand(); // 无实体删除
  181. value.Add("count", count); // 命中数量
  182. ht.Add(talbeName, value);
  183. }
  184. return ht;
  185. }
  186. }