|
@@ -26,6 +26,14 @@ using TEAMModelOS.SDK.DI;
|
|
|
using HTEXLib.Helpers.ShapeHelpers;
|
|
|
using HtmlAgilityPack;
|
|
|
using Top.Api.Util;
|
|
|
+using DocumentFormat.OpenXml.Drawing.Charts;
|
|
|
+using DocumentFormat.OpenXml.Spreadsheet;
|
|
|
+using TEAMModelOS.SDK.Models.Cosmos.School;
|
|
|
+using OfficeOpenXml;
|
|
|
+using System.IO.Packaging;
|
|
|
+using Microsoft.Azure.Amqp.Framing;
|
|
|
+using DocumentFormat.OpenXml.Office2016.Drawing.ChartDrawing;
|
|
|
+using DocumentFormat.OpenXml.Office2010.Excel;
|
|
|
namespace TEAMModelOS.Controllers.Third.Moofen
|
|
|
{
|
|
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
|
@@ -38,13 +46,206 @@ namespace TEAMModelOS.Controllers.Third.Moofen
|
|
|
private readonly IHttpClientFactory _httpClient;
|
|
|
private readonly DingDing _dingDing;
|
|
|
private readonly AzureCosmosFactory _azureCosmos;
|
|
|
- public MoofenController(AzureCosmosFactory azureCosmos,CoreAPIHttpService coreAPIHttpService, IConfiguration configuration, IHttpClientFactory httpClient, DingDing dingDing)
|
|
|
+ private readonly AzureStorageFactory _azureStorage;
|
|
|
+ public MoofenController(AzureCosmosFactory azureCosmos,CoreAPIHttpService coreAPIHttpService, IConfiguration configuration, IHttpClientFactory httpClient, DingDing dingDing,AzureStorageFactory azureStorage)
|
|
|
{
|
|
|
_coreAPIHttpService=coreAPIHttpService;
|
|
|
_configuration=configuration;
|
|
|
_httpClient=httpClient;
|
|
|
_dingDing=dingDing;
|
|
|
_azureCosmos=azureCosmos;
|
|
|
+ _azureStorage=azureStorage;
|
|
|
+ }
|
|
|
+
|
|
|
+ [HttpPost("moofen/read-excel-knowledge-point")]
|
|
|
+ [RequestSizeLimit(102_400_000_00)] //最大10000m左右
|
|
|
+ public async Task<IActionResult> ReadExcelKnowledgePoint([FromForm] IFormFile[] file)
|
|
|
+ {
|
|
|
+
|
|
|
+ ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
|
|
|
+ List<dynamic> period_subject = new List<dynamic>();
|
|
|
+ foreach (var f in file)
|
|
|
+ {
|
|
|
+ List<MoofenKnowledgePointDto> pointDtos = new List<MoofenKnowledgePointDto>();
|
|
|
+ string[] parts = f.FileName.Split(']');
|
|
|
+ string[] periodp = parts[0].Split('[');
|
|
|
+ string[] subjectp = parts[1].Split('[');
|
|
|
+
|
|
|
+ string period = periodp[1].Trim();
|
|
|
+ string subject = subjectp[1].Trim();
|
|
|
+
|
|
|
+ List<string> titles = new List<string>();
|
|
|
+ List<List<string>> datas = new List<List<string>>();
|
|
|
+ using (ExcelPackage package = new ExcelPackage(f.OpenReadStream()))
|
|
|
+ {
|
|
|
+ ExcelWorksheets sheets = package.Workbook.Worksheets;
|
|
|
+ var sheet = sheets.FirstOrDefault();
|
|
|
+ if (sheet!= null)
|
|
|
+ {
|
|
|
+
|
|
|
+ var rows = sheet.Dimension.Rows;
|
|
|
+ var columns = sheet.Dimension.Columns;
|
|
|
+ for (int r = 1; r <= rows; r++)
|
|
|
+ {
|
|
|
+ List<string> data = new List<string>();
|
|
|
+ for (int c = 1; c <= columns; c++)
|
|
|
+ {
|
|
|
+ var value = sheet .GetValue(r, c);
|
|
|
+ if (r == 1)
|
|
|
+ {
|
|
|
+ if (!string.IsNullOrWhiteSpace($"{value}"))
|
|
|
+ {
|
|
|
+ titles.Add($"{value}");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (c > titles.Count)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ data.Add($"{value}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (data.Any())
|
|
|
+ {
|
|
|
+ datas.Add(data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ( var data in datas )
|
|
|
+ {
|
|
|
+ MoofenKnowledgePointDto knowledgePointDto = new MoofenKnowledgePointDto { kp1 = data[0] , kp2= data[1], kp3 = data[2], kp4= data[3], id= data[4] };
|
|
|
+ if (!string.IsNullOrWhiteSpace(knowledgePointDto.kp1)) {
|
|
|
+ knowledgePointDto.level=1;
|
|
|
+ knowledgePointDto.kp=knowledgePointDto.kp1;
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(knowledgePointDto.kp2))
|
|
|
+ {
|
|
|
+ knowledgePointDto.level=2;
|
|
|
+ knowledgePointDto.kp=knowledgePointDto.kp2;
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(knowledgePointDto.kp3))
|
|
|
+ {
|
|
|
+ knowledgePointDto.level=3;
|
|
|
+ knowledgePointDto.kp=knowledgePointDto.kp3;
|
|
|
+ }
|
|
|
+ if (!string.IsNullOrWhiteSpace(knowledgePointDto.kp4))
|
|
|
+ {
|
|
|
+ knowledgePointDto.level=4;
|
|
|
+ knowledgePointDto.kp=knowledgePointDto.kp4;
|
|
|
+ }
|
|
|
+ pointDtos.Add( knowledgePointDto );
|
|
|
+ }
|
|
|
+ // 构建树形结构
|
|
|
+ var tree = BuildTree(pointDtos);
|
|
|
+ tree.kp=$"{period}-{subject}";
|
|
|
+ var json= tree.children.ToJsonString();
|
|
|
+ string subjectId = string.Empty;
|
|
|
+ string periodId = string.Empty;
|
|
|
+ switch (period)
|
|
|
+ {
|
|
|
+ case "小学": periodId="primary"; break;
|
|
|
+ case "初中": periodId="junior"; break;
|
|
|
+ case "高中": periodId="senior"; break;
|
|
|
+ }
|
|
|
+ switch (subject)
|
|
|
+ {
|
|
|
+ case "语文":
|
|
|
+ subjectId="subject_chinese";
|
|
|
+ break;
|
|
|
+ case "数学":
|
|
|
+ subjectId="subject_math";
|
|
|
+ break;
|
|
|
+ case "英语":
|
|
|
+ subjectId="subject_english";
|
|
|
+ break;
|
|
|
+ case "物理":
|
|
|
+ subjectId="subject_physics";
|
|
|
+ break;
|
|
|
+ case "化学":
|
|
|
+ subjectId="subject_chemistry";
|
|
|
+ break;
|
|
|
+ case "生物":
|
|
|
+ subjectId="subject_biology";
|
|
|
+ break;
|
|
|
+ case "政治":
|
|
|
+ subjectId="subject_politics";
|
|
|
+ break;
|
|
|
+ case "历史":
|
|
|
+ subjectId="subject_history";
|
|
|
+ break;
|
|
|
+ case "地理":
|
|
|
+ subjectId="subject_geography";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ period_subject.Add(new { period,subject, periodId,subjectId }) ;
|
|
|
+ await _azureStorage.GetBlobContainerClient(Constant.teammodelos_blob).UploadFileByContainer(json,"third",$"moofen/kp-{periodId}-{subjectId}.json",true);
|
|
|
+ }
|
|
|
+ return Ok(new { period_subject });
|
|
|
+ }
|
|
|
+
|
|
|
+ private TreeNode BuildTree(List<MoofenKnowledgePointDto> pointDtos)
|
|
|
+ {
|
|
|
+ var root = new TreeNode();
|
|
|
+ var stack = new Stack<TreeNode>();
|
|
|
+ stack.Push(root);
|
|
|
+ foreach (var pointDto in pointDtos)
|
|
|
+ {
|
|
|
+ var node = new TreeNode
|
|
|
+ {
|
|
|
+ id = pointDto.id,
|
|
|
+ tid = pointDto.id,
|
|
|
+ kp = pointDto.kp,
|
|
|
+ level = pointDto.level
|
|
|
+ };
|
|
|
+ while (stack.Count > 0 && stack.Peek().level >= node.level)
|
|
|
+ {
|
|
|
+ stack.Pop();
|
|
|
+ }
|
|
|
+ if (stack.Count > 0)
|
|
|
+ {
|
|
|
+ stack.Peek().children.Add(node);
|
|
|
+ }
|
|
|
+ stack.Push(node);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (root.level==0 && root.children.IsNotEmpty()) {
|
|
|
+
|
|
|
+ foreach (var node in root.children)
|
|
|
+ {
|
|
|
+ node.subcids=node.children.Select(x => x.tid).ToList();
|
|
|
+ var cids = GetChildIds(node);
|
|
|
+ node.allcids=cids.Count>100 ? new List<string>():cids ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return root;
|
|
|
+ }
|
|
|
+
|
|
|
+ static List<string> GetChildIds(TreeNode node)
|
|
|
+ {
|
|
|
+ List<string> childIds = new List<string>();
|
|
|
+ if (node.children != null)
|
|
|
+ {
|
|
|
+ foreach (TreeNode child in node.children)
|
|
|
+ {
|
|
|
+ childIds.Add(child.tid);
|
|
|
+ var cids = GetChildIds(child);
|
|
|
+ childIds.AddRange(cids);
|
|
|
+ child.allcids=cids.Count>100 ? new List<string>() : cids;
|
|
|
+ child.subcids=child.children.Select(x => x.tid).ToList();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return childIds;
|
|
|
}
|
|
|
|
|
|
[HttpPost("moofen/question")]
|
|
@@ -70,6 +271,11 @@ namespace TEAMModelOS.Controllers.Third.Moofen
|
|
|
{
|
|
|
dict.Add("subject", $"{subject}");
|
|
|
}
|
|
|
+ if (json.TryGetProperty("kpIds", out JsonElement kpIds) && kpIds.ValueKind.Equals(JsonValueKind.Array))
|
|
|
+ {
|
|
|
+ //对方接口数据参数是"kpIds": "[\"221206\"]",
|
|
|
+ dict.Add("kpIds", $"{kpIds.ToJsonString()}");
|
|
|
+ }
|
|
|
if (json.TryGetProperty("grades", out JsonElement grades) && !string.IsNullOrWhiteSpace($"{grades}"))
|
|
|
{
|
|
|
dict.Add("grades", $"{grades}");
|
|
@@ -406,7 +612,41 @@ namespace TEAMModelOS.Controllers.Third.Moofen
|
|
|
return Ok(new { code = 400 });
|
|
|
}
|
|
|
}
|
|
|
+ public class TreeNode
|
|
|
+ {
|
|
|
+
|
|
|
|
|
|
+ public string kp { get; set; }
|
|
|
+ public string id { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 第三方id
|
|
|
+ /// </summary>
|
|
|
+ public string tid { get; set; }
|
|
|
+ public int level { get; set; }
|
|
|
+ /// <summary>
|
|
|
+ /// 直接子节点
|
|
|
+ /// </summary>
|
|
|
+ public List<string> subcids { get; set; } = new List<string>();
|
|
|
+ /// <summary>
|
|
|
+ /// 所有子节点
|
|
|
+ /// </summary>
|
|
|
+ public List<string> allcids { get; set; }= new List<string>();
|
|
|
+ public List<TreeNode> children { get; set; } = new List<TreeNode>();
|
|
|
+ }
|
|
|
+
|
|
|
+ public class MoofenKnowledgePointDto
|
|
|
+ {
|
|
|
+ public string id { get; set; }
|
|
|
+ public string kp { get; set; }
|
|
|
+ public int level { get; set; }
|
|
|
+ public string kp1 { get; set; }
|
|
|
+ public string kp2 { get; set; }
|
|
|
+ public string kp3 { get; set; }
|
|
|
+ public string kp4 { get; set; }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
public class MoofenQuestion
|
|
|
{
|
|
|
public int difficulty { get; set; }
|