Browse Source

Merge branch 'develop5.0-tmd' into develop6.0-tmd

CrazyIter_Bin 3 years ago
parent
commit
7dcdc68e71
36 changed files with 529 additions and 466 deletions
  1. 11 8
      TEAMModeBI/Controllers/BIAbility/AbilityMgmtController.cs
  2. 15 9
      TEAMModeBI/Controllers/BIAbility/AbilityTaskMgmtController.cs
  3. 3 4
      TEAMModeBI/Controllers/BISchool/AreaRelevantController.cs
  4. 6 4
      TEAMModeBI/Controllers/BISchool/BatchAreaController.cs
  5. 22 13
      TEAMModeBI/Controllers/BISchool/BatchSchoolController.cs
  6. 3 2
      TEAMModeBI/Controllers/BISchool/SchoolController.cs
  7. 103 67
      TEAMModeBI/Controllers/BITest/TestController.cs
  8. 0 173
      TEAMModeBI/Controllers/DingDingStruc/DDBackEndController.cs
  9. 11 6
      TEAMModeBI/Controllers/DingDingStruc/TableDingDingInfoController.cs
  10. 5 3
      TEAMModeBI/Controllers/LoginController.cs
  11. 39 35
      TEAMModeBI/Controllers/OperateRecord/OperateLogController.cs
  12. 3 5
      TEAMModeBI/Filter/AuthTokenAttribute.cs
  13. 16 1
      TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs
  14. 0 46
      TEAMModelOS.SDK/Helper/Common/TableHelper/OperateLogHelper.cs
  15. 5 58
      TEAMModelOS.SDK/Models/Table/OperateLog.cs
  16. 27 19
      TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue
  17. 1 1
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue
  18. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js
  19. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/evaluation.js
  20. 2 2
      TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js
  21. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  22. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js
  23. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js
  24. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  25. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js
  26. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js
  27. 1 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  28. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/system.js
  29. 9 0
      TEAMModelOS/ClientApp/src/router/routes.js
  30. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue
  31. 1 1
      TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.less
  32. 1 1
      TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.less
  33. 224 0
      TEAMModelOS/ClientApp/src/view/system/Version.vue
  34. 1 1
      TEAMModelOS/Controllers/Client/HiTeachController.cs
  35. 1 1
      TEAMModelOS/Controllers/School/SchoolController.cs
  36. 2 0
      TEAMModelOS/Controllers/School/StudentController.cs

+ 11 - 8
TEAMModeBI/Controllers/BIAbility/AbilityMgmtController.cs

@@ -15,7 +15,7 @@ using HTEXLib.COMM.Helpers;
 using System.Text;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
+using TEAMModeBI.Filter;
 
 namespace TEAMModeBI.Controllers.BIAbility
 {
@@ -100,6 +100,7 @@ namespace TEAMModeBI.Controllers.BIAbility
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("del-ability")]
         public async Task<IActionResult> DelAbility(JsonElement jsonElement)
         {
@@ -131,7 +132,7 @@ namespace TEAMModeBI.Controllers.BIAbility
                 if (response.Status == 200)
                 {
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作删除册别,删除ID:{id}", type: "ability-del", visitApi: "/biabilitymgmt/del-ability", funModel: mobel);
+                    await _azureStorage.SaveLog("ability-del", $"{_tmdName}【{_tmdId}】删除册别,删除ID:{id}", _dingDing, httpContext: HttpContext);
 
                     return Ok(new { state = 200 });
                 }
@@ -149,12 +150,14 @@ namespace TEAMModeBI.Controllers.BIAbility
         /// </summary>
         /// <param name="request"></param>
         /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("upd-ability")]
         public async Task<IActionResult> UpdAbility(RecordAbility recordAbility)
         {
             try
             {
-                StringBuilder stringBuilder = new StringBuilder($"{recordAbility.tmdName}【{recordAbility.tmdId}】已操作");
+                StringBuilder stringBuilder = new StringBuilder($"{recordAbility.tmdName}【{recordAbility.tmdId}】");
 
                 Ability ability = recordAbility.ability;
                 ability.pk = "Ability";
@@ -218,7 +221,7 @@ namespace TEAMModeBI.Controllers.BIAbility
                 }
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform:"BI", tmdId:$"{recordAbility.tmdId}", tmdName:$"{recordAbility.tmdName}", msg: stringBuilder?.ToString(), type: tempType?.ToString(), visitApi: "/biabilitymgmt/upd-ability", funModel: mobel);
+                await _azureStorage.SaveLog(tempType?.ToString(), stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, Ability = tempAbility });
             }
@@ -234,6 +237,8 @@ namespace TEAMModeBI.Controllers.BIAbility
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
+        [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("upd-currency")]
         public async Task<IActionResult> UpdateCurrency(JsonElement jsonElement) 
         {
@@ -245,9 +250,6 @@ namespace TEAMModeBI.Controllers.BIAbility
 
                 var currencys = isRequired.ToObject<List<IsRequired>>();
 
-                //操作记录
-                string blobOrTable = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
-
                 foreach (var item in currencys)
                 {
                     var cosmosClient = _azureCosmos.GetCosmosClient();
@@ -257,7 +259,8 @@ namespace TEAMModeBI.Controllers.BIAbility
                 }
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作设置是否必修状态。标准:{currencys[0].standard}",type:"ability-update", visitApi: "/biabilitymgmt/upd-isrequired", funModel: mobel);
+                await _azureStorage.SaveLog("ability-update", $"{_tmdName}【{_tmdId}】设置是否必修状态。标准:{currencys[0].standard}", _dingDing, httpContext: HttpContext);
+
                 return Ok(new { state = 200, currencys });
             }
             catch (Exception ex)

+ 15 - 9
TEAMModeBI/Controllers/BIAbility/AbilityTaskMgmtController.cs

@@ -15,8 +15,8 @@ using HTEXLib.COMM.Helpers;
 using TEAMModelOS.Services.Common;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 using TEAMModelOS.SDK.Models.Cosmos.Common;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
 using System.Text;
+using TEAMModeBI.Filter;
 
 namespace TEAMModeBI.Controllers.BIAbility
 {
@@ -118,6 +118,7 @@ namespace TEAMModeBI.Controllers.BIAbility
         /// <param name="abilityTask"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles= "assist")]
         [HttpPost("upd-abilitytask")]
         public async Task<IActionResult> UpdAbilityTask(RecordAbilityTask recordAbilityTask)//AbilityTask abilityTask) 
         {
@@ -125,7 +126,7 @@ namespace TEAMModeBI.Controllers.BIAbility
             {
                 var cosmosClient = _azureCosmos.GetCosmosClient();
 
-                StringBuilder msgBuilder = new StringBuilder($"{recordAbilityTask.tmdName}【{recordAbilityTask.tmdId}】已操作");
+                StringBuilder msgBuilder = new StringBuilder($"{recordAbilityTask.tmdName}【{recordAbilityTask.tmdId}】");
                 string type = null;
                 long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                 foreach (var abilityTaskTree in recordAbilityTask.abilityTask)
@@ -160,6 +161,8 @@ namespace TEAMModeBI.Controllers.BIAbility
                             abilityTask.codeval = $"{recordAbilityTask.standard}";
                             abilityTask.standard = $"{recordAbilityTask.standard}";
                             await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").CreateItemAsync<AbilityTask>(abilityTask, new Azure.Cosmos.PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
+                            msgBuilder.Append($"新增章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
+                            type = "abilityTask-Add";
                         }
                         else
                         {
@@ -172,9 +175,9 @@ namespace TEAMModeBI.Controllers.BIAbility
                             abilityTask.children = nodes;
                             abilityTaskTree.auth = abilityTask.auth;
                             await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").ReplaceItemAsync<AbilityTask>(abilityTask, abilityTask.id, new Azure.Cosmos.PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
+                            msgBuilder.Append($"修改章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
+                            type = "abilityTask-update";
                         }
-                        msgBuilder.Append($"修改章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
-                        type = "abilityTask-update";
                     }
                     else
                     {
@@ -200,13 +203,13 @@ namespace TEAMModeBI.Controllers.BIAbility
                         };
                         await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Normal").CreateItemAsync<AbilityTask>(abilityTask, new Azure.Cosmos.PartitionKey($"AbilityTask-{recordAbilityTask.standard}"));
 
-                        msgBuilder.Append($"修改章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
+                        msgBuilder.Append($"新增章节功能,章节ID:{abilityTask.id} 分区键:{abilityTask.code}");
                         type = "abilityTask-add";
                     }
                 }
 
-                //保存操作日志
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{recordAbilityTask.tmdId}", tmdName: $"{recordAbilityTask.tmdName}", msg: msgBuilder?.ToString(), type: type?.ToString(), visitApi: "/biabilitytask/upd-abilitytask", funModel: mobel);
+                //保存操作记录
+                await _azureStorage.SaveLog(type, msgBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, recordAbilityTask });
             }
@@ -223,6 +226,7 @@ namespace TEAMModeBI.Controllers.BIAbility
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("del-abilitytask")]
         public async Task<IActionResult> DelAbilityTask(JsonElement jsonElement) 
         {
@@ -236,8 +240,10 @@ namespace TEAMModeBI.Controllers.BIAbility
                 var cosmosClient = _azureCosmos.GetCosmosClient();
                 var response = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Normal").DeleteItemStreamAsync(id.ToString(), new PartitionKey($"AbilityTask-{standard}"));
 
-                //保存操作日志
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作删除册别,删除状态:{response.Status},删除ID:{id}", type: "abilitytask-del", visitApi: "/biabilitytask/del-abilitytask", funModel: mobel);
+                string msg = $"{_tmdName}【{_tmdId}】删除册别,删除状态:{response.Status},删除ID:{id}";
+
+                //保存操作记录
+                await _azureStorage.SaveLog("abilitytask-del", msg, _dingDing, httpContext: HttpContext);
 
                 if (response.Status == 204)
                     return Ok(new { state = 200 });

+ 3 - 4
TEAMModeBI/Controllers/BISchool/AreaRelevantController.cs

@@ -11,7 +11,6 @@ using TEAMModeBI.Filter;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 
@@ -89,8 +88,8 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-areashiftschool")]
-        //[AuthToken(Roles = "assist")]
         public async Task<IActionResult> SetAreaShiftSchool(JsonElement jsonElement)
         {
             try
@@ -108,8 +107,8 @@ namespace TEAMModeBI.Controllers.BISchool
 
                 School school = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(tempSchool, tempSchool.id, new PartitionKey("Base"));
 
-                //保存操作日志
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作学校({schoolId})移除该区域", type: "area-update", visitApi: "/area/set-areashiftschool", funModel: mobel);
+                //保存操作记录
+                await _azureStorage.SaveLog("area-update", $"{_tmdName}【{_tmdId}】已操作学校({schoolId})移除该区域", _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, school });
             }

+ 6 - 4
TEAMModeBI/Controllers/BISchool/BatchAreaController.cs

@@ -27,7 +27,7 @@ using TEAMModelOS.SDK.Models.Cosmos.BI;
 using Azure.Messaging.ServiceBus;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Service;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
+using TEAMModeBI.Filter;
 
 namespace TEAMModeBI.Controllers.BISchool
 {
@@ -144,6 +144,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("batch-area")]
         public async Task<IActionResult> batchArea(JsonElement jsonElement)
         {
@@ -456,8 +457,8 @@ namespace TEAMModeBI.Controllers.BISchool
                 var location = _option.Location;
                 await _notificationService.SendNotification(clientID, clientSecret, location, url, notification); //站内发送消息
 
-                //保存操作日志
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作创区功能模块:{name},当前标准【{standard}】,复制的微能力点:{tempStandard}", type: "area-add", visitApi: "/batcharea/batch-area", funModel: "复制能力点");
+                //保存操作记录
+                await _azureStorage.SaveLog("area-add", $"{_tmdName}【{_tmdId}】已操作创区功能模块:{name},当前标准【{standard}】,复制的微能力点:{tempStandard}", _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, area = addArea });
             }
@@ -474,6 +475,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("cut-standard")]
         public async Task<IActionResult> CutStandard(JsonElement jsonElement)
         {
@@ -643,7 +645,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 await _notificationService.SendNotification(clientID, clientSecret, location, url, notification); //发送站内发送消息
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作【{_oldStandard}】切换至{_newStandard}微能力点,复制标准:{_newStandard}", type: "standard-cut", visitApi: "/batcharea/cut-standard", funModel: "切换能力点");
+                await _azureStorage.SaveLog("standard-cut", $"{_tmdName}【{_tmdId}】已操作【{_oldStandard}】切换至{_newStandard}微能力点,复制标准:{_newStandard}", _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200 });
             }

+ 22 - 13
TEAMModeBI/Controllers/BISchool/BatchSchoolController.cs

@@ -19,11 +19,11 @@ using static TEAMModelOS.SDK.Models.Teacher;
 using Microsoft.AspNetCore.Hosting;  //引用读取文件
 using TEAMModelOS.SDK.Models.Service;
 using System.IO;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
 using System.Net.Http;
 using Microsoft.Extensions.Configuration;
 using System.Net.Http.Json;
 using System.Net;
+using TEAMModeBI.Filter;
 
 namespace TEAMModeBI.Controllers.BISchool
 {
@@ -122,6 +122,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("upd-permissions")]
         public async Task<IActionResult> SetSchoolPermissions(JsonElement jsonElement)
         {
@@ -136,7 +137,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 List<Exist> havepower = new List<Exist>(); //已存在的
                 var client = _azureCosmos.GetCosmosClient();
 
-                StringBuilder stringBuilder = new StringBuilder($"{_tmdName}【{_tmdId}】账户操作");
+                StringBuilder stringBuilder = new StringBuilder($"{_tmdName}【{_tmdId}】账户操作");
                 //更新权限
                 foreach (var id in ids.EnumerateArray())
                 {
@@ -186,7 +187,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 }
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: stringBuilder?.ToString(), type: "ability-update", visitApi: "/batchschool/upd-permissions", funModel: mobel);
+                await _azureStorage.SaveLog("school-update", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, havepower = havepower });
             }
@@ -203,6 +204,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="school"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("batch-school")]
         public async Task<IActionResult> BatchCreateSchool(FoundSchools foundSchools)
         {
@@ -210,7 +212,7 @@ namespace TEAMModeBI.Controllers.BISchool
             {
                 List<BISchool> schools = new List<BISchool>();
 
-                StringBuilder stringBuilder = new StringBuilder($"{foundSchools.tmdName}【{foundSchools.tmdId}】操作了批量创校功能:");
+                StringBuilder stringBuilder = new StringBuilder($"{foundSchools.tmdName}【{foundSchools.tmdId}】使用批量创校功能:");
 
                 if (foundSchools.biSchools.Count > 0)
                 {
@@ -353,7 +355,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 else return Ok(new { state = 1, message = "创校信息为空" });
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{foundSchools.tmdId}", tmdName: $"{foundSchools.tmdName}", msg: stringBuilder?.ToString(), type: "school-batchAdd", visitApi: "/batchschool/batch-school", funModel: mobel);
+                await _azureStorage.SaveLog("school-batchAdd", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                 if (schools.Count > 0)
                     return Ok(new { state = 201, message = "已有部分学校批量创建成功;学校编号已经重复!请检查学校编号!", schools = schools });
@@ -548,6 +550,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="school"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("upd-school")]
         public async Task<IActionResult> UpdSchool(ReplaceSchool replaceSchool)
         {
@@ -581,7 +584,7 @@ namespace TEAMModeBI.Controllers.BISchool
                     schoolInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(replaceSchool.school, replaceSchool.school.id, new PartitionKey("Base"));
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{replaceSchool.tmdId}", tmdName: $"{replaceSchool.tmdName}", msg: $"{replaceSchool.tmdName}【{replaceSchool.tmdId}】已操作修改学校,修改的学校:{replaceSchool.school.name}【{replaceSchool.school.id}】", type: "school-update", visitApi: "/batchschool/upd-school", funModel: mobel);
+                    await _azureStorage.SaveLog("school-update", $"{replaceSchool.tmdName}【{replaceSchool.tmdId}】修改学校信息,学校和ID:{replaceSchool.school.name}【{replaceSchool.school.id}】", _dingDing, httpContext: HttpContext);
 
                     return Ok(new { state = 200, schoolInfo });
                 }
@@ -600,6 +603,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("upd-schoolassist")]
         public async Task<IActionResult> UpdSchoolAssist(JsonElement jsonElement)
         {
@@ -757,7 +761,8 @@ namespace TEAMModeBI.Controllers.BISchool
                 }
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作修改学校功能,修改的学校:{_schoolId},{string.Join("|", periodS.ToArray())},{picture},{size},{string.Join("|", assistId.ToArray())}", type: "TeacherRoles-update", visitApi: "/batchschool/upd-schoolassist", funModel: mobel);
+                await _azureStorage.SaveLog("TeacherRoles-update", $"{_tmdName}【{_tmdId}】修改学校功能,修改的学校:{_schoolId},{string.Join("|", periodS.ToArray())},{picture},{size},{string.Join("|", assistId.ToArray())}", _dingDing, httpContext: HttpContext);
+
 
                 return Ok(new { state = 200, schoolAssist });
             }
@@ -773,6 +778,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// </summary>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("upd-schoolperiod")]
         public async Task<IActionResult> UpdSchoolPeriod(JsonElement jsonElement)
         {
@@ -785,7 +791,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest();   //醍摩豆账户
                 if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest(); //醍摩豆账号名称
          
-                StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】已操作新增学校的学段");
+                StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】新增学校的学段");
                 School school = new();
 
                 var cosmosClient = _azureCosmos.GetCosmosClient();
@@ -813,7 +819,7 @@ namespace TEAMModeBI.Controllers.BISchool
                     await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: stringBuilder?.ToString(), type: "schoolperiod-add", visitApi: "/batchschool/upd-schoolPeriod", funModel: mobel);
+                    await _azureStorage.SaveLog("schoolperiod-add", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                     return Ok(new { state = 200, school });
                 }
@@ -833,6 +839,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-schoolperiod")]
         public async Task<IActionResult> SetSchoolPeriod(JsonElement jsonElement)
         {
@@ -859,7 +866,7 @@ namespace TEAMModeBI.Controllers.BISchool
                     await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdId}【{_tmdName}】已操作修改学校学段信息,修改ID和名称:{_setId}{_setName}", type: "schoolperiod-update", visitApi: "/batchschool/set-schoolperiod", funModel: mobel);
+                    await _azureStorage.SaveLog("schoolperiod-update", $"{_tmdId}【{_tmdName}】修改学校学段信息,修改ID和名称:{_setId}{_setName}", _dingDing, httpContext: HttpContext);
 
                     return Ok(new { state = 200, school });
                 }
@@ -878,6 +885,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("del-schoolperiod")]
         public async Task<IActionResult> DelSchoolPeriod(JsonElement jsonElement)
         {
@@ -902,7 +910,7 @@ namespace TEAMModeBI.Controllers.BISchool
                     await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdId}【{_tmdName}】已操作删除学校的学段,删除学段ID和名称:{_delId}", type: "schoolperiod-del", visitApi: "/batchschool/del-schoolperiod", funModel: mobel);
+                    await _azureStorage.SaveLog("ability-update", $"{_tmdId}【{_tmdName}】删除学校的学段", _dingDing, httpContext: HttpContext);
 
                     return Ok(new { state = 200, school });
                 }
@@ -921,6 +929,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-schoolperiodinfo")]
         public async Task<IActionResult> SetSchoolPeriodInfo(JsonElement jsonElement)
         {
@@ -937,7 +946,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 jsonElement.TryGetProperty("setName", out JsonElement _setName);              //修改学段的名称
                 jsonElement.TryGetProperty("delId", out JsonElement _delId);                  //删除学段的ID
 
-                StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】已操作");
+                StringBuilder stringBuilder = new StringBuilder($"{_tmdId}【{_tmdName}】");
                 string tempType = null;
                 var cosmosClient = _azureCosmos.GetCosmosClient();
 
@@ -990,7 +999,7 @@ namespace TEAMModeBI.Controllers.BISchool
                     }
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: stringBuilder?.ToString(), type: tempType?.ToString(), visitApi: "/batchschool/set-schoolperiodinfo", funModel: mobel);
+                    await _azureStorage.SaveLog(tempType?.ToString(), stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                     await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<School>(school, school.id, new PartitionKey("Base"));
 

+ 3 - 2
TEAMModeBI/Controllers/BISchool/SchoolController.cs

@@ -7,10 +7,10 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text.Json;
 using System.Threading.Tasks;
+using TEAMModeBI.Filter;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 
@@ -86,6 +86,7 @@ namespace TEAMModeBI.Controllers.BISchool
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-schooljoinarea")]
         public async Task<IActionResult> SetSchoolJoinArea(JsonElement jsonElement) 
         {
@@ -116,7 +117,7 @@ namespace TEAMModeBI.Controllers.BISchool
                 }
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作学校加入区域功能,加入的区域:{standard},学校ID:{string.Join("|", schoolCodes.ToArray())}", type: "school-join", visitApi: "/schoolcheck/set-schooljoinarea", funModel: mobel);
+                await _azureStorage.SaveLog("school-join", $"{_tmdName}【{_tmdId}】操作学校加入区域功能,加入的区域:{standard},学校ID:{string.Join("|", schoolCodes.ToArray())}", _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200 });
             }

+ 103 - 67
TEAMModeBI/Controllers/BITest/TestController.cs

@@ -16,13 +16,15 @@ using System.Linq;
 using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
+using TEAMModeBI.Filter;
 using TEAMModelOS.Models;
 using TEAMModelOS.SDK;//引用创建学校Code
 using TEAMModelOS.SDK.Context.Attributes.Azure;
 using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
+using TEAMModelOS.SDK.Helper.Common.DateTimeHelper;
 using TEAMModelOS.SDK.Models;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
+using TEAMModelOS.SDK.Models.Cosmos.Common;
 using TEAMModelOS.SDK.Models.Service;
 using TEAMModelOS.SDK.Models.Table;
 
@@ -373,7 +375,7 @@ namespace TEAMModeBI.Controllers.BITest
                 else return Ok(new { state = 1, message = "创校信息为空" });
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{foundSchools.tmdId}", tmdName: $"{foundSchools.tmdName}", msg: stringBuilder?.ToString(), type: "api-test", visitApi: "/batchschool/batch-school", funModel: mobel);
+                await _azureStorage.SaveLog("operatelog-del", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                 if (schools.Count > 0)
                     return Ok(new { state = 201, message = "已有部分学校批量创建成功;学校编号已经重复!请检查学校编号!", schools = schools });
@@ -388,6 +390,67 @@ namespace TEAMModeBI.Controllers.BITest
         }
 
 
+        [HttpPost("file-table")]
+        public async Task<IActionResult> SaveTable(JsonElement jsonElement)
+        {
+            jsonElement.TryGetProperty("single", out JsonElement single);
+            jsonElement.TryGetProperty("startDate", out JsonElement startDate);
+            jsonElement.TryGetProperty("endDate", out JsonElement endDate);
+            jsonElement.TryGetProperty("platform", out JsonElement platform);
+
+            List<string> strlist = new List<string>();
+            if (!string.IsNullOrEmpty($"{single}"))
+                strlist.Add($"RowKey {QueryComparisons.Equal} {single}");
+            if (!string.IsNullOrEmpty($"{startDate}"))
+                strlist.Add($"RowKey {QueryComparisons.GreaterThanOrEqual} {startDate}");
+            if (!string.IsNullOrEmpty($"{endDate}"))
+                strlist.Add($"RowKey {QueryComparisons.LessThanOrEqual} {endDate}");
+            if (!string.IsNullOrEmpty($"{platform}"))
+                strlist.Add($"platform {QueryComparisons.Equal} {platform}");
+
+            string sql = string.Join(" and ", strlist);
+
+            var temp = _azureStorage.QueryWhereString<OptLog>(sql);
+            return Ok(new { state = 200, temp });
+        }
+
+        /// <summary>
+        /// 查询BI操作记录
+        /// </summary>
+        /// <param name="jsonElement"></param>
+        /// <returns></returns>
+        [HttpPost("get-operatelogbydate")]
+        public async Task<IActionResult> GetOperateLogByDate(JsonElement jsonElement)
+        {
+            try
+            {
+                jsonElement.TryGetProperty("single", out JsonElement single);
+                jsonElement.TryGetProperty("startDate", out JsonElement startDate);
+                jsonElement.TryGetProperty("endDate", out JsonElement endDate);
+                jsonElement.TryGetProperty("platform", out JsonElement platform);
+
+                List<OptLog> operateLogs = null;
+                StringBuilder tableSql = new StringBuilder();
+
+                if (!string.IsNullOrEmpty($"{single}"))
+                    tableSql.Append($"RowKey {QueryComparisons.Equal} '{single}' ");
+                if (!string.IsNullOrEmpty($"{startDate}"))
+                    tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" {TableOperators.And} RowKey {QueryComparisons.GreaterThanOrEqual} '{startDate}' " : $"RowKey {QueryComparisons.GreaterThanOrEqual} '{startDate}' ");
+                if (!string.IsNullOrEmpty($"{endDate}"))
+                    tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" {TableOperators.And} RowKey {QueryComparisons.LessThanOrEqual} '{endDate}' " : $" RowKey { QueryComparisons.LessThanOrEqual} '{endDate}' ");
+                if (!string.IsNullOrEmpty($"{platform}"))
+                    tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" {TableOperators.And} platform {QueryComparisons.Equal} '{platform}' " : $" platform {QueryComparisons.Equal} '{platform}' ");
+
+                operateLogs = await _azureStorage.QueryWhereString<OptLog>(tableSql.ToString());
+                return Ok(new { state = 200, operateLogs });
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"BI,{_option.Location}   /operatelog/get-operatelogbydate    {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
+                return BadRequest();
+            }
+        }
+
         /// <summary>
         /// 查询离职信息
         /// </summary>
@@ -503,52 +566,6 @@ namespace TEAMModeBI.Controllers.BITest
             }
         }
 
-        /// <summary>
-        /// 通过钉钉的UserId查询钉钉信息
-        /// </summary>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("GetDDUserByID")]
-        public async Task<IActionResult> GetDDUserByID()
-        {
-            try
-            {
-                string appKey = _configuration["DingDingAuth:appKey"];
-                string appSecret = _configuration["DingDingAuth:appSecret"];
-                string agentld = _configuration["DingDingAuth:Agentld"];
-
-                //获取access_token
-                IDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
-                OapiGettokenRequest request = new OapiGettokenRequest() { Appkey = appKey, Appsecret = appSecret };
-                request.SetHttpMethod("Get");
-                OapiGettokenResponse response = client.Execute(request);
-                if (response.IsError)
-                {
-                    return BadRequest();
-                }
-
-                //access_token的有效期为7200秒(2小时),有效期内重复获取会返回相同结果并自动续期,过期后获取会返回新的access_token
-                string access_token = response.AccessToken;
-
-
-                IDingTalkClient client3 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
-                OapiV2UserGetRequest v2GetRequest = new OapiV2UserGetRequest()
-                {
-                    Userid = "16405716778495892",
-                    Language = "zh_CN"
-                };
-                OapiV2UserGetResponse v2GetResponse = client3.Execute(v2GetRequest, access_token);
-
-                return Ok(new { state = 200, v2GetResponse.Result });
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"BI , {_option.Location} //   {ex.Message}\n ", GroupNames.成都开发測試群組);
-                return BadRequest();
-
-            }
-        }
-
         /// <summary>
         /// 分页
         /// </summary>
@@ -626,37 +643,56 @@ namespace TEAMModeBI.Controllers.BITest
         /// 保存日志文件
         /// </summary>
         /// <returns></returns>
+        [AuthToken(Roles = "assist")]
         [HttpPost("save-tablelog")]
         public async Task<IActionResult> SaveTableLogTest() 
         {
-            await OperateLogHelper.SaveTableLog(_azureStorage, "BI", "1636016499", "彭礼", "测试保存方法", "table-save", "save-tablelog");
+            //await OperateLogHelper.SaveTableLog(_azureStorage, "BI", "1636016499", "彭礼", "测试保存方法", "table-save", "save-tablelog");
+            await _azureStorage.SaveLog(type:"table-save", msg:"测试保存方法01",dingDing: _dingDing,httpContext:HttpContext);
             return Ok(123);
         }
 
-        [HttpPost("file-table")]
-        public async Task<IActionResult> SaveTable(JsonElement jsonElement)
+        [HttpPost("get-test")]
+        public async Task<IActionResult> test(JsonElement jsonElement)
         {
-            jsonElement.TryGetProperty("single", out JsonElement single);
-            jsonElement.TryGetProperty("startDate", out JsonElement startDate);
-            jsonElement.TryGetProperty("endDate", out JsonElement endDate);
-            jsonElement.TryGetProperty("platform", out JsonElement platform);
+            var cosmosClient = _azureCosmos.GetCosmosClient();
 
-            List<string> strlist = new List<string>();
-            if (!string.IsNullOrEmpty($"{single}"))
-                strlist.Add($"RowKey {QueryComparisons.Equal} {single}");
-            if (!string.IsNullOrEmpty($"{startDate}"))
-                strlist.Add($"RowKey {QueryComparisons.GreaterThanOrEqual} {startDate}");
-            if (!string.IsNullOrEmpty($"{endDate}"))
-                strlist.Add($"RowKey {QueryComparisons.LessThanOrEqual} {endDate}");
-            if (!string.IsNullOrEmpty($"{platform}"))
-                strlist.Add($"platform {QueryComparisons.Equal} {platform}");
+            List<LessonCount> scount = new List<LessonCount>();
 
-            string sql = string.Join(" and ", strlist);
 
-            var temp = _azureStorage.QueryWhereString<OperateLog>(sql);
-            return Ok(new { state = 200, temp });
+
+
+
+
+
+
+
+            List<lessons> lessonCounts = new List<lessons>();
+
+            await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS,"School").GetItemQueryIterator<LessonCount>(queryText:$"select value(c) from c where c.pk='LessonCount'",requestOptions:new QueryRequestOptions() { }))
+            {
+                lessons le = new lessons() {
+                    countB =item.beginCount.Count,
+                    countP = item.pCount.Count,
+                    countT = item.tCount.Count,
+                    countPT = item.ptCount.Count,
+                    lesson = item
+                };
+                lessonCounts.Add(le);
+            }
+
+            return Ok(new { state = 200 , lessonCounts });
         }
 
+        public record lessons 
+        {
+
+            public long countB { get; set; }
+            public long countP { get; set; }
+            public long countT { get; set; }
+            public long countPT { get; set; }
+            public LessonCount lesson { get; set; }
+        }
 
 
         public record pageTest

+ 0 - 173
TEAMModeBI/Controllers/DingDingStruc/DDBackEndController.cs

@@ -1,173 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.DI;
-using Microsoft.Extensions.Configuration;
-using TEAMModelOS.Models;
-using Microsoft.Extensions.Options;
-using System.Text.Json;
-using DingTalk.Api;
-using DingTalk.Api.Request;
-using DingTalk.Api.Response;
-using Azure.Cosmos;
-using TEAMModelOS.SDK.Models;
-using System.Net.Http;
-using System.Text;
-using TEAMModelOS.SDK.Extension;
-using System.Net;
-using HTEXLib.COMM.Helpers;
-using TEAMModelOS.SDK.Models.Cosmos.BI;
-using System.Net.Http.Json;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
-
-namespace TEAMModeBI.Controllers.DingDingStruc
-{
-    [Route("backend")]
-    [ApiController]
-    public class DDBackEndController : ControllerBase
-    {
-        //获取配置信息
-        private readonly IConfiguration _configuration;
-        //数据容器
-        private readonly AzureCosmosFactory _azureCosmos;
-        //table和blob的容器
-        private readonly AzureStorageFactory _azureStorage;
-        //钉钉提示信息
-        private readonly DingDing _dingDing;
-        private readonly Option _option;
-
-        private readonly IHttpClientFactory _http;
-        string type = "ddteammodel";
-
-        public DDBackEndController(IConfiguration configuration, AzureCosmosFactory azureCosmos, DingDing dingDing, IOptionsSnapshot<Option> option, AzureStorageFactory azureStorage, IHttpClientFactory http) 
-        {
-            _configuration = configuration;
-            _azureCosmos = azureCosmos;
-            _dingDing = dingDing;
-            _option = option?.Value;
-            _azureStorage = azureStorage;
-            _http = http;
-        }
-
-        /// <summary>
-        /// 后端管理员管理:钉钉信息绑定醍摩豆账户信息
-        /// </summary>
-        /// <param name="jsonElement"></param>
-        /// <returns></returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("get-backendbind")]
-        public async Task<IActionResult> GetBackEndBind(JsonElement jsonElement) 
-        {
-            try
-            {
-                if (!jsonElement.TryGetProperty("dduserid", out JsonElement dduserid)) return BadRequest();
-                jsonElement.TryGetProperty("binTmdId", out JsonElement _binTmdId);
-                jsonElement.TryGetProperty("mobile", out JsonElement mobile);
-                if (!jsonElement.TryGetProperty("tmdId", out JsonElement _tmdId)) return BadRequest();
-                if (!jsonElement.TryGetProperty("tmdName", out JsonElement _tmdName)) return BadRequest();
-
-                string str_appKey = _configuration["DingDingAuth:appKey"];
-                string str_appSecret = _configuration["DingDingAuth:appSecret"];
-
-                //获取企业内部应用的accessToken
-                DefaultDingTalkClient Iclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
-                OapiGettokenRequest request = new OapiGettokenRequest();
-                request.Appkey = str_appKey;
-                request.Appsecret = str_appSecret;
-                request.SetHttpMethod("GET");
-                OapiGettokenResponse tokenResponse = Iclient.Execute(request);
-                if (tokenResponse.IsError)
-                {
-                    return Ok(new { state = 0, message = "code获取失败!" });
-                }
-
-                string access_token = tokenResponse.AccessToken;
-                //依据钉钉UserID查询钉钉用户信息
-                IDingTalkClient client3 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
-                OapiV2UserGetRequest v2GetRequest = new OapiV2UserGetRequest() { Userid = $"{dduserid}", Language = "zh_CN" };
-                OapiV2UserGetResponse v2GetResponse = client3.Execute(v2GetRequest, access_token);
-                if (v2GetResponse.IsError)
-                {
-                    return Ok(new { state = 0, message = "扫码登录失败!" });
-                }
-
-                //将钉钉的用信息赋值给实体类
-                Teacher.DingDingBind ddbs = new Teacher.DingDingBind
-                {
-                    type = type,
-                    deptIdList = v2GetResponse.Result.DeptIdList,
-                    title = v2GetResponse.Result.Title,
-                    name = v2GetResponse.Result.Name,
-                    unionid = v2GetResponse.Result.Unionid,
-                    userid = v2GetResponse.Result.Userid,
-                };
-
-                //检查是否有绑定信息
-                var client = _azureCosmos.GetCosmosClient();
-                Teacher teacher = null;
-
-                if (!string.IsNullOrEmpty($"{mobile}"))
-                {
-                    HttpClient httpClient = _http.CreateClient();
-                    List<JsonElement> mbs = new List<JsonElement>() { mobile };
-                    string url = _configuration.GetValue<string>("HaBookAuth:CoreId:userinfo");
-                    HttpResponseMessage responseMessage = await httpClient.PostAsJsonAsync(url, mbs);
-                    if (responseMessage.StatusCode == HttpStatusCode.OK)
-                    {
-                        string responseBody = await responseMessage.Content.ReadAsStringAsync();
-                        List<JsonElement> json_id = responseBody.ToObject<List<JsonElement>>();
-                        string temp_id = null;
-                        if (json_id.IsNotEmpty())
-                        {
-                            temp_id = json_id[0].GetProperty("id").ToString();
-                        }
-
-                        teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>(temp_id, new PartitionKey("Base"));
-                        if (teacher != null)
-                        {
-                            var ddbind = teacher.ddbinds.Find(x => x.userid.Equals($"{ddbs.userid}") && x.unionid.Equals($"{ddbs.unionid}"));
-                            if (ddbs == null)
-                            {
-                                teacher.ddbinds = new List<Teacher.DingDingBind> { new Teacher.DingDingBind { type = ddbs.type, deptIdList = ddbs.deptIdList, title = ddbs.title, name = ddbs.name, unionid = ddbs.unionid, userid = ddbs.userid } };
-                                await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, teacher.id, new PartitionKey(teacher.code));
-                            }
-                            else return Ok(new { state = 3, message = "钉钉信息和醍摩豆绑定的信息相同!" });
-                        }
-                        else return Ok(new { state = 1, message = "通过手机号查询用户异常!" });
-                    }
-                    else return Ok(new { state = 1, message = "通过手机号查询用户异常!" });
-                }
-
-                if (!string.IsNullOrEmpty($"{_binTmdId}"))
-                {
-                    teacher = await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReadItemAsync<Teacher>($"{_binTmdId}", new PartitionKey("Base"));
-                    if (teacher != null)
-                    {
-                        var ddbind = teacher.ddbinds.Find(x => x.userid.Equals($"{ddbs.userid}") && x.unionid.Equals($"{ddbs.unionid}"));
-                        if (ddbind == null)
-                        {
-                            teacher.ddbinds = new List<Teacher.DingDingBind> { new Teacher.DingDingBind { type = ddbs.type, deptIdList = ddbs.deptIdList, title = ddbs.title, name = ddbs.name, unionid = ddbs.unionid, userid = ddbs.userid } };
-                            await client.GetContainer(Constant.TEAMModelOS, "Teacher").ReplaceItemAsync<Teacher>(teacher, teacher.id, new PartitionKey(teacher.code));
-                        }
-                        else return Ok(new { state = 3, message = "钉钉信息和醍摩豆绑定的信息相同!" });
-                    }
-                    else return Ok(new { state = 2, message = "醍摩豆账户有误,请检查醍摩豆账户!" });
-                }
-
-                //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】醍摩豆账号和{v2GetResponse.Result.Name}【{v2GetResponse.Result.Userid}】钉钉账户绑定成功", type: "tabledd-del", visitApi: "/ddbackend/get-backendbind", funModel: "绑定");
-
-                return Ok(new { state = 200, message = "绑定成功!" });
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"BI,{_option.Location} /ddbackend/get-backendbind \n {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
-                return BadRequest();
-            }
-        }
-
-    }
-}

+ 11 - 6
TEAMModeBI/Controllers/DingDingStruc/TableDingDingInfoController.cs

@@ -20,8 +20,8 @@ using TEAMModelOS.SDK.Extension;
 using OpenXmlPowerTools;
 using System.Text;
 using Azure.Cosmos;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
 using Microsoft.Azure.Cosmos.Table;
+using TEAMModeBI.Filter;
 
 namespace TEAMModeBI.Controllers.DingDingStruc
 {
@@ -56,6 +56,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
         /// </summary>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("get-dingdingusers")]
         public async Task<IActionResult> GetDingDingUser(JsonElement jsonElement)
         {
@@ -161,7 +162,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
                 }
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】账户操作从钉钉组织结构更新至Azure Table表【DDUserInfo】中。", type: "tabledd-update", visitApi: "/tabledd/get-dingdingusers", funModel: mobel);
+                await _azureStorage.SaveLog("tabledd-update", $"{_tmdName}【{_tmdId}】从钉钉组织结构更新至Azure Table表【DDUserInfo】中。", _dingDing, httpContext: HttpContext);
 
                 var tempddUserInfos = ddUserInfos.GroupBy(c => c.RowKey).Select(c => c.First()).ToList();//去重
                 //List<DingDingUserInfo> TempdingDingUserInfos = await _azureStorage.SaveOrUpdateAll(dingDingUserInfos);  //只是保存至Table
@@ -233,6 +234,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
         /// </summary>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-ddinductionuser")]
         public async Task<IActionResult> SetDingDingInductionUser(JsonElement jsonElement)
         {
@@ -277,7 +279,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
                     List<DingDingUserInfo> tempddUserInfos = await _azureStorage.SaveAll(ddUserInfos);
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作添加待入职员工至table数据表中", type: "tabledd-add", visitApi: "/tabledd/set-ddinductionuser", funModel: mobel);
+                    await _azureStorage.SaveLog("tabledd-add", $"{_tmdName}【{_tmdId}】添加待入职员工至table数据表中", _dingDing, httpContext: HttpContext);
 
                     if (ddUserInfos.Count == tempddUserInfos.Count)
                     {
@@ -306,6 +308,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
         /// </summary>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("del-ddquituser")]
         public async Task<IActionResult> DeleteDDQuitUser(JsonElement jsonElement)
         {
@@ -343,7 +346,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
                     }
 
                     //保存操作记录
-                    await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作从table数据表中删除离职员工", type: "tabledd-del", visitApi: "/tabledd/del-ddquituser", funModel: mobel);
+                    await _azureStorage.SaveLog("tabledd-del", $"{_tmdName}【{_tmdId}】从table数据表中删除离职员工", _dingDing, httpContext: HttpContext);
 
                     return Ok(new { state = 200 });
                 }
@@ -366,6 +369,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-permissions")]
         public async Task<IActionResult> SetPermissions(JsonElement jsonElement)
         {
@@ -407,7 +411,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
                 ddUserInfo = await _azureStorage.UpdateAll<DingDingUserInfo>(ddUserInfo);
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: stringBuilder?.ToString(), type: "tabledd-del", visitApi: "/tabledd/set-permissions", funModel: "BI权限");
+                await _azureStorage.SaveLog("tabledd-update", stringBuilder?.ToString(), _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, ddUserInfo, roles, permissions });
             }
@@ -505,6 +509,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
         /// <param name="jsonElement"></param>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("set-backenbind")]
         public async Task<IActionResult> set(JsonElement jsonElement) 
         {
@@ -572,7 +577,7 @@ namespace TEAMModeBI.Controllers.DingDingStruc
                 if (ddUsers.Count > 0) ddUsers = await _azureStorage.SaveOrUpdateAll(ddUsers);
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: $"{_tmdName}【{_tmdId}】已操作绑定钉钉[{rowKey}]和醍摩豆账户[{tmdId}]", type: "tabledd-update", visitApi: "/tabledd/set-backenbind", funModel: "绑定");
+                await _azureStorage.SaveLog("tabledd-update", $"{_tmdName}【{_tmdId}】操作:绑定钉钉账户[{rowKey}]和醍摩豆账户[{tmdId}]", _dingDing, httpContext: HttpContext);
 
                 return Ok(new { state = 200, ddUsers });
             }

+ 5 - 3
TEAMModeBI/Controllers/LoginController.cs

@@ -29,7 +29,7 @@ using Newtonsoft.Json.Linq;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 using Azure.Storage.Sas;
 using System.Net.Http.Json;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
+using TEAMModeBI.Filter;
 //using static DingTalk.Api.Response.OapiV2UserGetResponse;
 
 namespace TEAMModeBI.Controllers
@@ -515,6 +515,7 @@ namespace TEAMModeBI.Controllers
         /// </summary>
         /// <returns></returns>
         [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
         [HttpPost("binguser")]
         public async Task<IActionResult> BindUser(JsonElement jsonElement) 
         {
@@ -549,7 +550,8 @@ namespace TEAMModeBI.Controllers
                                 itemUser.mail = item.GetProperty("mail").ToString();
 
                                 //保存操作记录
-                                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{tmdId}", tmdName: $"{tmdName}", msg: $"{tmdName}【{tmdId}】醍摩豆账号和{itemUser.name}【{itemUser.RowKey}】钉钉账户绑定成功", type: "tabledd-update", visitApi: "/common/login/binguser", funModel: "绑定");
+                                await _azureStorage.SaveLog("tabledd-update", $"{tmdName}【{tmdId}】醍摩豆账号和{itemUser.name}【{itemUser.RowKey}】钉钉账户绑定成功", _dingDing, httpContext: HttpContext);
+
                                 ddUserInfos.Add(itemUser);
                             }
                         }
@@ -632,7 +634,7 @@ namespace TEAMModeBI.Controllers
                                 ddUserInfos = await _azureStorage.UpdateAll<DingDingUserInfo>(ddUserInfos);
 
                                 //保存操作记录
-                                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: tmdId?.ToString(), tmdName: tmdName?.ToString(), msg: $"{tmdName}【{tmdId}】醍摩豆账号和{itemUser.name}【{itemUser.RowKey}】钉钉账户绑定成功", type: "tabledd-update", visitApi: "/common/login/get-ddinfo", funModel: "绑定");
+                                await _azureStorage.SaveLog("tabledd-update", $"{tmdName}【{tmdId}】醍摩豆账号和{itemUser.name}【{itemUser.RowKey}】钉钉账户绑定成功", _dingDing, httpContext: HttpContext);
                             }
                             else return Ok(new { state = 400, message = "该手机没有注册醍摩豆账号信息" });
                         }

+ 39 - 35
TEAMModeBI/Controllers/OperateRecord/OperateLogController.cs

@@ -12,7 +12,7 @@ using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
 using System.Text;
 using TEAMModelOS.SDK.Models.Table;
-using TEAMModelOS.SDK.Helper.Common.TableHelper;
+using TEAMModeBI.Filter;
 
 namespace TEAMModeBI.Controllers.OperateRecord
 {
@@ -36,45 +36,41 @@ namespace TEAMModeBI.Controllers.OperateRecord
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
-        [HttpPost("get-operatelogbydate")]
-        public async Task<IActionResult> GetOperateLogByDate(JsonElement jsonElement) 
+        [HttpPost("get-record")]
+        public async Task<IActionResult> GetOperateLogRecord(JsonElement jsonElement)
         {
-            try
-            {
-                jsonElement.TryGetProperty("single", out JsonElement single);
-                jsonElement.TryGetProperty("startDate", out JsonElement startDate);
-                jsonElement.TryGetProperty("endDate", out JsonElement endDate);
-                jsonElement.TryGetProperty("platform", out JsonElement platform);
-
-                List<OperateLog> operateLogs = null;
-                StringBuilder tableSql = new StringBuilder();
-
-                if (!string.IsNullOrEmpty($"{single}"))
-                    tableSql.Append($"RowKey {QueryComparisons.Equal} '{single}' ");
-                if (!string.IsNullOrEmpty($"{startDate}"))
-                    tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" {TableOperators.And} RowKey {QueryComparisons.GreaterThanOrEqual} '{startDate}' " : $"RowKey {QueryComparisons.GreaterThanOrEqual} '{startDate}' ");
-                if (!string.IsNullOrEmpty($"{endDate}"))
-                    tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" {TableOperators.And} RowKey {QueryComparisons.LessThanOrEqual} '{endDate}' " : $" RowKey { QueryComparisons.LessThanOrEqual} '{endDate}' ");
-                if(!string.IsNullOrEmpty($"{platform}"))
-                    tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" {TableOperators.And} platform {QueryComparisons.Equal} '{platform}' " : $" platform {QueryComparisons.Equal} '{platform}' ");
-
-                operateLogs = await _azureStorage.QueryWhereString<OperateLog>(tableSql.ToString());
-                return Ok(new { state = 200, operateLogs });
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"BI,{_option.Location}   /operatelog/get-operatelogbydate    {ex.Message}{ex.StackTrace}", GroupNames.成都开发測試群組);
-                return BadRequest();
-            }
+            jsonElement.TryGetProperty("single", out JsonElement single);
+            jsonElement.TryGetProperty("startDate", out JsonElement startDate);
+            jsonElement.TryGetProperty("endDate", out JsonElement endDate);
+            jsonElement.TryGetProperty("platform", out JsonElement platform);
+
+            List<OptLog> operateLogs = null;
+            StringBuilder tableSql = new StringBuilder();
+
+            if (!string.IsNullOrEmpty($"{single}"))
+                tableSql.Append($" time eq {single}L ");
+            if (!string.IsNullOrEmpty($"{startDate}"))
+                tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" and time le {startDate}L " : $"time le {startDate}L ");
+            if (!string.IsNullOrEmpty($"{endDate}"))
+                tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" and time ge {endDate}L " : $" time ge {endDate}L ");
+            if (!string.IsNullOrEmpty($"{platform}"))
+                tableSql.Append(!string.IsNullOrEmpty(tableSql.ToString()) ? $" and platform eq '{platform}' " : $" platform eq '{platform}' ");
+
+            operateLogs = await _azureStorage.QueryWhereString<OptLog>(tableSql.ToString());
+            return Ok(new { state = 200, operateLogs });
         }
 
+
+
         /// <summary>
         /// 删除操作记录
         /// </summary>
         /// <param name="jsonElement"></param>
         /// <returns></returns>
-        [HttpPost("del-operatelogbydate")]
-        public async Task<IActionResult> DelOperateLogByDate(JsonElement jsonElement) 
+        [ProducesDefaultResponseType]
+        [AuthToken(Roles = "assist")]
+        [HttpPost("del-record")]
+        public async Task<IActionResult> DelOperateLogRecord(JsonElement jsonElement) 
         {
             try
             {
@@ -94,13 +90,13 @@ namespace TEAMModeBI.Controllers.OperateRecord
                 }
                 else
                 {
-                    tableStrWhere.Append($"RowKey {QueryComparisons.GreaterThanOrEqual} '{startDate}'{TableOperators.And} RowKey {QueryComparisons.LessThanOrEqual} '{endDate}'");
+                    tableStrWhere.Append($"time le {startDate}L and time ge {endDate}L ");
                     operateStr.Append($"删除的时间戳,开始——结束时间戳:{startDate}-{endDate}");
                 }
-                var temp = await _azureStorage.DeleteStringWhere<OperateLog>(rowKey: tableStrWhere.ToString());
+                var temp = await _azureStorage.DeleteStringWhere<OptLog>(rowKey: tableStrWhere.ToString());
 
                 //保存操作记录
-                await OperateLogHelper.SaveTableLog(_azureStorage, platform: "BI", tmdId: $"{_tmdId}", tmdName: $"{_tmdName}", msg: operateStr?.ToString(), type: "operatelog-del", visitApi: "/operatelog/del-operatelogbydate", funModel: "日志");
+                await _azureStorage.SaveLog("operatelog-del", operateStr?.ToString(), _dingDing, httpContext: HttpContext);
 
                 if (temp.Count > 0)
                 {
@@ -116,6 +112,14 @@ namespace TEAMModeBI.Controllers.OperateRecord
         }
 
 
+        public async Task<IActionResult> GetLogTmdId(JsonElement jsonElement) 
+        {
+            if (!jsonElement.TryGetProperty("tmdId", out JsonElement tmd)) return BadRequest();
+
+
+            return Ok(new { state = 200 });
+        }
+
 
 
 

+ 3 - 5
TEAMModeBI/Filter/AuthTokenAttribute.cs

@@ -39,7 +39,7 @@ namespace TEAMModeBI.Filter
             public void OnResourceExecuting(ResourceExecutingContext context)
             {
                 bool pass = false;
-                string id = string.Empty, name = string.Empty, picture = string.Empty, school = string.Empty, standard = string.Empty, scope = string.Empty;
+                string id = string.Empty, name = string.Empty, picture = string.Empty, school = string.Empty, standard = string.Empty, scope = string.Empty, website = string.Empty;
                 List<string> _role = new List<string>();
                 var authtoken = context.HttpContext.GetXAuth("AuthToken");
                 if (!string.IsNullOrWhiteSpace(authtoken) && JwtAuthExtension.ValidateAuthToken(authtoken, _option.JwtSecretKey))
@@ -49,8 +49,7 @@ namespace TEAMModeBI.Filter
                     school = jwt.Payload.Azp;
                     name = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("name"))?.Value;
                     picture = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("picture"))?.Value;
-                    standard = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("standard"))?.Value;
-                    scope = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("scope"))?.Value;
+                    website = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("website"))?.Value;
                     if (!string.IsNullOrWhiteSpace(_roles))
                     {
                         var roles = jwt.Claims.Where(c => c.Type.Equals("roles"));
@@ -84,9 +83,8 @@ namespace TEAMModeBI.Filter
                     context.HttpContext.Items.Add("Name", name);
                     context.HttpContext.Items.Add("Picture", picture);
                     context.HttpContext.Items.Add("School", school);
-                    context.HttpContext.Items.Add("Standard", standard);
                     context.HttpContext.Items.Add("Roles", _role);
-                    context.HttpContext.Items.Add("Scope", scope);
+                    context.HttpContext.Items.Add("Website", website);
                 }
                 else
                     context.Result = new BadRequestResult();

+ 16 - 1
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs

@@ -264,16 +264,31 @@ namespace TEAMModelOS.SDK.DI
                 return false;
             }
         }
+
+        /// <summary>
+        /// 保存操作记录
+        /// </summary>
+        /// <param name="azureStorage"></param>
+        /// <param name="type"></param>
+        /// <param name="msg"></param>
+        /// <param name="dingDing"></param>
+        /// <param name="scope"></param>
+        /// <param name="bizId"></param>
+        /// <param name="option"></param>
+        /// <param name="httpContext"></param>
+        /// <returns></returns>
         public static async Task SaveLog(this AzureStorageFactory azureStorage, string type, string msg,DingDing dingDing, string scope = null, string bizId = null, Option option = null, HttpContext httpContext = null)
         {
             OptLog log = new OptLog() { RowKey = Guid.NewGuid().ToString() };
             try
             {
-                object id = null, school = null, website = null ;
+                object id = null, school = null, name = null, website = null ;
                 httpContext?.Items.TryGetValue("ID", out id);
                 httpContext?.Items.TryGetValue("School", out school);
+                httpContext?.Items.TryGetValue("Name", out name);
                 httpContext?.Items.TryGetValue("Website", out website);
                 log.tmdId = id != null ? $"{id}" : log.tmdId;
+                log.name = name != null ? $"{name}" : log.name;
                 string host = httpContext?.Request?.Host.Value;
                 log.school = school != null ? $"{school}" : log.school;
                 log.PartitionKey = type != null ? $"Log-{type}" : "Log-Default";

+ 0 - 46
TEAMModelOS.SDK/Helper/Common/TableHelper/OperateLogHelper.cs

@@ -1,46 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using System.Threading.Tasks;
-using TEAMModelOS.SDK.DI;
-using TEAMModelOS.SDK.Models.Table;
-
-namespace TEAMModelOS.SDK.Helper.Common.TableHelper
-{
-    public class OperateLogHelper
-    {
-        /// <summary>
-        /// 保存操作日志
-        /// </summary>
-        /// <param name="_azureStorage"></param>
-        /// <param name="platform">日志平台:BI 、 IES5</param>
-        /// <param name="tmdId">醍摩豆ID</param>
-        /// <param name="tmdName">醍摩豆名称</param>
-        /// <param name="msg">操作描述</param>
-        /// <param name="type">日志类型: school-update school-del    名词-动词组合方式</param>
-        /// <param name="visitApi">访问接口</param>
-        /// <param name="funModel">模块名称 存中文</param>
-        /// <param name="scope">使用范围  private school</param>
-        /// <param name="owner">数据归属  学校编码或者醍摩豆id</param>
-        /// <param name="leve">日志等级,1普通 2重要 3非常重要</param>
-        /// <returns></returns>
-        public static async Task SaveTableLog(AzureStorageFactory _azureStorage, string platform, string tmdId, string tmdName, string msg, string type, string visitApi,string funModel = null, string scope = null, string owner = null, int leve = 1)
-        {
-            OperateLog operateLog = new OperateLog();
-            operateLog.PartitionKey = $"Log-{platform}";
-            operateLog.RowKey = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
-            operateLog.platform = platform;
-            operateLog.tmdId = tmdId;
-            operateLog.tmdName = tmdName;
-            operateLog.msg = msg;
-            operateLog.type = type;
-            operateLog.visitApi = visitApi;
-            operateLog.funModule = $"{funModel}";
-            operateLog.scope = $"{scope}";
-            operateLog.owner = $"{owner}";
-            operateLog.leve = leve;
-
-            await _azureStorage.Save<OperateLog>(operateLog);
-        }
-    }
-}

+ 5 - 58
TEAMModelOS.SDK/Models/Table/OperateLog.cs

@@ -5,77 +5,24 @@ using TEAMModelOS.SDK.Context.Attributes.Azure;
 using Microsoft.Azure.Cosmos.Table;
 
 namespace TEAMModelOS.SDK.Models.Table
-{
-    [TableName(Name = "OperateLog")]
-    public class OperateLog : TableEntity
+{    
+    [TableName(Name = "OptLog")]
+    public class OptLog : TableEntity
     {
         /// <summary>
         /// 日志平台:BI 、 IES5
         /// </summary>
         public string platform { get; set; }
 
-        /// <summary>
-        /// 日志等级,1普通 2重要 3非常重要
-        /// </summary>
-        public int leve { get; set; } = 1;
-
         /// <summary>
         /// 醍摩豆ID
         /// </summary>
         public string tmdId { get; set; }
 
         /// <summary>
-        /// 醍摩豆名称
-        /// </summary>
-        public string tmdName { get; set; }
-
-        /// <summary>
-        /// 操作描述
-        /// </summary>
-        public string msg { get; set; }
-
-        /// <summary>
-        /// 日志类型: school-update school-del    名词-动词组合方式
-        /// </summary>
-        public string type { get; set; }
-
-        /// <summary>
-        /// 模块名称 存中文
-        /// </summary>
-        public string funModule { get; set; }
-
-        /// <summary>
-        /// 访问接口
-        /// </summary>
-        public string visitApi { get; set; }
-
-        /// <summary>
-        /// 使用范围  private school
-        /// </summary>
-        public string scope { get; set; }
-
-        /// <summary>
-        /// 数据归属  学校编码或者醍摩豆id
-        /// </summary>
-        public string owner { get; set; }
-
-        /// <summary>
-        /// 学校编码
-        /// </summary>
-        public string school { get; set; }
-    }
-    [TableName(Name = "OptLog")]
-    public class OptLog : TableEntity
-    {
-        /// <summary>
-        /// 日志平台:BI 、 IES5
-        /// </summary>
-        public string platform { get; set; }
-
-        /// <summary>
-        /// 醍摩豆ID
+        /// 账号名称
         /// </summary>
-        public string tmdId { get; set; }
+        public string name { get; set; }
 
         /// <summary>
         /// 操作描述

+ 27 - 19
TEAMModelOS/ClientApp/src/common/BaseUserPoptip.vue

@@ -3,10 +3,10 @@
         <div style="display: flex;">
             <Dropdown placement="bottom-end">
                 <div style="display: flex;align-items: center;">
-					<PersonalPhoto style="cursor: pointer;" :name="userInfo.username" :picture="user.picture" :color="userInfo.nameColor"/>
-					<span class="text-cut" style="color: #d0cfc3;margin-left: 10px;font-size: 14px;cursor: pointer;max-width: 80px;">{{userInfo.username}}</span>
-					<Icon type="md-arrow-dropdown" color="#fff" size="16"/>
-				</div>
+                    <PersonalPhoto style="cursor: pointer;" :name="userInfo.username" :picture="user.picture" :color="userInfo.nameColor" />
+                    <span class="text-cut" style="color: #d0cfc3;margin-left: 10px;font-size: 14px;cursor: pointer;max-width: 80px;">{{userInfo.username}}</span>
+                    <Icon type="md-arrow-dropdown" color="#fff" size="16" />
+                </div>
                 <DropdownMenu slot="list" class="user-center-wrap">
                     <DropdownItem class="user-info-wrap" @click.native="toUserCenter()">
                         <p>{{userInfo.username}}</p>
@@ -29,24 +29,24 @@
                         <Icon type="ios-settings" class="drop-item-icon" />
                         {{$t('user.systemSet')}}
                     </DropdownItem>
-
                     <DropdownItem @click.native="onQuit">
                         <Icon type="md-power" class="drop-item-icon" />
                         {{$t('utils.logout')}}
                     </DropdownItem>
+                    <DropdownItem divided @click.native="toVersion" :disabled="!isDev" :style="{cursor:!isDev ? 'text': ''}">
+                        <Icon type="logo-vimeo" class="drop-item-icon" v-if="version" />
+                        {{version}}
+                    </DropdownItem>
                     <!-- <DropdownItem divided class="drop-item" disabled style="cursor: text;">
                         <Icon type="ios-information-circle-outline" class="drop-item-icon" />
                         V {{version}}
                     </DropdownItem> -->
-					<DropdownItem divided class="drop-item" disabled style="cursor: text;">
-						<Icon type="logo-vimeo" class="drop-item-icon" v-if="version"/>
-						{{version}}
+                    <DropdownItem class="drop-item" disabled style="cursor: text;">
                         <template v-if="$store.state.config.srvAdr === 'China'">
-                            <br>
-                            <Icon type="ios-information-circle-outline" class="drop-item-icon"/>
-                           {{ $t('utils.standrad') }}:{{ curStandard ? curStandard.replace('standard','') : $t('utils.noData') }}
+                            <Icon type="ios-information-circle-outline" class="drop-item-icon" />
+                            {{ $t('utils.standrad') }}:{{ curStandard ? curStandard.replace('standard','') : $t('utils.noData') }}
                         </template>
-					</DropdownItem>
+                    </DropdownItem>
                 </DropdownMenu>
             </Dropdown>
         </div>
@@ -105,6 +105,12 @@ export default {
         })
     },
     methods: {
+        //前往版本更新页面
+        toVersion() {
+            this.$router.push({
+                name: 'version'
+            })
+        },
         /* 切换校级平台或区级平台 */
         changePlatform() {
             let goPlatform = this.curPlatform === 'area' ? 'school' : 'area'
@@ -112,9 +118,9 @@ export default {
             this.$router.push({
                 name: goPlatform === 'area' ? 'area' : homePath
             })
-			if(goPlatform === 'area'){
-				localStorage.removeItem('curPeriod')
-			}
+            if (goPlatform === 'area') {
+                localStorage.removeItem('curPeriod')
+            }
             localStorage.setItem('platform', this.curPlatform === 'area' ? 'school' : 'area')
             this.curPlatform = goPlatform
         },
@@ -173,7 +179,9 @@ export default {
     },
 
     computed: {
-
+        isDev(){
+            return process.env.NODE_ENV == 'development'
+        },
         getSizeVal() {
             return val => {
                 return this.$tools.bytesToSize(val)
@@ -187,9 +195,9 @@ export default {
         hasArea() {
             return this.$store.state.user.userProfile.areas.length > 0
         },
-		curStandard(){
-			return this.$store.state.user.schoolProfile.school_base ? this.$store.state.user.schoolProfile.school_base.standard : ''
-		}
+        curStandard() {
+            return this.$store.state.user.schoolProfile.school_base ? this.$store.state.user.schoolProfile.school_base.standard : ''
+        }
     },
 
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -8,7 +8,7 @@
 			<span style="margin-top: 15px; color: #808080">{{$t('evaluation.noData')}}</span>
 		</div>
 		<div class="cp-content-wrap" ref="mathJaxContainer" v-else>
-			<p style="color: #1b87e6;text-align: end;text-decoration: underline;cursor: pointer;" v-if="!isAnalysis"><span @click="onSelectAll">选择本页所有题目</span></p>
+			<p style="color: #1b87e6;text-align: end;text-decoration: underline;cursor: pointer;" v-if="!isAnalysis"><span @click="onSelectAll">{{ $t('evaluation.choosePageItems') }}</span></p>
 			<div class="cp-exercise-item" v-for="(item, index) of exerciseList" :key="index">
 				<!-- 题干部分 -->
 				<div class="item-question"  @click="onQuestionToggle(index, item.id, $event)">

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js

@@ -174,8 +174,8 @@ export default {
     setOk:'Set up successfully',
     setErr:'Failed to set up',
     uploadErr:'Failed to upload profile picture',
-    deleteGroup:'刪除分組',
-    delGroupContent:'確認刪除',
+    deleteGroup:'Delete Group',
+    delGroupContent:'Are you sure to delete',
     setAvatarLabel:'Set Profile Picture',
     classStuErr:'Failure to obtain class list',
     unGroup:'未分組學生',

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/evaluation.js

@@ -1,4 +1,6 @@
 export default {
+	saving:'試卷保存中...',
+	choosePageItems:'Select all items in this book',
 	completeTip:'Please complete the subject, grade and semester data for the current school system first!',
 	canChoose:'choice(s)',
 	importItems:'Import Question',

+ 2 - 2
TEAMModelOS/ClientApp/src/locale/lang/en-US/schoolBaseInfo.js

@@ -249,6 +249,6 @@ export default {
   updErr:'Failed to modify',
   warmTips: 'Reminder',
   noStuContent:'The school has not imported any student account, do you want to go to Student Management to import student accounts?',
-  setIrsWarning:'請設置IRS編號',
-  setNoWarning:'請設置座號'
+  setIrsWarning:'Please set IRS number',
+  setNoWarning:'Please set seat number'
 }

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js

@@ -39,6 +39,7 @@ export default {
         homework: "Homework",
         vote: "Poll",
         survey: "Survey",
+        wrongTopic: "错题本",
     },
     state: [
         {

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/en-US/system.js

@@ -82,5 +82,6 @@ export default {
         tbColErr1:'Data not imported',
         tbColErr2: ',please complete the form information before importing',
         fileReadErr:'Failed to read file'
-    }
+    },
+    versionLog:'醍摩豆雲平台更新日誌'
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/evaluation.js

@@ -1,4 +1,6 @@
 export default {
+	saving:'试卷保存中...',
+	choosePageItems:'选择本页所有题目',
 	completeTip:'请先完善当前学段的科目、年级及学期数据!',
 	canChoose:'道题可选',
 	importItems:'试题导入',

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -39,6 +39,7 @@ export default {
         homework: "作业",
         vote: "投票",
         survey: "问卷",
+        wrongTopic: "错题本",
     },
     state: [
         {

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/system.js

@@ -82,5 +82,6 @@ export default {
         tbColErr1:'导入数据没有',
         tbColErr2: ',请完善表格数据再导入',
         fileReadErr:'文件读取失败'
-    }
+    },
+    versionLog:'醍摩豆云平台更新日志'
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/evaluation.js

@@ -1,4 +1,6 @@
 export default {
+	saving:'試卷保存中...',
+	choosePageItems:'選擇本頁所有題目',
 	completeTip:'請先完善當前學段的科目、年級及學期數據!',
 	canChoose:'道題可選',
 	importItems:'試題導入',

+ 1 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -39,6 +39,7 @@ export default {
         homework: "作業",
         vote: "投票",
         survey: "問卷",
+        wrongTopic: "錯題本",
     },
     state: [
         {

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/system.js

@@ -82,5 +82,6 @@ export default {
         tbColErr1: '沒有匯入到數據',
         tbColErr2: ',請完善表格資料再匯入',
         fileReadErr: '檔案讀取失敗'
-    }
+    },
+    versionLog:'醍摩豆雲平台更新日誌'
 }

+ 9 - 0
TEAMModelOS/ClientApp/src/router/routes.js

@@ -1101,6 +1101,15 @@ export const routes = [{
 			activeName: 'serviceDriveAuth'
 		}
 	},
+	//版本更新日志
+	{
+		path: 'version',
+		name: 'version',
+		component: resolve => require(['@/view/system/Version.vue'], resolve),
+		meta: {
+			activeName: 'version'
+		}
+	},
 	//学校产品授权管理
 	{
 		path: 'auth',

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -1477,7 +1477,7 @@
 										size: 18
 									}
 								}),
-								h('div', '试卷保存中...')
+								h('div', this.$t('evaluation.saving'))
 							])
 						}
 					});

+ 1 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.less

@@ -22,7 +22,7 @@
             color: @primary-textColor;
             padding-left: 15px;
             font-size: 16px;
-            width: 150px;
+            width: fit-content;
             display: inline-block;
         }
 

+ 1 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.less

@@ -22,7 +22,7 @@
             color: @primary-textColor;
             padding-left: 20px;
             font-size: 16px;
-            width: 150px;
+            width: fit-content;
             display: inline-block;
         }
 

+ 224 - 0
TEAMModelOS/ClientApp/src/view/system/Version.vue

@@ -0,0 +1,224 @@
+<template>
+    <div class="version-container">
+        <vuescroll>
+            <div class="version-box">
+                <h1 class="update-title">{{$t('system.versionLog')}}</h1>
+                <Timeline style="margin-top:30px;">
+                    <TimelineItem v-for="(item) in versionList" :key="item.version">
+                        <p class="version">
+                            {{item.version}}
+                            <span class="version-title">
+                                {{item.title}}
+                            </span>
+                        </p>
+                        <p class="version-time">
+                            {{item.time}}
+                        </p>
+                        <ul style="margin-left:20px">
+                            <li v-for="(detail,index) in item.detail" :key="index" style="margin-top:5px">
+                                <!-- <span>
+                                    {{detail.tag}}
+                                </span> -->
+                                <span>
+                                    {{detail.content}}
+                                </span>
+                            </li>
+                        </ul>
+                    </TimelineItem>
+                </Timeline>
+            </div>
+        </vuescroll>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            versionList: [
+                {
+                    version: '1.0.0.0',
+                    title: '第一版',
+                    time: '2020.01.01',
+                    detail: [
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                    ]
+                },
+                {
+                    version: '1.0.0.0',
+                    title: '第一版',
+                    time: '2020.01.01',
+                    detail: [
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                    ]
+                },
+                {
+                    version: '1.0.0.0',
+                    title: '第一版',
+                    time: '2020.01.01',
+                    detail: [
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        },
+                        {
+                            tag: '功能',
+                            content: '醍摩豆IES5全新上线'
+                        }
+                    ]
+                }
+            ]
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+.version-container {
+    width: 100%;
+    height: 100%;
+    background: #f3f3f3;
+}
+.version-box {
+    width: 1000px;
+    margin: auto;
+    background: white;
+    padding: 20px 30px;
+    border-radius: 8px;
+    box-shadow: 0px 0px 15px #999999;
+}
+.version-time {
+    background: #fff5f5;
+    color: #fa795e;
+    width: fit-content;
+    // margin-left: 5px;
+    border-radius: 3px;
+    padding: 2px 5px;
+}
+.update-title {
+    color: #17233d;
+    font-size: 22px;
+    text-align: center;
+}
+.version {
+    margin-top: -5px;
+    font-weight: 600;
+    font-size: 18px;
+}
+.version-title {
+    margin-left: 5px;
+}
+</style>
+<style lang="less">
+.version-container .__view {
+    padding: 30px 50px;
+}
+</style>

+ 1 - 1
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -1324,7 +1324,7 @@ namespace TEAMModelOS.Controllers.Client
                         string targetScope = dbExamInfo.scope; //評測對象 school:校本班級  private:私人課程
                         var blobPrivateContainer = _azureStorage.GetBlobContainerClient(id);
                         string sourceBlobPath = recordPaperInfoDic["blob"];
-                        string destBlobPath = $"exam/{dbExamInfo.id}/paper/{recordPaperInfoDic["id"]}/"; //拷貝對象路徑 path:exam/{評測ID}/paper/{試卷ID}/
+                        string destBlobPath = $"exam/{dbExamInfo.id}/paper/{recordPaperInfoDic["subjectId"]}/"; //拷貝對象路徑 path:exam/{評測ID}/paper/{subjectID}/  ※2022-1-6 式樣變更[原]/paper/{試卷ID}/ [新]/paper/{subjectID}/
                         if (targetScope.Equals("school")) //校本
                         {
                             string schoolId = dbExamInfo.school;

+ 1 - 1
TEAMModelOS/Controllers/School/SchoolController.cs

@@ -560,7 +560,7 @@ namespace TEAMModelOS.Controllers
                     }
                 }
 
-                return Ok(new { prodinfo, serial = serialResult, service = serviceOrder, hard, spaceinfo });
+                return Ok(new { serial = serialResult, service = serviceOrder, hard, spaceinfo });
             }
             catch (Exception ex)
             {

+ 2 - 0
TEAMModelOS/Controllers/School/StudentController.cs

@@ -1677,6 +1677,7 @@ namespace TEAMModelOS.Controllers
                                     if (id.Equals(stuList.members[j].id) && stuList.members[j].code.Equals(schoolId))
                                     {
                                         stuList.members.RemoveAt(j);
+                                        stuList.scount -= 1;
                                         break;
                                     }
                                 }
@@ -1692,6 +1693,7 @@ namespace TEAMModelOS.Controllers
                                     if (id.Equals(stuList.members[j].id) && stuList.members[j].code.Equals(schoolId))
                                     {
                                         stuList.members.RemoveAt(j);
+                                        stuList.scount -= 1;
                                         break;
                                     }
                                 }