AbilityTaskMgmtController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using Microsoft.Extensions.Configuration;
  8. using TEAMModelOS.SDK.DI;
  9. using TEAMModelOS.Models;
  10. using Microsoft.Extensions.Options;
  11. using System.Text.Json;
  12. using TEAMModelOS.SDK.Models;
  13. using Azure.Cosmos;
  14. using HTEXLib.COMM.Helpers;
  15. using TEAMModelOS.SDK.Models.Cosmos.Common;
  16. using System.Text;
  17. using TEAMModelBI.Filter;
  18. using TEAMModelOS.SDK.Services;
  19. using TEAMModelBI.Tool.Extension;
  20. using TEAMModelOS.SDK.Extension;
  21. using TEAMModelBI.DI.BIAzureStorage;
  22. using TEAMModelOS.SDK.Context.BI;
  23. namespace TEAMModelBI.Controllers.BIAbility
  24. {
  25. [Route("biabilitytask")]
  26. [ApiController]
  27. public class AbilityTaskMgmtController : ControllerBase
  28. {
  29. //获取配置信息
  30. private readonly IConfiguration _configuration;
  31. //数据容器
  32. private readonly AzureCosmosFactory _azureCosmos;
  33. //文件容器
  34. private readonly AzureStorageFactory _azureStorage;
  35. //钉钉提示信息
  36. private readonly DingDing _dingDing;
  37. private readonly Option _option;
  38. public AbilityTaskMgmtController(IConfiguration configuration, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage)
  39. {
  40. _configuration = configuration;
  41. _azureCosmos = azureCosmos;
  42. _dingDing = dingDing;
  43. _option = option?.Value;
  44. _azureStorage = azureStorage;
  45. }
  46. /// <summary>
  47. /// 依据区级标准和能力编号查询能力点信息 章节集合
  48. /// </summary>
  49. /// <param name="jsonElement"></param>
  50. /// <returns></returns>
  51. [ProducesDefaultResponseType]
  52. [HttpPost("get-abilitytasksid")]
  53. public async Task<IActionResult> GetAbilityTasksId(JsonElement jsonElement)
  54. {
  55. try
  56. {
  57. if (!jsonElement.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  58. if (!jsonElement.TryGetProperty("abilityId", out JsonElement abilityId)) return BadRequest();
  59. jsonElement.TryGetProperty("site", out JsonElement site);
  60. var cosmosClient = _azureCosmos.GetCosmosClient();
  61. if ($"{site}".Equals(BIConst.Global))
  62. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  63. Ability ability = null;
  64. List<AbilityTaskTreeNode> abilityTaskTreeNodes = new List<AbilityTaskTreeNode>();//原始数据未排序
  65. List<AbilityTaskTreeNode> redtAbilityTaskTreeNodes = new List<AbilityTaskTreeNode>();//排序后的数据
  66. int rnodeCount = 0;
  67. try
  68. {
  69. ability = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").ReadItemAsync<Ability>($"{abilityId}", new PartitionKey($"Ability-{standard}"));
  70. }
  71. catch
  72. {
  73. return Ok(new { state = 400,message="该ID未找到章节" });
  74. }
  75. await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").GetItemQueryIterator<AbilityTask>(queryText: $"select value(c) from c where c.abilityId='{abilityId}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"AbilityTask-{standard}") }))
  76. {
  77. var rns = item.children.Select(x => x.rnodes);
  78. if (rns != null)
  79. {
  80. var list = rns.ToList();
  81. list.ForEach(x => { if (x.IsNotEmpty()) { rnodeCount += 1; } });
  82. }
  83. List<AbilityTaskTree> trees = AbilityService.ListToTree(item.children);
  84. AbilityTaskTreeNode abilityTaskTreeNode = new AbilityTaskTreeNode() { id = item.id, scope = item.scope, trees = trees, abilityId = item.abilityId, auth = item.auth, codeval = ability.school };
  85. abilityTaskTreeNodes.Add(abilityTaskTreeNode);
  86. }
  87. if (ability.abilityTaskIds.IsNotEmpty())
  88. {
  89. ability.abilityTaskIds.ForEach(x =>
  90. {
  91. for (int i = 0; i < abilityTaskTreeNodes.Count; i++)
  92. {
  93. if (abilityTaskTreeNodes[i].id.Equals(x))
  94. {
  95. redtAbilityTaskTreeNodes.Add(abilityTaskTreeNodes[i]);
  96. abilityTaskTreeNodes.RemoveAt(i);
  97. }
  98. }
  99. });
  100. redtAbilityTaskTreeNodes.AddRange(abilityTaskTreeNodes);
  101. return Ok(new { state = 200, abilityTaskTreeNodes = redtAbilityTaskTreeNodes });
  102. }
  103. else
  104. {
  105. return Ok(new { state = 200, abilityTaskTreeNodes = abilityTaskTreeNodes, rnodeCount });
  106. }
  107. }
  108. catch (Exception ex)
  109. {
  110. await _dingDing.SendBotMsg($"BI,{_option.Location} /biabilitytask/get-abilitytasksid \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  111. return BadRequest();
  112. }
  113. }
  114. /// <summary>
  115. /// 修改和新增章节数据
  116. /// </summary>
  117. /// <param name="abilityTask"></param>
  118. /// <returns></returns>
  119. [ProducesDefaultResponseType]
  120. [AuthToken(Roles= "admin,assist")]
  121. [HttpPost("upd-abilitytask")]
  122. public async Task<IActionResult> UpdAbilityTask(RecordAbilityTask recordAbilityTask, [FromHeader] string site)//AbilityTask abilityTask)
  123. {
  124. try
  125. {
  126. var (_tmdId, _tmdName, pic, did, dname, dpic) = HttpJwtAnalysis.JwtXAuthBI(HttpContext.GetXAuth("AuthToken"), _option);
  127. var cosmosClient = _azureCosmos.GetCosmosClient();
  128. var tableClient = _azureStorage.GetCloudTableClient();
  129. var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  130. if ($"{site}".Equals(BIConst.Global))
  131. {
  132. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  133. tableClient = _azureStorage.GetCloudTableClient(BIConst.Global);
  134. blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public", BIConst.Global);
  135. }
  136. StringBuilder msgBuilder = new StringBuilder($"{_tmdName}【{_tmdId}】");
  137. string type = null;
  138. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  139. foreach (var abilityTaskTree in recordAbilityTask.abilityTask)
  140. {
  141. if (!string.IsNullOrEmpty(abilityTaskTree.id))
  142. {
  143. AbilityTask abilityTask = null;
  144. try
  145. {
  146. abilityTask = await cosmosClient.GetContainer("TEAMModelOS", "Normal").ReadItemAsync<AbilityTask>(abilityTaskTree.id, new PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
  147. }
  148. catch
  149. {
  150. }
  151. if (abilityTask == null)
  152. {
  153. if (abilityTaskTree.trees.IsNotEmpty())
  154. {
  155. abilityTaskTree.trees.ForEach(x => x.id = abilityTaskTree.id);
  156. }
  157. List<Tnode> nodes = new List<Tnode>();
  158. AbilityService.TreeToList(abilityTaskTree.trees, nodes, now);
  159. abilityTask = new AbilityTask();
  160. abilityTask.id = abilityTaskTree.id;
  161. abilityTask.children = nodes;
  162. abilityTask.code = $"AbilityTask-{recordAbilityTask.standard}";
  163. abilityTask.pk = "AbilityTask";
  164. abilityTask.ttl = -1;
  165. abilityTask.abilityId = abilityTaskTree.abilityId;
  166. abilityTask.scope = abilityTaskTree.scope;
  167. abilityTask.codeval = $"{recordAbilityTask.standard}";
  168. abilityTask.standard = $"{recordAbilityTask.standard}";
  169. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").CreateItemAsync<AbilityTask>(abilityTask, new Azure.Cosmos.PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
  170. msgBuilder.Append($"新增章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
  171. type = "abilityTask-add";
  172. }
  173. else
  174. {
  175. if (abilityTaskTree.trees.IsNotEmpty())
  176. {
  177. abilityTaskTree.trees.ForEach(x => x.id = abilityTaskTree.id);
  178. }
  179. List<Tnode> nodes = new List<Tnode>();
  180. AbilityService.TreeToList(abilityTaskTree.trees, nodes, now);
  181. abilityTask.children = nodes;
  182. abilityTaskTree.auth = abilityTask.auth;
  183. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReplaceItemAsync<AbilityTask>(abilityTask, abilityTask.id, new Azure.Cosmos.PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
  184. msgBuilder.Append($"修改章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
  185. type = "abilityTask-update";
  186. }
  187. }
  188. else
  189. {
  190. string id = Guid.NewGuid().ToString();
  191. abilityTaskTree.id = id;
  192. if (abilityTaskTree.trees.IsNotEmpty())
  193. {
  194. abilityTaskTree.trees.ForEach(x => x.id = abilityTaskTree.id);
  195. }
  196. List<Tnode> nodes = new List<Tnode>();
  197. AbilityService.TreeToList(abilityTaskTree.trees, nodes, now);
  198. AbilityTask abilityTask = new AbilityTask
  199. {
  200. id = id,
  201. code = $"AbilityTask-{recordAbilityTask.standard}",
  202. pk = "AbilityTask",
  203. ttl = -1,
  204. abilityId = abilityTaskTree.abilityId,
  205. children = nodes,
  206. scope = abilityTaskTree.scope,
  207. codeval = $"{recordAbilityTask.standard}",
  208. standard = $"{recordAbilityTask.standard}"
  209. };
  210. await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").CreateItemAsync<AbilityTask>(abilityTask, new Azure.Cosmos.PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
  211. msgBuilder.Append($"新增章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
  212. type = "abilityTask-add";
  213. }
  214. }
  215. //保存操作记录
  216. //await _azureStorage.SaveBILog(type, msgBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  217. await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, type, msgBuilder?.ToString(), _dingDing, httpContext: HttpContext);
  218. return Ok(new { state = 200, recordAbilityTask });
  219. }
  220. catch (Exception ex)
  221. {
  222. await _dingDing.SendBotMsg($"BI,{_option.Location} /biabilitytask/upd-abilitytask \n {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
  223. return BadRequest();
  224. }
  225. }
  226. /// <summary>
  227. /// 依据id删除章节
  228. /// </summary>
  229. /// <param name="jsonElement"></param>
  230. /// <returns></returns>
  231. [ProducesDefaultResponseType]
  232. [AuthToken(Roles = "admin,rdc,assist,sales")]
  233. [HttpPost("del-abilitytask")]
  234. public async Task<IActionResult> DelAbilityTask(JsonElement jsonElement)
  235. {
  236. try
  237. {
  238. if (!jsonElement.TryGetProperty("standard", out JsonElement standard)) return BadRequest();
  239. if (!jsonElement.TryGetProperty("id", out JsonElement id)) return BadRequest();
  240. jsonElement.TryGetProperty("site", out JsonElement site);
  241. var (_tmdId, _tmdName, pic, did, dname, dpic) = HttpJwtAnalysis.JwtXAuthBI(HttpContext.GetXAuth("AuthToken"), _option);
  242. var cosmosClient = _azureCosmos.GetCosmosClient();
  243. var tableClient = _azureStorage.GetCloudTableClient();
  244. var blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  245. if ($"{site}".Equals(BIConst.Global))
  246. {
  247. cosmosClient = _azureCosmos.GetCosmosClient(name: BIConst.Global);
  248. tableClient = _azureStorage.GetCloudTableClient(BIConst.Global);
  249. blobClient = _azureStorage.GetBlobContainerClient(containerName: "0-public", BIConst.Global);
  250. }
  251. var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"AbilityTask-{standard}"));
  252. string msg = $"{_tmdName}【{_tmdId}】删除册别,删除状态:{response.Status},删除ID:{id}";
  253. //保存操作记录
  254. //await _azureStorage.SaveBILog("abilitytask-del", msg, _dingDing, httpContext: HttpContext);
  255. await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, "abilitytask-del", msg, _dingDing, httpContext: HttpContext);
  256. if (response.Status == 204)
  257. return Ok(new { state = 200 });
  258. else
  259. return Ok(new { state = response.Status });
  260. }
  261. catch (Exception ex)
  262. {
  263. await _dingDing.SendBotMsg($"BI,{_option.Location} /biabilitytask/del-abilitytask \n {ex.Message}\n{ex.StackTrace} ", GroupNames.成都开发測試群組);
  264. return Ok(new { state = 404 });
  265. }
  266. }
  267. public record RecordAbilityTask()
  268. {
  269. public string standard { get; set; }
  270. /// <summary>
  271. /// 章节信息
  272. /// </summary>
  273. //public List<AbilityTask> abilityTask { get; set; }
  274. public List<AbilityTaskTreeNode> abilityTask { get; set; }
  275. }
  276. }
  277. }