Sfoglia il codice sorgente

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

zhouj1203@hotmail.com 2 anni fa
parent
commit
3b13c33eae
26 ha cambiato i file con 867 aggiunte e 693 eliminazioni
  1. 5 0
      TEAMModelBI/ClientApp/src/store/index.js
  2. 56 5
      TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/createdpush.vue
  3. 9 4
      TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/index.vue
  4. 4 280
      TEAMModelBI/Controllers/BITest/TestController.cs
  5. 7 2
      TEAMModelBI/Controllers/Census/SchoolController.cs
  6. 6 3
      TEAMModelBI/TEAMModelBI.csproj
  7. 8 10
      TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs
  8. 3 7
      TEAMModelOS.SDK/Context/Attributes/Filter/ApiTokenAttribute.cs
  9. 3 3
      TEAMModelOS.SDK/DI/HttpTrigger/HttpTrigger.cs
  10. 7 7
      TEAMModelOS.SDK/Models/Cosmos/BI/StatsInfo.cs
  11. 5 5
      TEAMModelOS.SDK/Models/Cosmos/OpenEntity/OStudent.cs
  12. 43 41
      TEAMModelOS.SDK/Models/Service/BI/BICommonWay.cs
  13. 447 123
      TEAMModelOS.SDK/Models/Service/BI/BIStats.cs
  14. 12 2
      TEAMModelOS.SDK/Models/Service/BI/TimeHelper.cs
  15. 6 3
      TEAMModelOS.SDK/Models/Service/BIStatsWay/ActivityStatsWay.cs
  16. 10 7
      TEAMModelOS.SDK/Models/Service/BIStatsWay/LessonRecordStatsWay.cs
  17. 1 1
      TEAMModelOS/ClientApp/public/lang/zh-CN.js
  18. 119 118
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  19. 6 1
      TEAMModelOS/ClientApp/src/router/routes.js
  20. 1 1
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaBase.vue
  21. 14 0
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaIndex.vue
  22. 74 51
      TEAMModelOS/ClientApp/src/view/areaMgmt/AreaLayout.vue
  23. 1 1
      TEAMModelOS/ClientApp/src/view/research-center/ReportPreview.vue
  24. 1 1
      TEAMModelOS/Controllers/Analysis/ClassAnalysisController.cs
  25. 18 17
      TEAMModelOS/Controllers/Both/ShareController.cs
  26. 1 0
      TEAMModelOS/Controllers/OpenApi/Business/BizCustomizeController.cs

+ 5 - 0
TEAMModelBI/ClientApp/src/store/index.js

@@ -22,6 +22,7 @@ export default createStore({
         areaClickschool: {},
         areaClickCounselor: '',
         areaClickRoles: '',
+        msgData: {}
     },
     mutations: {
         //修改组织架构
@@ -94,6 +95,10 @@ export default createStore({
         //学区点击人员查看详情 (传输身份)
         clickRoles(state, value) {
             state.areaClickRoles = value
+        },
+        //复用消息
+        copyMsgs(state, value) {
+            state.msgData = value
         }
     },
     actions: {},

+ 56 - 5
TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/createdpush.vue

@@ -282,6 +282,9 @@
           <i class="line"></i>
           <div class="candidate-result">
             <p class="candidate-hint">接收人群</p>
+            <div class="clearbox">
+              <el-button size="small" :icon="Delete" @click="clearall">全部清除</el-button>
+            </div>
             <div class="receivebox">
               <el-tag class="crowd-tag" v-for="item in receivedatas" :type="item.dataType==='area' ? 'warning':item.dataType ==='school' ? 'success' :'' " closable @close="removecrowd(item)">
                 {{item.name}}
@@ -448,15 +451,18 @@
 </template>
 <script setup>
 import { ref, getCurrentInstance, watch, onMounted, computed } from 'vue'
-import { ArrowRight, Search, User, Finished } from '@element-plus/icons-vue'
+import { ArrowRight, Search, User, Finished, Delete } from '@element-plus/icons-vue'
 import { ElMessageBox, ElMessage, ElLoading } from 'element-plus'
 import zhCn from "element-plus/lib/locale/lang/zh-cn";
 import { useRouter } from 'vue-router'
+import { useStore } from 'vuex'
 let locale = zhCn
 let { proxy } = getCurrentInstance()
 let logoImg = require('@/assets/img/logox.png')
 let active = ref(0)
 let router = useRouter()
+const store = useStore()
+console.log(router.params, '路由参数')
 //发送消息总信息
 let constructorData = ref({
   basic: {
@@ -592,16 +598,19 @@ function timechange (val) {
 }
 //搜索
 function searchSchool () {
-  console.log(state, '进入搜索')
   let state = searchStateinfo.value
+  console.log(state, batchSearch.value, '进入搜索')
   state === 'single' ? searchLoding.value.single = true : state === 'batch' ? searchLoding.value.batch = true : ''
   if (state === 'single') {
     if (!preciseSearch.value) { return }
   } else if (state === 'batch') { if (!batchSearch.value) return }
   let searchvalue = state === 'single' ? preciseSearch.value : state === 'batch' ? batchSearch.value : ''
-  let isCharacter = batchSearch.value.indexOf(',') !== -1 ? batchSearch.value.replace(/,/ig, ',').split(',') : false
-  let isEnter = batchSearch.value.indexOf('\n') !== -1 ? batchSearch.value.replace(/\n/ig, ',').split(',') : false
-  let data = state === 'single' ? { ids: [preciseSearch.value] } : state === 'batch' ? { ids: isCharacter ? isCharacter : isEnter ? isEnter : batchSearch.value } : ''
+  let isCharacter = ''; let isEnter = ''
+  if (state === 'batch') {
+    isCharacter = batchSearch.value.indexOf(',') !== -1 ? batchSearch.value.replace(/,/ig, ',').split(',') : false
+    isEnter = batchSearch.value.indexOf('\n') !== -1 ? batchSearch.value.replace(/\n/ig, ',').split(',') : false
+  }
+  let data = state === 'single' ? { ids: [preciseSearch.value] } : state === 'batch' ? { ids: isCharacter ? isCharacter : isEnter ? isEnter : batchSearch.value.split(',') } : ''
   proxy.$api.informSearch(data).then((res) => {
     console.log(res, '搜索返回')
     res.state === 200 ? state === 'single' ? (perciseResult.value = res.userinfos, searchLoding.value.single = false) : state === 'batch' ? (batchResult.value.user = res.userinfos, batchResult.value.not = res.noFound, searchLoding.value.batch = false) : '' : ''
@@ -788,6 +797,39 @@ function debounce (fn, wait) {
   }
   timer.value = setTimeout(fn, wait)
 }
+function reusedata (value) {
+  console.log(value, '进入复用方法')
+  let reuses = value
+  constructorData.value.basic.title = reuses.theme
+  constructorData.value.basic.content = reuses.content
+  constructorData.value.basic.skipstate = reuses.skipstate
+  constructorData.value.basic.skipUrl = reuses.jumpUrl
+  constructorData.value.basic.callbackstate = reuses.callbackstate
+  constructorData.value.basic.callbackFn = reuses.callbackUrl
+  constructorData.value.basic.type = reuses.type
+  constructorData.value.receivedata.area = reuses.crowd.areaIds
+  constructorData.value.receivedata.school = reuses.crowd.schoolIds
+  constructorData.value.receivedata.personage = reuses.crowd.tmdIds
+  constructorData.value.receiveType = 'hita'
+  constructorData.value.source = reuses.source
+  constructorData.value.timeType = 'immediately'
+  constructorData.value.time = 0
+  receiveArr.value.listArea = reuses.crowd.areaIds
+  receiveArr.value.listSchool = reuses.crowd.schoolIds
+  receiveArr.value.listPersonage = reuses.crowd.tmdIds
+  receiveArr.value.listBatchperson = reuses.crowd.tmdIds
+  active.value = 0
+}
+function clearall () {
+  constructorData.value.receivedata.area = []
+  constructorData.value.receivedata.school = []
+  constructorData.value.receivedata.personage = []
+  constructorData.value.receivedata.batchPersonage = []
+  receiveArr.value.listArea = []
+  receiveArr.value.listSchool = []
+  receiveArr.value.listPersonage = []
+  receiveArr.value.listBatchperson = []
+}
 initSchool()
 watch(preciseSearch, (newdata) => {
   if (newdata.trim().length !== 0) {
@@ -806,6 +848,9 @@ watch(batchSearch, (newbatch) => {
     batchResult.value.not = []
   }
 })
+watch(store.state.msgData, (newvalue) => {
+  newvalue.hasOwnProperty('crowd') ? reusedata(newvalue) : ''
+}, { immediate: true, deep: true })
 </script>
 <style scoped>
 .createdpush {
@@ -897,6 +942,7 @@ watch(batchSearch, (newbatch) => {
   line-height: 18px;
   background: #74b9ff;
   color: #ecf0f1;
+  margin-bottom: 5px;
 }
 .line {
   width: 1px;
@@ -1236,6 +1282,11 @@ watch(batchSearch, (newbatch) => {
   width: 40%;
   color: #f89898;
 }
+.clearbox {
+  width: 100%;
+  text-align: right;
+  padding-right: 2%;
+}
 </style>
 <style>
 .skip-switch .el-form-item__content {

+ 9 - 4
TEAMModelBI/ClientApp/src/view/systemConfig/pushmsg/index.vue

@@ -63,9 +63,10 @@
           <div class="type">
             <p class="result-title">接收产品类型</p>
             <div class="typebox">
-              <el-tag class="crowd-tag" v-for="item in nowPitch.crowd.types" :type="item ==='HiTeach' ? '':item ==='HiTA' ? 'success':item ==='IES5' ? 'info':''" effect="dark" round>
+              <!-- <el-tag class="crowd-tag" v-for="item in nowPitch.crowd.types" :type="item ==='HiTeach' ? '':item ==='HiTA' ? 'success':item ==='IES5' ? 'info':''" effect="dark" round>
                 {{item}}
-              </el-tag>
+              </el-tag> -->
+              <el-tag class="crowd-tag" :type="item ==='HiTeach' ? '':item ==='HiTA' ? 'success':item ==='IES5' ? 'info':''" effect="dark" round>{{nowPitch.crowd.types}}</el-tag>
             </div>
           </div>
           <div class="push-content">
@@ -133,7 +134,7 @@
           </div>
         </div>
         <div class="copybox">
-          <el-button>复用此条消息</el-button>
+          <el-button @click="copyReuse">复用此条消息</el-button>
         </div>
         <div class="back">
           <el-button @click="backs">返回列表</el-button>
@@ -148,10 +149,12 @@ import { ChatDotSquare } from '@element-plus/icons-vue'
 import { ElMessageBox, ElMessage, ElLoading } from 'element-plus'
 import zhCn from "element-plus/lib/locale/lang/zh-cn";
 import { useRouter } from 'vue-router'
+import { useStore } from 'vuex'
 let value1 = ref('')
 let { proxy } = getCurrentInstance()
 let locale = zhCn
 const router = useRouter()
+const store = useStore()
 let tableData = ref([
   // {
   //   theme: '测试主题1',
@@ -251,7 +254,9 @@ function backs () {
   init()
 }
 function copyReuse () {
-
+  store.commit('copyMsgs', nowPitch.value)
+  router.push('/home/createdpush')
+  console.log(store.state.msgData, '数据')
 }
 init()
 </script>

+ 4 - 280
TEAMModelBI/Controllers/BITest/TestController.cs

@@ -1749,6 +1749,7 @@ namespace TEAMModelBI.Controllers.BITest
         /// 每天执行一次
         /// </summary>
         /// <returns></returns>
+        [HttpPost("set-statszero")]
         public async Task<IActionResult> SetStatsZero() 
         {
             await BIStats.SetStatsZeroPoint(_azureCosmos, _dingDing);
@@ -1764,287 +1765,10 @@ namespace TEAMModelBI.Controllers.BITest
         public async Task<IActionResult> SetStats(JsonElement json)
         {
             var cosmosClient = _azureCosmos.GetCosmosClient();
-            //await BIStats.SetTypeAddStats(cosmosClient, "hbcn", "Less", 0, 1, 6);//BI统计增/减量
+            var SETR = _option.Location;
+            await BIStats.SetTypeAddStats(cosmosClient, _dingDing, "hbcn", "Student", 1, careDate: 1672796684915);
 
-            string scId = null, type = null;
-            long careDate = 0;
-            int count = 0;
-            int interaction = 0;
-            int lessType = 0;
-
-            DateTimeOffset cuurDateOff = DateTimeOffset.UtcNow;
-            DateTimeOffset dateOff = DateTimeOffset.UtcNow;
-            if (json.TryGetProperty("scId", out JsonElement _schoolId))
-                scId = $"{_schoolId}";
-            if (json.TryGetProperty("type", out JsonElement _type))
-                type = $"{_type}";
-            if (string.IsNullOrEmpty($"{_schoolId}") && string.IsNullOrEmpty($"{_type}"))
-            {
-                await _dingDing.SendBotMsg($"set-scstats-type, {json}", GroupNames.成都开发測試群組);
-                return Ok(new { state = RespondCode.ParamsError, msg = "参数错误!" });
-            }
-            if (json.TryGetProperty("cnt", out JsonElement _cnt))
-                count = _cnt.GetInt32();
-
-            if(json.TryGetProperty("interaction", out JsonElement _interaction))
-                interaction = _interaction.GetInt32();
-            if (json.TryGetProperty("lessType", out JsonElement _lessType))
-                lessType = _lessType.GetInt32();
-
-            if (json.TryGetProperty("date", out JsonElement _date))
-                careDate = _date.GetInt64();
-            else
-                careDate = dateOff.ToUnixTimeMilliseconds();
-
-            if (string.IsNullOrEmpty(scId))
-                return Ok(new { state = 400});
-
-            //DateTimeOffset cuurDateOff = DateTimeOffset.UtcNow;
-            //DateTimeOffset dateOff = DateTimeOffset.UtcNow;
-            if (careDate > 1000000000000)
-                dateOff = DateTimeOffset.FromUnixTimeMilliseconds(careDate);
-            else
-                dateOff = DateTimeOffset.FromUnixTimeSeconds(careDate);
-            if (careDate == 0)
-            {
-                dateOff = DateTimeOffset.UtcNow;
-                careDate = dateOff.ToUnixTimeMilliseconds();
-            }
-
-            var (lastWeekS, lastWeekE) = TimeHelper.GetStartOrEnd(dateOff, "lastweek");   //计算上周开始/结束时间
-            var (weekS, weekE) = TimeHelper.GetStartOrEnd(dateOff, "week");             //计算本周开始/结束时间
-            var (lastMonthS, lastMonthE) = TimeHelper.GetStartOrEnd(dateOff, "lastMonth");   //上月开始/结束时间
-            var (monthS, monthE) = TimeHelper.GetStartOrEnd(dateOff, "month");             //本月开始/结束时间
-            var (lastTermS, lastTermE) = TimeHelper.GetStartOrEnd(dateOff, "lastterm");   //计算上学期开始/结束时间
-            var (termS, termE) = TimeHelper.GetStartOrEnd(dateOff, "term");   //计算本学期开始/结束时间
-
-            var (yearS, yearE) = TimeHelper.GetStartOrEnd(cuurDateOff, "year");   //计算本学期开始/结束时间
-
-            var (weekDayS, weekDayE) = TimeHelper.GetLongToTime(weekS, weekE);
-            var (lWeekDayS, lWeekDayE) = TimeHelper.GetLongToTime(lastWeekS, lastWeekE);
-            var (lTermDayS, lTermDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
-            var (termDayS, termDayE) = TimeHelper.GetLongToTime(lastTermS, lastTermE);
-            var (lMonthS, lMonthE) = TimeHelper.GetLongToTime(lastMonthS, lastMonthE);
-            var (monthDayS, monthDayE) = TimeHelper.GetLongToTime(monthS, monthE);
-            var lastDay = dateOff.AddDays(-1);
-            int lmthDay = TimeHelper.GetDateDay(lMonthE);
-            StatsInfo statsInfo = new();
-
-            var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
-            if (resStsInfo.Status == 200)
-            {
-                using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
-                statsInfo = fileJson.ToObject<StatsInfo>();
-            }
-            else
-            {
-                var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
-                if (resLastStsInfo.Status == 200)
-                {
-                    using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
-                    statsInfo = fileJson.ToObject<StatsInfo>();
-                    statsInfo.id = $"{dateOff.Year}-{scId}";
-                    statsInfo.year = dateOff.Year;
-                    statsInfo.stuYear = new double[366].ToList();
-                    statsInfo.tchYear = new double[366].ToList();
-                    statsInfo.lesson.year = new double[366].ToList();
-                    statsInfo.lesson.yearInters = new double[366].ToList();
-                    statsInfo.activity.year = new double[366].ToList();
-                }
-                else
-                {
-                    ScBase scBase = await cosmosClient.GetContainer("TEAMModelOS", "School").ReadItemAsync<ScBase>(scId, new PartitionKey("Base"));
-                    statsInfo.id = $"{dateOff.Year}-{scBase.id}";
-                    statsInfo.schoolId = scBase.id;
-                    statsInfo.name = scBase.name;
-                    statsInfo.picture = scBase.picture;
-                    statsInfo.size = scBase.size;
-                    statsInfo.scCreateTime = scBase.createTime;
-                    statsInfo.areaId = scBase.areaId;
-                    statsInfo.upTime = careDate;
-                    statsInfo.stuYear = new double[366].ToList();
-                    statsInfo.tchYear = new double[366].ToList();
-                    statsInfo.lesson.year = new double[366].ToList();
-                    statsInfo.lesson.yearInters = new double[366].ToList();
-                    statsInfo.activity.year = new double[366].ToList();
-                }
-            }
-
-            switch ($"{type}")
-            {
-                case "Exam":
-                    statsInfo.activity.exam += count;
-                    break;
-                case "Survey":
-                    statsInfo.activity.survey += count;
-                    break;
-                case "Vote":
-                    statsInfo.activity.vote += count;
-                    break;
-                case "Homework":
-                    statsInfo.activity.homework += count;
-                    break;
-                case "Less":
-                    //课例
-                    statsInfo.lesson.year[dateOff.DayOfYear] += count;
-                    statsInfo.lesson.all += count;
-
-                    if (lessType == 0)
-                        statsInfo.lesson.open += count;
-                    else
-                        statsInfo.lesson.less += count;
-
-                    statsInfo.lesson.lastDay = ((int)statsInfo.lesson.year[lastDay.DayOfYear]);
-                    statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear]);
-
-                    var lessList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.lesson.year });
-                    statsInfo.lesson.lastWeek = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear, (dateOff.DayOfYear - weekDayS.DayOfYear), 0, lessList.ColumnCount).ColumnSums().Sum());
-
-                    StatsInfo lastStats = null;
-                    var resLast = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
-                    if (resLast.Status == 200)
-                    {
-                        using var fileJson = await JsonDocument.ParseAsync(resLast.ContentStream);
-                        lastStats = fileJson.ToObject<StatsInfo>();
-                    }
-
-                    int lastTerm = 0;
-                    if (lTermDayS.Year < dateOff.Year)
-                    {
-                        if (lastStats != null) 
-                        {
-                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                            lastTerm += ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lastStats.lesson.year.Count - lTermDayS.DayOfYear, 0, 1).ColumnSums().Sum());
-                        }
-                        lastTerm += ((int)lessList.SubMatrix(0, lTermDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
-                    }
-                    else
-                        lastTerm += ((int)lessList.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear - lTermDayS.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.lesson.lastTerm = lastTerm;
-
-                    int term = 0;
-                    if (termDayE.Year > dateOff.Year)
-                    {
-                        if (lastStats != null)
-                            term = ((int)lessList.SubMatrix(termDayS.DayOfYear, (statsInfo.lesson.year.Count - termDayS.DayOfYear), 0, lessList.ColumnCount).ColumnSums().Sum());
-                    }
-                    else
-                        term = ((int)lessList.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear - termDayS.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.lesson.term = term;
-
-                    statsInfo.lesson.lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, lessList.ColumnCount).ColumnSums().Sum());
-
-                    //课例互动
-                    statsInfo.lesson.yearInters[dateOff.DayOfYear] += interaction;
-                    statsInfo.lesson.allInter += interaction;
-                    statsInfo.lesson.lastDayInter = ((int)statsInfo.lesson.yearInters[lastDay.DayOfYear]);
-                    statsInfo.lesson.dayInter = ((int)statsInfo.lesson.yearInters[dateOff.DayOfYear]);
-
-                    var interList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.lesson.yearInters });
-                    statsInfo.lesson.lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.lesson.monthInter += ((int)interList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, interList.ColumnCount).ColumnSums().Sum());
-
-                    int lastTermI = 0;
-                    if (lastStats != null)
-                    {
-                        var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                        lastTermI += ((int)actYer.SubMatrix(0, lastStats.lesson.year.Count, 0, actYer.ColumnCount).ColumnSums().Sum());
-                    }
-                    statsInfo.lesson.lastYearInter = lastTermI;
-
-                    statsInfo.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    break;
-                case "Student":
-                    statsInfo.stuYear[dateOff.DayOfYear] += count;
-                    statsInfo.stu += count;
-
-                    statsInfo.dayStu = ((int)statsInfo.stuYear[dateOff.DayOfYear]);
-                    var stuList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.stuYear });
-                    statsInfo.weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear, (dateOff.DayOfYear - weekDayS.DayOfYear), 0, stuList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.monthStu = ((int)stuList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, stuList.ColumnCount).ColumnSums().Sum());
-
-                    statsInfo.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    break;
-                case "Teacher":
-
-                    statsInfo.tchYear[dateOff.DayOfYear] += count;
-                    statsInfo.tch += count;
-
-                    statsInfo.dayTch = ((int)statsInfo.tchYear[dateOff.DayOfYear]);
-                    var tchList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.tchYear });
-                    statsInfo.weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear, (dateOff.DayOfYear - weekDayS.DayOfYear), 0, tchList.ColumnCount).ColumnSums().Sum());
-                    statsInfo.monthTch = ((int)tchList.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, tchList.ColumnCount).ColumnSums().Sum());
-
-                    statsInfo.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    break;
-            }
-
-            if ($"{type}".Equals("Exam") || $"{type}".Equals("Survey") || $"{type}".Equals("Vote") || $"{type}".Equals("Homework"))
-            {
-                statsInfo.activity.all += count;
-                if (careDate >= yearS && careDate <= yearE)
-                {
-                    if (count > 0)
-                    {
-                        statsInfo.activity.year[dateOff.DayOfYear] += count;
-                        DenseMatrix matris = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
-                        statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear]);
-                        statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear]);
-                        statsInfo.activity.lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear, lWeekDayE.DayOfYear- lWeekDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                        statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear, weekDayE.DayOfYear - weekDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-
-                        StatsInfo lastStats = null;
-                        var resLast = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
-                        if (resLast.Status == 200)
-                        {
-                            using var fileJson = await JsonDocument.ParseAsync(resLast.ContentStream);
-                            lastStats = fileJson.ToObject<StatsInfo>();
-                        }
-
-                        int lastTerm = 0;
-                        if (lTermDayS.Year < dateOff.Year)
-                        {
-                            if (lastStats != null)
-                            {
-                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                                lastTerm += ((int)actYer.SubMatrix(lTermDayS.DayOfYear, lastStats.lesson.year.Count - lTermDayS.DayOfYear, 0, 1).ColumnSums().Sum());
-                            }
-                            lastTerm += ((int)matris.SubMatrix(0, lTermDayE.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                            lastTerm += ((int)matris.SubMatrix(lTermDayS.DayOfYear, lTermDayE.DayOfYear- lTermDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                        statsInfo.activity.lastTerm = lastTerm;
-
-
-                        int term = 0;
-                        if (termDayS.Year > dateOff.Year)
-                        {
-                            if (lastStats != null)
-                            {
-                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                                term += ((int)actYer.SubMatrix(termDayS.DayOfYear, lastStats.lesson.year.Count - termDayS.DayOfYear, 0, 1).ColumnSums().Sum());
-                            }
-                            term += ((int)matris.SubMatrix(0, termDayE.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                        }
-                        else
-                            term += ((int)matris.SubMatrix(termDayS.DayOfYear, termDayE.DayOfYear - termDayS.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
-                        statsInfo.activity.term = term;
-
-                        statsInfo.activity.lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
-                        statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
-                        statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                    }
-                }
-            }
-
-            if (resStsInfo.Status == 200)
-                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Statistics"));
-            else
-                statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").CreateItemAsync<StatsInfo>(statsInfo, new PartitionKey("Statistics"));
-
-            return Ok(new { state = 200, statsInfo });
+            return Ok(new { state = 200 });
         }
 
 

+ 7 - 2
TEAMModelBI/Controllers/Census/SchoolController.cs

@@ -710,6 +710,7 @@ namespace TEAMModelBI.Controllers.Census
             List<BIRelStats> bIRelStats = new();
 
             List<string> tempProduct = new();
+
             await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<BIRelStats>(queryText: scSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("BIRel") }))
             {
                 bIRelStats.Add(item);
@@ -718,7 +719,7 @@ namespace TEAMModelBI.Controllers.Census
                 tempProduct.AddRange(item.hard);
             }
 
-            if(bIRelStats.Count > 0)
+            if (bIRelStats.Count > 0)
                 scIds = bIRelStats.Select(s => s.id).ToList();
             //scIds = await CommonFind.FindScIds(cosmosClient, scSql.ToString(), "BIRel");
 
@@ -1099,10 +1100,14 @@ namespace TEAMModelBI.Controllers.Census
             int scCnt = await JointlySingleQuery.GetValueInt(cosmosClient, "Normal", "Base", sql);
             int scWeekCnt = await JointlySingleQuery.GetValueInt(cosmosClient, "Normal", "Base", $"{sql} where c.createTime >= {weekS} and c.createTime <= {weekE}");
             int scMonthCnt = await JointlySingleQuery.GetValueInt(cosmosClient, "Normal", "Base", $"{sql} where c.createTime >= {mthS} and c.createTime <= {mthE}");
-
+            List<string> scId = new();
             await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: $"select value(c) from c where c.year={dateTime.Year}", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
             {
                 statsInfos.Add(item);
+                if (item.activity.year.Count > 366) 
+                {
+                    scId.Add(item.id);
+                }
             }
             List<AreaInfoStats> areaGroup = statsInfos.GroupBy(p => p.areaId).Select(s => new AreaInfoStats() { areaId = s.Key, name = easyInfos.Where(f => f.id.Equals(s.Key)).Select(sn=>sn.name).FirstOrDefault(), lessAct = (s.Select(sl => sl.lesson.all).Sum() + s.Select(sa => sa.activity.all).Sum()), lessCnt = s.Select(sl => sl.lesson.all).Sum(), actCnt = s.Select(sa => sa.activity.all).Sum() }).ToList();
 

+ 6 - 3
TEAMModelBI/TEAMModelBI.csproj

@@ -55,6 +55,9 @@
 	    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
 	  </Content>
 	</ItemGroup>
+	<ItemGroup>
+	  <Folder Include="wwwroot\" />
+	</ItemGroup>
 	<PropertyGroup>
 		<SpaRoot>ClientApp\</SpaRoot>
 		<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
@@ -65,9 +68,9 @@
 		<SpaRoot>ClientApp\</SpaRoot>
 		<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
 		<UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-		<Version>1.2212.30</Version>
-		<AssemblyVersion>1.2212.30.1</AssemblyVersion>
-		<FileVersion>1.2212.30.1</FileVersion>
+		<Version>1.2301.04</Version>
+		<AssemblyVersion>1.2301.04.1</AssemblyVersion>
+		<FileVersion>1.2301.04.1</FileVersion>
 		<Description>TEAMModelBI(BI)</Description>
 		<PackageReleaseNotes>BI版本说明版本切换标记2022000908</PackageReleaseNotes>
 		<PackageId>TEAMModelBI</PackageId>

+ 8 - 10
TEAMModelOS.FunctionV4/ServiceBus/ActiveTaskTopic.cs

@@ -514,22 +514,20 @@ namespace TEAMModelOS.FunctionV4.ServiceBus
                 await ActivityService.FixActivity(client, _dingDing, groupChange, "Art");
                 //TODO学习活动
                 //await FixActivity(client, stuListChange, "Learn");
-                if (groupChange.type.Equals("class") || groupChange.type.Equals("teach") || groupChange.type.Equals("student") )
-                {
-                    await _httpTrigger.RequestHttpTrigger(new { data = groupChange }, Environment.GetEnvironmentVariable("Option:Location"), "webhook/group-member-change");
-                    if (groupChange.stujoin.Count > 0)
-                        await BIStats.SetTypeAddStats(client,_dingDing, groupChange.school, "Student", groupChange.stujoin.Count);//BI统计增/减量
-                    if (groupChange.stuleave.Count > 0)
-                        await BIStats.SetTypeAddStats(client,_dingDing, groupChange.school, "Student", -groupChange.stuleave.Count);//BI统计增/减量
-                }
-
                 if (groupChange.type == null || !groupChange.type.Equals("research") || !groupChange.type.Equals("yxtrain") || !groupChange.type.Equals("activity"))
                 {
                     //课程名单变动修改学生课程关联信息
                     await ActivityService.FixStuCourse(client, _dingDing, groupChange);
                     //名单变动修改课例关联信息
                     //await ActivityService.FixLessonRecord(client, _dingDing, groupChange);
-                   
+                }
+                if (groupChange.type.Equals("class") || groupChange.type.Equals("teach") || groupChange.type.Equals("student"))
+                {
+                    await _httpTrigger.RequestHttpTrigger(new { data = groupChange }, Environment.GetEnvironmentVariable("Option:Location"), "webhook/group-member-change");
+                    if (groupChange.stujoin.Count > 0)
+                        await BIStats.SetTypeAddStats(client, _dingDing, groupChange.school, "Student", groupChange.stujoin.Count);//BI统计增/减量
+                    if (groupChange.stuleave.Count > 0)
+                        await BIStats.SetTypeAddStats(client, _dingDing, groupChange.school, "Student", -groupChange.stuleave.Count);//BI统计增/减量
                 }
             }
             catch (Exception ex)

+ 3 - 7
TEAMModelOS.SDK/Context/Attributes/Filter/ApiTokenAttribute.cs

@@ -142,18 +142,14 @@ namespace TEAMModelOS.Filter
                         string iss = jwt.Payload.Iss; //iss 检查jwt是否是测试站,正式站的授权key 
                         string tokenScope = jwt.Claims.FirstOrDefault(claim => claim.Type.Equals("scope"))?.Value;
                         //访问的jwt的tokenScope 是否与访问的接口一致。
-                        if (tokenScope.Equals(scope))
+                        if (tokenScope.Contains(scope))
                         {
 
                             var keys = OpenApiJtwIssuer.OpenApiJtw签发者.GetDescriptionText().Split(',');
                             string issuer = "";
                             if (_option.Location.Equals("China-Dep"))
                             {
-#if !DEBUG
                                 issuer = keys[0];
-#else
-                                issuer = keys[1];
-#endif
                             }
                             else if (_option.Location.Equals("China-Test"))
                             {
@@ -321,7 +317,7 @@ namespace TEAMModelOS.Filter
                     }
                     else
                     {
-                        JsonResult jsonResult = new JsonResult(new { msg = "未授权", code = 401 });
+                        JsonResult jsonResult = new JsonResult(new { msg = !string.IsNullOrWhiteSpace(msg)?msg:"未授权", code = code !=0?code :401 });
                         jsonResult.StatusCode = 401;
                         context.Result = jsonResult;
                     }
@@ -330,7 +326,7 @@ namespace TEAMModelOS.Filter
                 {
                     msg = "该接口暂未授权访问!";
                     code = 401010;
-                    JsonResult jsonResult = new JsonResult(new { msg = "未授权", code = 401 });
+                    JsonResult jsonResult = new JsonResult(new { msg = !string.IsNullOrWhiteSpace(msg) ? msg : "未授权", code = code != 0 ? code : 401 });
                     jsonResult.StatusCode = 401;
                     context.Result = jsonResult;
                 }

+ 3 - 3
TEAMModelOS.SDK/DI/HttpTrigger/HttpTrigger.cs

@@ -50,15 +50,15 @@ namespace TEAMModelOS.SDK.DI
             }
             else if (location.Equals("Global-Dep"))
             {
-                domain = keys[4];
+                domain = keys[3];
             }
             else if (location.Equals("Global-Test"))
             {
-                domain = keys[4];
+                domain = keys[3];
             }
             else if (location.Equals("Global"))
             {
-                domain = keys[5];
+                domain = keys[4];
             }
             string link = domain.Contains("localhost") ? $"http://{domain}/api/{url}" : $"https://{domain}/api/{url}";
             HttpContent httpContent = new StringContent(data.ToJsonString());

+ 7 - 7
TEAMModelOS.SDK/Models/Cosmos/BI/StatsInfo.cs

@@ -68,7 +68,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// 教师每年每天新增数量
         /// </summary>
-        public List<double> tchYear { get; set; } = new List<double>(366);
+        public List<double> tchYear { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 教师更新时间
@@ -97,7 +97,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// 学生每年每天新增数量
         /// </summary>
-        public List<double> stuYear { get; set; } = new List<double>(366);
+        public List<double> stuYear { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 学生信息更新时间
@@ -238,17 +238,17 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// 今年互动
         /// </summary>
-        public List<double> yearInters { get; set; } = new List<double>(366);
+        public List<double> yearInters { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 去年每天的数据  366天
         /// </summary>
-        //public List<double> LastYear { get; set; } = new List<double>();
+        //public List<double> LastYear { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 今年每天的数据 366天
         /// </summary>
-        public List<double> year { get; set; } = new List<double>(366);
+        public List<double> year { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 更新数据时间
@@ -317,12 +317,12 @@ namespace TEAMModelOS.SDK.Models.Cosmos.BI
         /// <summary>
         /// 去年活动 366个天
         /// </summary>
-        //public List<double> LastYear { get; set; } = new List<double>();
+        //public List<double> LastYear { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 今年活动 366个天
         /// </summary>
-        public List<double> year { get; set; } = new List<double>(366);
+        public List<double> year { get; set; } = new double[366].ToList();
 
         /// <summary>
         /// 活动更新数据时间

+ 5 - 5
TEAMModelOS.SDK/Models/Cosmos/OpenEntity/OStudent.cs

@@ -109,7 +109,7 @@ namespace TEAMModelOS.SDK.Models.Cosmos.OpenEntity
         /// <summary>
         /// 答题总体结果
         /// </summary>
-        public int score { get; set; }
+        public double score { get; set; }
         /// <summary>
         /// 答题结果
         /// </summary>
@@ -162,18 +162,18 @@ namespace TEAMModelOS.SDK.Models.Cosmos.OpenEntity
         /// <summary>
         /// 音准
         /// </summary>
-        public int pitchAccuracy { get; set; }
+        public double pitchAccuracy { get; set; }
         /// <summary>
         /// 节奏
         /// </summary>
-        public int rhythmAccuracy { get; set; }
+        public double rhythmAccuracy { get; set; }
         /// <summary>
         /// 唱词
         /// </summary>
-        public int lyricAccuracy { get; set; }
+        public double lyricAccuracy { get; set; }
         /// <summary>
         /// 情感
         /// </summary>
-        public int emotionAccuracy { get; set; }
+        public double emotionAccuracy { get; set; }
     }
 }

+ 43 - 41
TEAMModelOS.SDK/Models/Service/BI/BICommonWay.cs

@@ -101,54 +101,56 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         public static List<double> weekDoubleMerge(List<List<double>> doubles, DateTimeOffset dateTime)
         {
             List<double> weekTrend = new();
-            int year = dateTime.Year;
-            int dayOfweek = (int)DateTimeOffset.Parse($"{year}-1-1").DayOfWeek;
-            int currentTime = dateTime.DayOfYear / 7 + 1;
-            int currentTime1 = dateTime.DayOfYear / 7;
-            int days = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 366 : days = 365;
+            if (doubles.Count > 0)
+            {
+                int year = dateTime.Year;
+                int dayOfweek = (int)DateTimeOffset.Parse($"{year}-1-1").DayOfWeek;
+                int currentTime = dateTime.DayOfYear / 7 + 1;
+                int currentTime1 = dateTime.DayOfYear / 7;
+                int days = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? days = 366 : days = 365;
 
-            var bmatrix = DenseMatrix.OfColumns(doubles);
+                var bmatrix = DenseMatrix.OfColumns(doubles);
 
-            //开学第一周周内开课                   
-            if (dayOfweek == 0)
-            {
-                dayOfweek = 7;
-            }
-            //第一周多少天
-            var dd = 7 - dayOfweek + 1;
-            //一年有几周
-            int sweeks = days / 7;
-            //查询天数
-            int dayYear = 0;
-            if (currentTime > 0)
-            {
-                for (int i = 0; i < currentTime; i++)
+                //开学第一周周内开课                   
+                if (dayOfweek == 0)
                 {
-                    if (i == 0)
-                    {
-                        var bsum = bmatrix.SubMatrix(dayYear, dd, 0, bmatrix.ColumnCount).ColumnSums().Sum();
-                        dayYear += dd;
-                        //weeks.Add(i, bsum);
-                        weekTrend.Add(bsum);
-                    }
-                    else
+                    dayOfweek = 7;
+                }
+                //第一周多少天
+                var dd = 7 - dayOfweek + 1;
+                //一年有几周
+                int sweeks = days / 7;
+                //查询天数
+                int dayYear = 0;
+                if (currentTime > 0)
+                {
+                    for (int i = 0; i < currentTime; i++)
                     {
-                        var bsum = bmatrix.SubMatrix(dayYear, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
-                        dayYear += 7;
-                        //weeks.Add(i, bsum);
-                        weekTrend.Add(bsum);
+                        if (i == 0)
+                        {
+                            var bsum = bmatrix.SubMatrix(dayYear, dd, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                            dayYear += dd;
+                            //weeks.Add(i, bsum);
+                            weekTrend.Add(bsum);
+                        }
+                        else
+                        {
+                            var bsum = bmatrix.SubMatrix(dayYear, 7, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                            dayYear += 7;
+                            //weeks.Add(i, bsum);
+                            weekTrend.Add(bsum);
+                        }
                     }
                 }
+                //最后一周是否有余
+                int stary = days - dayYear;
+                if (stary > 0 && stary < 7)
+                {
+                    var bsum = bmatrix.SubMatrix(dayYear, stary - 1, 0, bmatrix.ColumnCount).ColumnSums().Sum();
+                    //weeks.Add((sweeks + 1), bsum);
+                    weekTrend.Add(bsum);
+                }
             }
-            //最后一周是否有余
-            int stary = days - dayYear;
-            if (stary > 0 && stary < 7)
-            {
-                var bsum = bmatrix.SubMatrix(dayYear, stary - 1, 0, bmatrix.ColumnCount).ColumnSums().Sum();
-                //weeks.Add((sweeks + 1), bsum);
-                weekTrend.Add(bsum);
-            }
-
             return weekTrend;
         }
 

+ 447 - 123
TEAMModelOS.SDK/Models/Service/BI/BIStats.cs

@@ -3,13 +3,14 @@ using Azure.Storage.Blobs;
 using DocumentFormat.OpenXml.Math;
 using MathNet.Numerics.LinearAlgebra.Double;
 using Microsoft.Azure.Cosmos.Table;
+using NUnit.Framework.Constraints;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Text.Json;
 using System.Threading.Tasks;
-using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.DI;
 using TEAMModelOS.SDK.Extension;
 using TEAMModelOS.SDK.Models.Cosmos.BI;
@@ -65,23 +66,28 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 var (monthDayS, monthDayE) = TimeHelper.GetLongToTime(monthS, monthE);
                 var lastDay = dateOff.AddDays(-1);
                 int lmthDay = TimeHelper.GetDateDay(lMonthE);
-                StatsInfo statsInfo = new();
+                StatsInfo statsInfo = null;
 
                 var resStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year}-{scId}", new PartitionKey("Statistics"));
                 if (resStsInfo.Status == 200)
                 {
                     using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
                     statsInfo = fileJson.ToObject<StatsInfo>();
+                    if (string.IsNullOrEmpty(statsInfo.schoolId))
+                    {
+                        statsInfo.schoolId = scId;
+                    }
                 }
                 else
                 {
                     var resLastStsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
                     if (resLastStsInfo.Status == 200)
                     {
-                        using var fileJson = await JsonDocument.ParseAsync(resStsInfo.ContentStream);
+                        using var fileJson = await JsonDocument.ParseAsync(resLastStsInfo.ContentStream);
                         statsInfo = fileJson.ToObject<StatsInfo>();
                         statsInfo.id = $"{dateOff.Year}-{scId}";
                         statsInfo.year = dateOff.Year;
+                        statsInfo.schoolId = scId;
                         statsInfo.stuYear = new double[366].ToList();
                         statsInfo.tchYear = new double[366].ToList();
                         statsInfo.lesson.year = new double[366].ToList();
@@ -131,28 +137,62 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         else
                             statsInfo.lesson.less += count;
 
-                        statsInfo.lesson.lastDay = ((int)statsInfo.lesson.year[lastDay.DayOfYear - 1]);
-                        statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear - 1]);
-
                         var lessList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.lesson.year });
-                        statsInfo.lesson.lastWeek = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
-                        statsInfo.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - weekDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                        DenseMatrix lastLesson = null;
+                        DenseMatrix lastInter = null;
 
                         StatsInfo lastStats = null;
-                        var resLast = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
-                        if (resLast.Status == 200)
+                        var resLastStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                        if (resLastStats.Status == 200)
                         {
-                            using var fileJson = await JsonDocument.ParseAsync(resLast.ContentStream);
+                            using var fileJson = await JsonDocument.ParseAsync(resLastStats.ContentStream);
                             lastStats = fileJson.ToObject<StatsInfo>();
+                            lastLesson = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
+                            lastInter = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.yearInters });
                         }
 
+                        int lastDayCnt = 0;
+                        if (lastDay.Year < dateOff.Year)
+                        {
+                            lastDayCnt = ((int)lastStats.lesson.year[lastDay.DayOfYear - 1]);
+                        }
+                        else
+                        {
+                            lastDayCnt = ((int)statsInfo.lesson.year[lastDay.DayOfYear - 1]);
+                        }
+
+                        statsInfo.lesson.lastDay = lastDayCnt;
+                        statsInfo.lesson.day = ((int)statsInfo.lesson.year[dateOff.DayOfYear - 1]);
+
+                        int lastWeek = 0;
+                        if (lWeekDayS.Year != dateOff.Year)
+                        {
+                            if (lastLesson != null)
+                            {
+                                lastWeek += ((int)lastLesson.SubMatrix(lWeekDayS.DayOfYear - 1, lastLesson.RowCount - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
+                            lastWeek += ((int)lessList.SubMatrix(0, lWeekDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        }
+                        else
+                        {
+                            lastWeek = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        }
+                        statsInfo.lesson.lastWeek = lastWeek;
+                        statsInfo.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - weekDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+
+                        //var resLast = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
+                        //if (resLast.Status == 200)
+                        //{
+                        //    using var fileJson = await JsonDocument.ParseAsync(resLast.ContentStream);
+                        //    lastStats = fileJson.ToObject<StatsInfo>();
+                        //}
+
                         int lastTerm = 0;
                         if (lTermDayS.Year < dateOff.Year)
                         {
-                            if (lastStats != null)
+                            if (lastLesson != null)
                             {
-                                var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                                lastTerm += ((int)actYer.SubMatrix(lTermDayS.DayOfYear - 1, lastStats.lesson.year.Count - lTermDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                lastTerm += ((int)lastLesson.SubMatrix(lTermDayS.DayOfYear - 1, lastStats.lesson.year.Count - lTermDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
                             }
                             lastTerm += ((int)lessList.SubMatrix(0, lTermDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
                         }
@@ -166,32 +206,82 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         if (termDayE.Year > dateOff.Year)
                         {
                             if (lastStats != null)
+                            {
                                 term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, (statsInfo.lesson.year.Count - termDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
                         }
                         else
                         {
-                            term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            if (termDayS.Year <  dateOff.Year) 
+                            {
+                                if (lastLesson != null)
+                                {
+                                    term += ((int)lastLesson.SubMatrix(termDayS.DayOfYear - 1, lastStats.lesson.year.Count - termDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                }
+                                term += ((int)lessList.SubMatrix(0, termDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
+                            else
+                            {
+                                term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
                         }
                         statsInfo.lesson.term = term;
 
-                        statsInfo.lesson.lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
-                        statsInfo.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                        int lastMonth = 0;
+                        if (lMonthS.Year < dateOff.Year)
+                        {
+                            if (lastLesson != null)
+                            {
+                                lastMonth = ((int)lastLesson.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                            }
+                        }
+                        else
+                        {
+                            lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        }
+
+                        statsInfo.lesson.lastMonth = lastMonth;
+                        statsInfo.lesson.month = ((int)lessList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
 
                         //课例互动
                         statsInfo.lesson.yearInters[dateOff.DayOfYear - 1] += interaction;
                         statsInfo.lesson.allInter += interaction;
-                        statsInfo.lesson.lastDayInter = ((int)statsInfo.lesson.yearInters[lastDay.DayOfYear - 1]);
+                        int lastDayInter = 0;
+                        if (lastDay.Year < dateOff.Year)
+                        {
+                            lastDayInter = ((int)lastStats.lesson.yearInters[lastDay.DayOfYear - 1]);
+                        }
+                        else
+                        {
+                            lastDayInter = ((int)statsInfo.lesson.yearInters[lastDay.DayOfYear - 1]);
+                        }
+
+                        statsInfo.lesson.lastDayInter = lastDayInter;
                         statsInfo.lesson.dayInter = ((int)statsInfo.lesson.yearInters[dateOff.DayOfYear - 1]);
 
                         var interList = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.lesson.yearInters });
-                        statsInfo.lesson.lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
-                        statsInfo.lesson.monthInter += ((int)interList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, interList.ColumnCount).ColumnSums().Sum());
+                        int lastMonthInter = 0;
+                        if (lMonthS.Year < dateOff.Year)
+                        {
+                            if (lastInter != null)
+                            {
+                                lastMonthInter = ((int)lastInter.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                            }
+                        }
+                        else
+                        {
+                            lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
+                        }
+                        statsInfo.lesson.lastMonthInter = lastMonthInter;
+                        statsInfo.lesson.monthInter = ((int)interList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, interList.ColumnCount).ColumnSums().Sum());
 
                         int lastTermI = 0;
                         if (lastStats != null)
                         {
-                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                            lastTermI += ((int)actYer.SubMatrix(0, lastStats.lesson.year.Count, 0, actYer.ColumnCount).ColumnSums().Sum());
+                            if (lastInter != null)
+                            {
+                                lastTermI = ((int)lastInter.SubMatrix(0, lastStats.lesson.year.Count, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                            }
                         }
                         statsInfo.lesson.lastYearInter = lastTermI;
 
@@ -231,26 +321,55 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         {
                             statsInfo.activity.year[dateOff.DayOfYear - 1] += count;
                             DenseMatrix matris = DenseMatrix.OfColumns(new List<List<double>>() { statsInfo.activity.year });
-                            statsInfo.activity.lastDay = ((int)statsInfo.activity.year[lastDay.DayOfYear - 1]);
-                            statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear - 1]);
-                            statsInfo.activity.lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
-                            statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear - 1, dateOff.DayOfYear - weekDayS.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
-
+                            DenseMatrix lastAct = null;
                             StatsInfo lastStats = null;
-                            var resLast = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{lTermDayS.Year}-{scId}", new PartitionKey("Statistics"));
-                            if (resLast.Status == 200)
+                            var resLastStats = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{scId}", new PartitionKey("Statistics"));
+                            if (resLastStats.Status == 200)
                             {
-                                using var fileJson = await JsonDocument.ParseAsync(resLast.ContentStream);
+                                using var fileJson = await JsonDocument.ParseAsync(resLastStats.ContentStream);
                                 lastStats = fileJson.ToObject<StatsInfo>();
+                                lastAct  = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.activity.year });
                             }
 
+                            int lastDayCnt = 0;
+                            if (lastDay.Year < dateOff.Year)
+                            {
+                                if (lastStats != null)
+                                {
+                                    lastDayCnt = ((int)lastStats.activity.year[lastDay.DayOfYear - 1]);
+                                }
+                            }
+                            else
+                            {
+                                lastDayCnt = ((int)statsInfo.activity.year[lastDay.DayOfYear - 1]);
+                            }
+
+                            statsInfo.activity.lastDay = lastDayCnt;
+                            statsInfo.activity.dayCnt = ((int)statsInfo.activity.year[dateOff.DayOfYear - 1]);
+
+                            int lastWeek = 0;
+                            if (lWeekDayS.Year < dateOff.Year)
+                            {
+                                if (lastAct != null)
+                                {
+                                    lastWeek += ((int)lastAct.SubMatrix(lWeekDayS.DayOfYear - 1, lastAct.RowCount - lWeekDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                }
+                                lastWeek += ((int)matris.SubMatrix(0, lWeekDayE.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
+                            }
+                            else
+                            {
+                                lastWeek = ((int)matris.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
+                            }
+
+                            statsInfo.activity.lastWeek = lastWeek;
+                            statsInfo.activity.week = ((int)matris.SubMatrix(weekDayS.DayOfYear - 1, dateOff.DayOfYear - weekDayS.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
+
                             int lastTerm = 0;
                             if (lTermDayS.Year < dateOff.Year)
                             {
                                 if (lastStats != null)
                                 {
-                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                                    lastTerm += ((int)actYer.SubMatrix(lTermDayS.DayOfYear - 1, lastStats.lesson.year.Count - lTermDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                    lastTerm += ((int)lastAct.SubMatrix(lTermDayS.DayOfYear - 1, lastStats.activity.year.Count - lTermDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
                                 }
                                 lastTerm += ((int)matris.SubMatrix(0, lTermDayE.DayOfYear, 0, matris.ColumnCount).ColumnSums().Sum());
                             }
@@ -260,30 +379,49 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                             }
                             statsInfo.activity.lastTerm = lastTerm;
 
-
                             int term = 0;
                             if (termDayS.Year > dateOff.Year)
                             {
-                                if (lastStats != null)
+                                if (lastAct != null)
                                 {
-                                    var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStats.lesson.year });
-                                    term += ((int)actYer.SubMatrix(termDayS.DayOfYear - 1, lastStats.lesson.year.Count - termDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                    term += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStats.activity.year.Count - termDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
                                 }
                                 term += ((int)matris.SubMatrix(0, termDayE.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
                             }
                             else
                             {
-                                term += ((int)matris.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
+                                if (lTermDayS.Year < dateOff.Year)
+                                {
+                                    if (lastAct != null)
+                                    {
+                                        term += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStats.activity.year.Count - termDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                    }
+                                    term += ((int)matris.SubMatrix(0, termDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                                }
+                                else
+                                {
+                                    term += ((int)matris.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, matris.ColumnCount).ColumnSums().Sum());
+                                }
                             }
                             statsInfo.activity.term = term;
-
-                            statsInfo.activity.lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                            int lastMonth = 0;
+                            if (lMonthS.Year < dateOff.Year) 
+                            {
+                                if (lastAct != null) 
+                                {
+                                    lastMonth = ((int)lastAct.SubMatrix(lMonthS.DayOfYear-1, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                                }
+                            }
+                            else
+                            {
+                                lastMonth = ((int)matris.SubMatrix(lMonthS.DayOfYear-1, lmthDay, 0, matris.ColumnCount).ColumnSums().Sum());
+                            }
+                            statsInfo.activity.lastMonth = lastMonth;
                             statsInfo.activity.month += ((int)matris.SubMatrix(monthDayS.DayOfYear, (dateOff.DayOfYear - monthDayS.DayOfYear), 0, matris.ColumnCount).ColumnSums().Sum());
                             statsInfo.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                         }
                     }
                 }
-
                 if (resStsInfo.Status == 200)
                 {
                     statsInfo = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReplaceItemAsync<StatsInfo>(statsInfo, statsInfo.id, new PartitionKey("Statistics"));
@@ -295,7 +433,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI,SetTypeAddStats(),参数: 学校:{scId},统计类型:{type}, 增/减数:{count},课例类型(0:开课,1:课例):{lessType},学生互动数:{interaction},时间戳:{careDate}\n {ex.Message}\n {ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetTypeAddStats(),参数: 学校:{scId},统计类型:{type}, 增/减数:{count},课例类型(0:开课,1:课例):{lessType},学生互动数:{interaction},时间戳:{careDate}\n {ex.Message}\n {ex.StackTrace}", GroupNames.成都开发測試群組);
             }
         }
 
@@ -361,50 +499,58 @@ namespace TEAMModelOS.SDK.Models.Service.BI
         /// <returns></returns>
         public static async Task SetSchoolBIRelation(CosmosClient cosmosClient, BlobContainerClient blobClient, CloudTableClient tableClient, DingDing _dingDing, School school)
         {
-            string type = "";
-            BIRelation bIRelation = new();
-            var resBiRel = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school.id, new PartitionKey("BIRel"));
-            if (resBiRel.Status == 200)
-            {
-                using var fileJson = await JsonDocument.ParseAsync(resBiRel.ContentStream);
-                bIRelation = fileJson.ToObject<BIRelation>();
-            }
-            else
+            try
             {
-                bIRelation.id = school.id;
-            }
+                string type = "";
+                BIRelation bIRelation = new();
+                var resBiRel = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReadItemStreamAsync(school.id, new PartitionKey("BIRel"));
+                if (resBiRel.Status == 200)
+                {
+                    using var fileJson = await JsonDocument.ParseAsync(resBiRel.ContentStream);
+                    bIRelation = fileJson.ToObject<BIRelation>();
+                }
+                else
+                {
+                    bIRelation.id = school.id;
+                }
+
+                string aName = null;
+                if (!string.IsNullOrEmpty($"{school.areaId}"))
+                {
+                    aName = await CosmosQueryHelper.GetStr(cosmosClient, "Normal", $"select value(c.name) from c where c.id='{school.areaId}'", "Base-Area");
+                }
+                bIRelation.name = school.name;
+                bIRelation.picture = school.picture;
+                bIRelation.region = school.region;
+                bIRelation.province = school.province;
+                bIRelation.city = school.city;
+                bIRelation.dist = school.dist;
+                bIRelation.address = school.address;
+                bIRelation.areaId = school.areaId;
+                bIRelation.size = school.size;
+                bIRelation.scale = school.scale;
+                bIRelation.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                bIRelation.areaName = aName;
+
+                if (resBiRel.Status == 200)
+                {
+                    await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<BIRelation>(bIRelation, bIRelation.id, new PartitionKey("BIRel"));
+                    type = "update";
+                }
+                else
+                {
+                    await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<BIRelation>(bIRelation, new PartitionKey("BIRel"));
+                    type = "add";
+                }
+
+                //保存操作记录
+                await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing);
 
-            string aName = null;
-            if (!string.IsNullOrEmpty($"{school.areaId}"))
-            {
-                aName = await CosmosQueryHelper.GetStr(cosmosClient, "Normal", $"select value(c.name) from c where c.id='{school.areaId}'", "Base-Area");
-            }
-            bIRelation.name = school.name;
-            bIRelation.picture = school.picture;
-            bIRelation.region = school.region;
-            bIRelation.province = school.province;
-            bIRelation.city = school.city;
-            bIRelation.dist = school.dist;
-            bIRelation.address = school.address;
-            bIRelation.areaId = school.areaId;
-            bIRelation.size = school.size;
-            bIRelation.scale = school.scale;
-            bIRelation.upDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-            bIRelation.areaName = aName;
-
-            if (resBiRel.Status == 200)
-            {
-                await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<BIRelation>(bIRelation, bIRelation.id, new PartitionKey("BIRel"));
-                type = "update";
             }
-            else
+            catch (Exception ex)
             {
-                await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").CreateItemAsync<BIRelation>(bIRelation, new PartitionKey("BIRel"));
-                type = "add";
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetSchoolBIRelation() \n  {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
             }
-
-            //保存操作记录
-            await AzureStorageBlobExtensions.SaveBILog(blobClient, tableClient, $"birelation-{type}", $"触发更新学校信息表中间件", _dingDing);
         }
 
         /// <summary>
@@ -437,11 +583,22 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 var lastDay = dateOff.AddDays(-1);
                 int lmthDay = TimeHelper.GetDateDay(lMonthE);
 
-                int termDay = 0;
-
                 List<Task<ItemResponse<StatsInfo>>> statsInfos = new();
                 List<StatsInfo> tempStatsInfos = new();
-                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: "select value(c) from c", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
+                StringBuilder statsSql = new($"select value(c) from c where c.year={dateOff.Year}");
+                List<string> scIds = new();
+
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "School").GetItemQueryIterator<string>(queryText: $"select value(c.id)  from c ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("BIRel") }))
+                {
+                    scIds.Add(item);
+                }
+
+                if (scIds.Count > 0)
+                {
+                    statsSql.Append($" and {BICommonWay.ManyScSql("c.id", scIds, $"{dateOff.Year}-")}");
+                }
+
+                await foreach (var item in cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").GetItemQueryIterator<StatsInfo>(queryText: statsSql.ToString(), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Statistics") }))
                 {
                     tempStatsInfos.Add(item);
                 }
@@ -450,94 +607,261 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                 {
                     foreach (var item in tempStatsInfos)
                     {
-                        if (termDayE.Year == dateOff.Year)
-                            termDay = dateOff.DayOfYear;
-                        else
-                            termDay = item.activity.year.Count;
-                        StatsInfo lastStatsInfo = null;
-
+                        StatsInfo lastStatsInfo = null; 
+                        DenseMatrix lastTch = null;
+                        DenseMatrix lastStu = null;
+                        DenseMatrix lastLesson = null;
+                        DenseMatrix lastInter = null;
+                        DenseMatrix lastAct = null;
                         var lastSts = await cosmosClient.GetContainer(Constant.TEAMModelOS, "Common").ReadItemStreamAsync($"{dateOff.Year - 1}-{item.schoolId}", new PartitionKey("Statistics"));
                         if (lastSts.Status == 200)
                         {
                             using var fileJson = await JsonDocument.ParseAsync(lastSts.ContentStream);
                             lastStatsInfo = fileJson.ToObject<StatsInfo>();
+                            item.schoolId = lastStatsInfo.schoolId;
+                            item.year = dateOff.Year;
+                            item.picture = lastStatsInfo.picture;
+                            item.name = lastStatsInfo.name;
+                            item.areaId = lastStatsInfo.areaId;
+                            item.size = lastStatsInfo.size;
+                            item.useSize = lastStatsInfo.useSize;
+                            item.tch = lastStatsInfo.tch;
+                            lastTch = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.tchYear });
+                            lastStu = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.stuYear});
+                            lastLesson = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.year });
+                            lastInter = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.yearInters });
+                            lastAct = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
                         }
 
                         var tchList = DenseMatrix.OfColumns(new List<List<double>>() { item.tchYear });
-                        item.dayTch = ((int)item.tchYear[lastDay.DayOfYear - 1]);
-                        item.weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, tchList.ColumnCount).ColumnSums().Sum());
+                        var stuList = DenseMatrix.OfColumns(new List<List<double>>() { item.stuYear });
+                        int dayTch = 0;
+                        int dayStu = 0;
+                        int lastDayLesson = 0;
+                        int lastDayAct = 0;
+                        if (lastDay.Year < dateOff.Year) 
+                        {
+                            if (lastStatsInfo != null) 
+                            {
+                                dayTch =((int)lastStatsInfo.tchYear[lastDay.DayOfYear - 1]);
+                                dayStu = ((int)lastStatsInfo.stuYear[lastDay.DayOfYear - 1]);
+                                lastDayLesson = ((int)lastStatsInfo.lesson.year[lastDay.DayOfYear - 1]);
+                                lastDayAct = ((int)lastStatsInfo.activity.year[lastDay.DayOfYear - 1]);
+                            }
+                        }
+                        else
+                        {
+                            dayTch = ((int)item.tchYear[lastDay.DayOfYear - 1]);
+                            dayStu = ((int)item.stuYear[lastDay.DayOfYear - 1]);
+                            lastDayLesson = ((int)item.lesson.year[lastDay.DayOfYear - 1]);
+                            lastDayAct =((int)item.activity.year[lastDay.DayOfYear - 1]);
+                        }
+                        item.dayTch = dayTch;
+                        int weekTch = 0;
+                        int weekStu = 0;
+                        if (weekDayS.Year < dateOff.Year) 
+                        {
+                            if (lastTch != null)
+                            {
+                                weekTch += ((int)lastTch.SubMatrix(weekDayS.DayOfYear - 1, lastTch.RowCount - weekDayS.DayOfYear + 1, 0, lastTch.ColumnCount).ColumnSums().Sum());
+                            }
+                            weekTch += ((int)tchList.SubMatrix(0, weekDayE.DayOfYear + 1, 0, tchList.ColumnCount).ColumnSums().Sum());
+
+                            if (lastStu != null)
+                            {
+                                weekStu += ((int)lastStu.SubMatrix(weekDayS.DayOfYear - 1, lastStu.RowCount - weekDayS.DayOfYear + 1, 0, lastStu.ColumnCount).ColumnSums().Sum());
+                            }
+                            weekStu += ((int)lastStu.SubMatrix(0, weekDayE.DayOfYear + 1, 0, lastStu.ColumnCount).ColumnSums().Sum());
+                        }
+                        else
+                        {
+                            weekTch = ((int)tchList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, tchList.ColumnCount).ColumnSums().Sum());
+                            weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, stuList.ColumnCount).ColumnSums().Sum());
+                        }
+                        item.weekTch = weekTch;
                         item.monthTch = ((int)tchList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, tchList.ColumnCount).ColumnSums().Sum());
                         item.tchUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
-                        var stuList = DenseMatrix.OfColumns(new List<List<double>>() { item.stuYear });
-                        item.dayStu = ((int)item.stuYear[lastDay.DayOfYear - 1]);
-                        item.weekStu = ((int)stuList.SubMatrix(weekDayS.DayOfYear - 1, 7, 0, stuList.ColumnCount).ColumnSums().Sum());
+                        item.dayStu = dayStu;
+                        item.weekStu = weekStu;
                         item.monthStu = ((int)stuList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, stuList.ColumnCount).ColumnSums().Sum());
                         item.stuUpTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
                         var lessList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.year });
-                        item.lesson.lastDay = item.lesson.day;
-                        item.lesson.lastWeek = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear - 1, 7, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        var interList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.yearInters });
+                        var actList = DenseMatrix.OfColumns(new List<List<double>>() { item.activity.year });
+                        item.lesson.lastDay = lastDayLesson;
+
+                        int lastWeekLesson = 0;
+                        int lastWeekAct = 0;
+                        if (lWeekDayS.Year != dateOff.Year)
+                        {
+                            if (lastLesson != null)
+                            {
+                                lastWeekLesson += ((int)lastLesson.SubMatrix(lWeekDayS.DayOfYear - 1, lastLesson.RowCount - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
+                            lastWeekLesson += ((int)lessList.SubMatrix(0, lWeekDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+
+                            if (lastAct !=null)
+                            {
+                                lastWeekAct += ((int)lastAct.SubMatrix(lWeekDayS.DayOfYear - 1, lastAct.RowCount - lWeekDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                            }
+                            lastWeekAct += ((int)lastAct.SubMatrix(0, lWeekDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                        }
+                        else
+                        {
+                            lastWeekLesson = ((int)lessList.SubMatrix(lWeekDayS.DayOfYear - 1, lWeekDayE.DayOfYear - lWeekDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            lastWeekAct = ((int)actList.SubMatrix(lWeekDayS.DayOfYear - 1, 7, 0, actList.ColumnCount).ColumnSums().Sum());
+                        }
+                        item.lesson.lastWeek = lastWeekLesson;
                         item.lesson.week = ((int)lessList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - weekDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
 
+                        int lastTerm = 0;
                         if (lTermDayS.Year < dateOff.Year)
                         {
-                            if (lastStatsInfo != null)
+                            if (lastLesson != null)
                             {
-                                var lessYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.year, item.lesson.year });
-                                item.lesson.lastTerm = ((int)lessYer.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                lastTerm += ((int)lastLesson.SubMatrix(lTermDayS.DayOfYear - 1, lastStatsInfo.lesson.year.Count - lTermDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
                             }
+                            lastTerm += ((int)lessList.SubMatrix(0, lTermDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
                         }
-                        item.lesson.term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, termDay + 1, 0, 1).ColumnSums().Sum());
+                        else
+                        {
+                            lastTerm += ((int)lessList.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear - lTermDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                        }
+                        item.lesson.lastTerm = lastTerm;
 
+                        int term = 0;
+                        if (termDayE.Year > dateOff.Year)
+                        {
+                            if (lessList != null)
+                            {
+                                term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, (lessList.RowCount - termDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
+                        }
+                        else
+                        {
+                            if (termDayS.Year < dateOff.Year)
+                            {
+                                if (lastLesson != null)
+                                {
+                                    term += ((int)lastLesson.SubMatrix(termDayS.DayOfYear - 1, lastLesson.RowCount - termDayS.DayOfYear + 1, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                                }
+                                term += ((int)lessList.SubMatrix(0, termDayE.DayOfYear, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
+                            else
+                            {
+                                term = ((int)lessList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            }
+                        }
+                        item.lesson.term = term;
                         item.lesson.day = 0;
-                        item.lesson.lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay + 1, 0, lessList.ColumnCount).ColumnSums().Sum());
+
+                        int lastMonth = 0;
+                        int lastMonthInter = 0;
+                        int lastMonthAct = 0;
+                        if (lMonthS.Year < dateOff.Year)
+                        {
+                            if (lastLesson != null)
+                            {
+                                lastMonth = ((int)lastLesson.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastLesson.ColumnCount).ColumnSums().Sum());
+                            }
+
+                            if (lastInter != null)
+                            {
+                                lastMonthInter = ((int)lastInter.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                            }
+
+                            if (lastAct != null)
+                            {
+                                lastMonthAct = ((int)lastAct.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                            }
+                        }
+                        else
+                        {
+                            lastMonth = ((int)lessList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, lessList.ColumnCount).ColumnSums().Sum());
+                            lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, interList.ColumnCount).ColumnSums().Sum());
+                            lastMonthAct = ((int)actList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay, 0, actList.ColumnCount).ColumnSums().Sum());
+                        }
+                        item.lesson.lastMonth = lastMonth;
                         item.lesson.month += ((int)lessList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, lessList.ColumnCount).ColumnSums().Sum());
                         item.lesson.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
-                        var interList = DenseMatrix.OfColumns(new List<List<double>>() { item.lesson.yearInters });
-                        item.lesson.lastDayInter = ((int)item.lesson.yearInters[lastDay.DayOfYear - 1]);
+                        int lastDayInter = 0;
+                        if (lastDay.Year < dateOff.Year) 
+                        {
+                            if (lastStatsInfo.lesson.yearInters.Count > 0) 
+                            {
+                                lastDayInter = ((int)lastStatsInfo.lesson.yearInters[lastDay.DayOfYear - 1]);
+                            }
+                        }
+                        else
+                        {
+                            lastDayInter = ((int)item.lesson.yearInters[lastDay.DayOfYear - 1]);
+                        }
+                        item.lesson.lastDayInter = lastDayInter;
                         item.lesson.dayInter = 0;
-                        item.lesson.lastMonthInter = ((int)interList.SubMatrix(lMonthS.DayOfYear - 1, lmthDay + 1, 0, interList.ColumnCount).ColumnSums().Sum());
+                        
+                        item.lesson.lastMonthInter = lastMonthInter;
                         item.lesson.monthInter = ((int)interList.SubMatrix(monthDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, interList.ColumnCount).ColumnSums().Sum());
 
                         if (lastStatsInfo != null)
                         {
-                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.lesson.yearInters });
-                            item.lesson.lastYearInter = ((int)actYer.SubMatrix(lTermDayS.DayOfYear - 1, actYer.RowCount, 0, actYer.ColumnCount).ColumnSums().Sum());
+                            if (lastInter != null)
+                            {
+                                item.lesson.lastYearInter = ((int)lastInter.SubMatrix(0, lastInter.RowCount, 0, lastInter.ColumnCount).ColumnSums().Sum());
+                            }
                         }
 
                         item.lesson.yearInter = ((int)item.lesson.yearInters.Sum());
 
                         item.activity.dayCnt = ((int)item.activity.year[dateOff.DayOfYear - 1]);
-                        item.activity.lastDay = ((int)item.activity.year[lastDay.DayOfYear - 1]);
-                        var actList = DenseMatrix.OfColumns(new List<List<double>>() { item.activity.year });
-                        item.activity.lastWeek = ((int)actList.SubMatrix(lWeekDayS.DayOfYear - 1, 7, 0, actList.ColumnCount).ColumnSums().Sum());
+                        item.activity.lastDay = lastDayAct;
+                        item.activity.lastWeek = lastWeekAct;
                         item.activity.week = ((int)actList.SubMatrix(weekDayS.DayOfYear - 1, (dateOff.DayOfYear - monthDayS.DayOfYear + 1), 0, actList.ColumnCount).ColumnSums().Sum());
 
-                        if (lMonthS.Year == dateOff.Year)
+                        item.activity.lastMonth = lastMonthAct;
+
+                        int lastTermAct = 0;
+                        if (lTermDayS.Year < dateOff.Year)
                         {
-                            item.activity.lastMonth = ((int)actList.SubMatrix(lMonthS.DayOfYear - 1, lMonthE.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
+                            if (lastAct != null)
+                            {
+                                lastTermAct += ((int)lastAct.SubMatrix(lTermDayS.DayOfYear - 1, lastStatsInfo.activity.year.Count - lTermDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                            }
+                            lastTermAct += ((int)actList.SubMatrix(0, lTermDayE.DayOfYear, 0, actList.ColumnCount).ColumnSums().Sum());
                         }
                         else
                         {
-                            var lastMthYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
-                            item.activity.lastMonth = ((int)lastMthYer.SubMatrix(lMonthS.DayOfYear - 1, lMonthE.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
+                            lastTermAct += ((int)actList.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear - lTermDayS.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
                         }
-                        if (monthDayE.Year > dateOff.Year)
+                        item.activity.lastTerm = lastTerm;
+
+                        int termAct = 0;
+                        if (termDayS.Year > dateOff.Year)
                         {
-                            item.activity.month = ((int)actList.SubMatrix(monthDayS.DayOfYear - 1, actList.RowCount, 0, actList.ColumnCount).ColumnSums().Sum());
+                            if (lastAct != null)
+                            {
+                                termAct += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStatsInfo.activity.year.Count - termDayS.DayOfYear + 1, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                            }
+                            termAct += ((int)actList.SubMatrix(0, termDayE.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
                         }
                         else
                         {
-                            item.activity.month = ((int)actList.SubMatrix(monthDayS.DayOfYear - 1, monthDayE.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
-                        }
-
-                        if (lastStatsInfo != null)
-                        {
-                            var actYer = DenseMatrix.OfColumns(new List<List<double>>() { lastStatsInfo.activity.year });
-                            item.activity.lastTerm = ((int)actYer.SubMatrix(lTermDayS.DayOfYear - 1, lTermDayE.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                            if (lTermDayS.Year < dateOff.Year)
+                            {
+                                if (lastAct != null)
+                                {
+                                    termAct += ((int)lastAct.SubMatrix(termDayS.DayOfYear - 1, lastStatsInfo.lesson.year.Count - termDayS.DayOfYear + 1, 0, 1).ColumnSums().Sum());
+                                }
+                                termAct += ((int)actList.SubMatrix(0, termDayE.DayOfYear, 0, lastAct.ColumnCount).ColumnSums().Sum());
+                            }
+                            else
+                            {
+                                termAct += ((int)actList.SubMatrix(termDayS.DayOfYear - 1, termDayE.DayOfYear - termDayS.DayOfYear + 1, 0, actList.ColumnCount).ColumnSums().Sum());
+                            }
                         }
+                        item.activity.term = term;
 
                         item.activity.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
 
@@ -561,7 +885,7 @@ namespace TEAMModelOS.SDK.Models.Service.BI
             }
             catch (Exception ex)
             {
-                await _dingDing.SendBotMsg($"BI, SetStatsZeroPoint() \n  {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                await _dingDing.SendBotMsg($"BI,{Environment.GetEnvironmentVariable("Option:Location")},SetStatsZeroPoint() \n  {ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
             }
         }
     }

+ 12 - 2
TEAMModelOS.SDK/Models/Service/BI/TimeHelper.cs

@@ -357,8 +357,18 @@ namespace TEAMModelOS.SDK.Models.Service.BI
                         break;
                     //上个月
                     case "lastMonth":
-                        tempStrart = new DateTimeOffset(year, month - 1, 1, 0, 0, 0, TimeSpan.Zero);
-                        tempEnd = new DateTimeOffset(year, month - 1, DateTime.DaysInMonth(year, month - 1), 23, 59, 59, TimeSpan.Zero);
+                        if (month == 1) 
+                        {
+                            year--;
+                            month = 12;
+                        }
+                        else
+                        {
+                            month--;
+                        }
+
+                        tempStrart = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero);
+                        tempEnd = new DateTimeOffset(year, month, DateTime.DaysInMonth(year, month), 23, 59, 59, TimeSpan.Zero);
                         break;
                     //本月1号至当天
                     case "monthDay":

+ 6 - 3
TEAMModelOS.SDK/Models/Service/BIStatsWay/ActivityStatsWay.cs

@@ -153,17 +153,20 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
                 month += examSts.FindAll(f => f.createTime >= monthS && f.createTime <= monthE).ToList().Count;
             }
 
+            List<double> actYear = new();
             if (tempAll.Count > 0)
             {
                 for (int i = 0; i < everyDay.Count; i++)
                 {
-                    actStats.year.Add(tempAll.FindAll(f => (f.createTime >= everyDay[i].start && f.createTime <= everyDay[i].end)).Count);
+                    actYear.Add(tempAll.FindAll(f => (f.createTime >= everyDay[i].start && f.createTime <= everyDay[i].end)).Count);
                 }
 
-                if (actStats.year.Count < 366)
-                    actStats.year.Add(0);
+                if (actYear.Count < 366)
+                    actYear.Add(0);
             }
 
+            actStats.year = actYear;
+
             //string lastDaySql = $"c.createTime >= {lastDayS} and c.createTime <= {lastdayE}";
             //string daySql = $"c.createTime >= {dayS} and c.createTime <= {dayE}";
             //string lastWeekSql = $"c.createTime >= {lastWeekS} and c.createTime <= {lastWeekE}";

+ 10 - 7
TEAMModelOS.SDK/Models/Service/BIStatsWay/LessonRecordStatsWay.cs

@@ -71,20 +71,23 @@ namespace TEAMModelOS.SDK.Models.Service.BIStatsWay
 
             DateTimeOffset yearDay = new(year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, TimeSpan.Zero);
             List<StartEndTime> everyDay = TimeHelper.GetYearEveryDay(yearDay);
-
+            List<double> Inters = new();
             for (int i = 0; i < everyDay.Count; i++)
             {
-                lessStats.yearInters.Add((double)lessRelStats.FindAll(f => (f.startTime >= everyDay[i].start && f.startTime <= everyDay[i].end)).Select(s => s.clientInteractionCount).Sum());
+                Inters.Add((double)lessRelStats.FindAll(f => (f.startTime >= everyDay[i].start && f.startTime <= everyDay[i].end)).Select(s => s.clientInteractionCount).Sum());
             }
-            if (lessStats.yearInters.Count < 366)
-                lessStats.yearInters.Add(0);
+            if (Inters.Count < 366)
+                Inters.Add(0);
+            lessStats.yearInters = Inters;
 
+            List<double> lessYear = new();
             for (int i = 0; i < everyDay.Count; i++)
             {
-                lessStats.year.Add(lessRelStats.FindAll(f => (f.startTime >= everyDay[i].start && f.startTime <= everyDay[i].end)).Count);
+                lessYear.Add(lessRelStats.FindAll(f => (f.startTime >= everyDay[i].start && f.startTime <= everyDay[i].end)).Count);
             }
-            if (lessStats.year.Count < 366)
-                lessStats.year.Add(0);
+            if (lessYear.Count < 366)
+                lessYear.Add(0);
+            lessStats.year = lessYear;
 
             lessStats.upTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); 
 

+ 1 - 1
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -5589,7 +5589,7 @@ const LANG_ZH_CN = {
             homework: '作业活动',
             acRecord: '活动记录',
             cusMgt: '课程管理',
-            taskList: '任务列表',
+            taskList: '我的任务',
             train: '研修中心',
             trainData: '研修数据',
             abilityPoint: '微能力点',

+ 119 - 118
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -763,114 +763,7 @@ export default {
     },
     teacherMenu() {
       let data = [
-        // 个人研修
-        {
-          icon: 'iconfont icon-train',
-          name: this.$t('system.menu.train'),
-          router: '',
-          role: 'teacher|admin',
-          permission: '',
-          subName: 'privTrain',
-          // isShow: process.env.NODE_ENV == 'development',
-          isShow: this.$store.state.config.srvAdr == 'China',
-          // isShow: true,
-          child: [{
-            icon: 'iconfont icon-data1',
-            name: this.$t('system.menu.trainCount'),
-            router: '/home/jyHome',
-            tag: '',
-            role: 'teacher|admin',
-            permission: '',
-            menuName: 'jyHome',
-            isShow: true
-          },
-          {
-            icon: 'iconfont icon-online',
-            name: this.$t('system.menu.onlineTrain'),
-            router: '/home/online',
-            tag: '',
-            role: 'teacher|admin',
-            permission: '',
-            menuName: 'online',
-            isShow: true
-          },
-          {
-            icon: 'iconfont icon-offline',
-            name: this.$t('system.menu.scTrain'),
-            router: '/home/offline',
-            tag: '',
-            role: 'teacher|admin',
-            permission: '',
-            menuName: 'offline',
-            isShow: true
-          },
-          {
-            icon: 'iconfont icon-material',
-            name: this.$t('system.menu.appAssassment'),
-            router: '/home/application',
-            tag: '',
-            role: 'teacher|admin',
-            permission: '',
-            menuName: 'application',
-            isShow: true
-          },
-          {
-            icon: 'iconfont icon-course-videos',
-            name: this.$t('system.menu.classRecord'),
-            router: '/home/classMemoir',
-            tag: '',
-            role: 'teacher|admin',
-            permission: '',
-            menuName: 'classmemoir',
-            isShow: true
-          },
-          {
-            icon: 'iconfont icon-discuss',
-            name: this.$t('system.menu.discuss'),
-            router: '/home/discuss',
-            tag: '',
-            role: 'teacher|admin',
-            permission: '',
-            menuName: 'discuss',
-            isShow: true
-          },
-            // 研修的投票和问卷隐藏
-            /* {
-                icon: 'iconfont icon-vote',
-                name: this.$t('system.menu.scVote'),
-                router: '/home/privateVote',
-                tag: '',
-                role: 'admin|teacher',
-                permission: '',
-                child: [],
-                menuName: 'privateVote',
-                isShow: true
-            },
-            {
-                icon: 'iconfont icon-questionnaire',
-                name: this.$t('system.menu.scQu'),
-                router: '/home/privateQuestionnaire',
-                tag: '',
-                role: 'admin|teacher',
-                permission: '',
-                child: [],
-                menuName: 'privateQuestionnaire',
-                isShow: true
-            }, */
-          ]
-        },
-        // 我的班级
-        {
-          icon: 'iconfont icon-class-self',
-          name: this.$t('system.menu.myClass'),
-          router: '/home/classmgt',
-          tag: '',
-          role: 'teacher',
-          permission: '',
-          child: [],
-          menuName: 'classmgt',
-          isShow: this.$store.state.userInfo.hasSchool && this.isHeadmaster && this.IES5Menu
-        },
+
         // 我的课程
         {
           icon: 'iconfont icon-course-self',
@@ -886,18 +779,17 @@ export default {
           isShow: this.IES5Menu,
           info: this.$t('tip.myCus')
         },
-        // 苏格拉底
+        // 我的班级
         {
-          icon: 'iconfont icon-course-videos',
-          name: this.$t('system.menu.toSokrates'),
-          router: '#',
+          icon: 'iconfont icon-class-self',
+          name: this.$t('system.menu.myClass'),
+          router: '/home/classmgt',
           tag: '',
-          role: 'admin|teacher',
-          child: [],
+          role: 'teacher',
           permission: '',
-          menuName: 'privSokrate',
-          isShow: this.IES5Menu,
-          to: 'privSokrate'
+          child: [],
+          menuName: 'classmgt',
+          isShow: this.$store.state.userInfo.hasSchool && this.isHeadmaster && this.IES5Menu
         },
         // 我的资源
         {
@@ -1025,7 +917,116 @@ export default {
           menuName: 'taskList',
           isShow: this.$store.state.userInfo.hasSchool && this.IES5Menu,
           info: this.$t('tip.task')
-        }
+        },
+        // 个人研修
+        {
+          icon: 'iconfont icon-train',
+          name: this.$t('system.menu.train'),
+          router: '',
+          role: 'teacher|admin',
+          permission: '',
+          subName: 'privTrain',
+          // isShow: process.env.NODE_ENV == 'development',
+          isShow: this.$store.state.config.srvAdr == 'China',
+          // isShow: true,
+          child: [{
+            icon: 'iconfont icon-data1',
+            name: this.$t('system.menu.trainCount'),
+            router: '/home/jyHome',
+            tag: '',
+            role: 'teacher|admin',
+            permission: '',
+            menuName: 'jyHome',
+            isShow: true
+          },
+          {
+            icon: 'iconfont icon-online',
+            name: this.$t('system.menu.onlineTrain'),
+            router: '/home/online',
+            tag: '',
+            role: 'teacher|admin',
+            permission: '',
+            menuName: 'online',
+            isShow: true
+          },
+          {
+            icon: 'iconfont icon-offline',
+            name: this.$t('system.menu.scTrain'),
+            router: '/home/offline',
+            tag: '',
+            role: 'teacher|admin',
+            permission: '',
+            menuName: 'offline',
+            isShow: true
+          },
+          {
+            icon: 'iconfont icon-material',
+            name: this.$t('system.menu.appAssassment'),
+            router: '/home/application',
+            tag: '',
+            role: 'teacher|admin',
+            permission: '',
+            menuName: 'application',
+            isShow: true
+          },
+          {
+            icon: 'iconfont icon-course-videos',
+            name: this.$t('system.menu.classRecord'),
+            router: '/home/classMemoir',
+            tag: '',
+            role: 'teacher|admin',
+            permission: '',
+            menuName: 'classmemoir',
+            isShow: true
+          },
+          {
+            icon: 'iconfont icon-discuss',
+            name: this.$t('system.menu.discuss'),
+            router: '/home/discuss',
+            tag: '',
+            role: 'teacher|admin',
+            permission: '',
+            menuName: 'discuss',
+            isShow: true
+          },
+            // 研修的投票和问卷隐藏
+            /* {
+                icon: 'iconfont icon-vote',
+                name: this.$t('system.menu.scVote'),
+                router: '/home/privateVote',
+                tag: '',
+                role: 'admin|teacher',
+                permission: '',
+                child: [],
+                menuName: 'privateVote',
+                isShow: true
+            },
+            {
+                icon: 'iconfont icon-questionnaire',
+                name: this.$t('system.menu.scQu'),
+                router: '/home/privateQuestionnaire',
+                tag: '',
+                role: 'admin|teacher',
+                permission: '',
+                child: [],
+                menuName: 'privateQuestionnaire',
+                isShow: true
+            }, */
+          ]
+        },
+        // 苏格拉底
+        {
+          icon: 'iconfont icon-course-videos',
+          name: this.$t('system.menu.toSokrates'),
+          router: '#',
+          tag: '',
+          role: 'admin|teacher',
+          child: [],
+          permission: '',
+          menuName: 'privSokrate',
+          isShow: this.IES5Menu,
+          to: 'privSokrate'
+        },
       ]
       return data
     }

+ 6 - 1
TEAMModelOS/ClientApp/src/router/routes.js

@@ -1539,7 +1539,7 @@ export const routes = [{
 {
     name: 'area',
     path: '/area',
-    redirect: '/area/areaMgmt',
+    redirect: '/area/areaIndex',
     component: () => import('@/view/areaMgmt/AreaBase.vue'),
     children: [
         //政策文件
@@ -1646,6 +1646,11 @@ export const routes = [{
                 activeName: 'areaMgmt'
             }
         },
+        {
+            path: 'areaIndex',
+            name: 'areaIndex',
+            component: () => import('@/view/areaMgmt/AreaIndex.vue'),
+        },
         // 学校总览
         {
             path: 'schoolMgmt',

+ 1 - 1
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaBase.vue

@@ -180,7 +180,7 @@ export default {
       })
     },
     toHome() {
-      this.$router.push({ path: '/area/areaMgmt' })
+      this.$router.push({ path: '/area/areaIndex' })
     },
     toSettings() {
       this.$router.push({ path: '/home/settings' })

+ 14 - 0
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaIndex.vue

@@ -0,0 +1,14 @@
+<template>
+  <div class="area-index">
+    AreaIndex
+  </div>
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+</style>

+ 74 - 51
TEAMModelOS/ClientApp/src/view/areaMgmt/AreaLayout.vue

@@ -257,55 +257,17 @@ export default {
     // 教师专业成长
     teacherMenu() {
       return [
-        {
-          icon: 'iconfont icon-activityS',
-          name: this.$t('area.base.allAc'),
-          router: '/area/TrainAreaMgt',
-          tag: '',
-          role: '',
-          permission: '',
-          menuName: 'TrainAreaMgt',
-          child: [],
-          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain()
-        },
-        // 苏格拉底
-        {
-          icon: 'iconfont icon-course-videos',
-          name: this.$t('system.menu.toSokrates'),
-          router: '#',
-          tag: '',
-          role: '',
-          child: [],
-          permission: '',
-          menuName: 'privSokrate',
-          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain(),
-          to: 'privSokrate'
-        },
-        // 活动系统
-        {
-          icon: 'iconfont icon-myNote',
-          name: this.$t('system.menu.activity'),
-          router: '#',
-          tag: '',
-          role: 'admin|teacher',
-          child: [],
-          permission: '',
-          menuName: 'activity',
-          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain(),
-          to: 'activity'
-        },
-        // 资源平台
-        {
-          icon: 'iconfont icon-app',
-          name: this.$t('system.menu.platform'),
-          router: '/area/mgtPlatform',
-          tag: '',
-          role: '',
-          permission: '',
-          menuName: 'mgtPlatform',
-          child: [],
-          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain()
-        },
+        // {
+        //   icon: 'iconfont icon-activityS',
+        //   name: this.$t('area.base.allAc'),
+        //   router: '/area/TrainAreaMgt',
+        //   tag: '',
+        //   role: '',
+        //   permission: '',
+        //   menuName: 'TrainAreaMgt',
+        //   child: [],
+        //   isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain()
+        // },
         // 研修平台
         {
           icon: 'iconfont icon-basic-setting',
@@ -318,7 +280,29 @@ export default {
           menuName: 'trainCenter',
           child: [
             {
-              icon: 'iconfont icon-basic-setting',
+              icon: 'iconfont icon-dashboard-change',
+              name: this.$t('td.td86'),
+              router: '/area/areaMgmt',
+              tag: '',
+              role: 'admin|teacher|expert',
+              permission: '',
+              menuName: 'areaMgmt',
+              child: [],
+              isShow: this.$store.state.config.srvAdr == 'China'
+            },
+            {
+              icon: 'iconfont icon-ketanghudonghangwei',
+              name: this.$t('home.trainLabel3'),
+              router: '/area/TrainAreaMgt',
+              tag: '',
+              role: 'admin|teacher|expert',
+              permission: '',
+              menuName: 'TrainAreaMgt',
+              child: [],
+              isShow: this.$store.state.config.srvAdr == 'China'
+            },
+            {
+              icon: 'iconfont icon-app',
               name: this.$t('area.base.setting'),
               router: '/area/areaSetting',
               tag: '',
@@ -374,7 +358,46 @@ export default {
             }
           ],
           isShow: this.$store.state.config.srvAdr == 'China'
-        }
+        },
+        // 苏格拉底
+        {
+          icon: 'iconfont icon-course-videos',
+          name: this.$t('system.menu.toSokrates'),
+          router: '#',
+          tag: '',
+          role: '',
+          child: [],
+          permission: '',
+          menuName: 'privSokrate',
+          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain(),
+          to: 'privSokrate'
+        },
+        // 活动系统
+        {
+          icon: 'iconfont icon-myNote',
+          name: this.$t('system.menu.activity'),
+          router: '#',
+          tag: '',
+          role: 'admin|teacher',
+          child: [],
+          permission: '',
+          menuName: 'activity',
+          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain(),
+          to: 'activity'
+        },
+        // 资源平台
+        {
+          icon: 'iconfont icon-app',
+          name: this.$t('system.menu.platform'),
+          router: '/area/mgtPlatform',
+          tag: '',
+          role: '',
+          permission: '',
+          menuName: 'mgtPlatform',
+          child: [],
+          isShow: !this.$jsFn.checkJinNiu() && !this.$jsFn.checkTrain()
+        },
+
       ]
     },
     studentMenu() {

+ 1 - 1
TEAMModelOS/ClientApp/src/view/research-center/ReportPreview.vue

@@ -8,8 +8,8 @@
       <p class="cond-text">
         <span>{{ $store.state.user.schoolProfile.school_base.name }}</span>
         <span>{{ curPeriod.name }}</span>
-        <span>{{ condSub }}</span>
         <span>{{ condGrade }}</span>
+        <span>{{ condSub }}</span>
         <span v-show="condRange">{{ condRange }}</span>
       </p>
       <div class="static-wrap">

+ 1 - 1
TEAMModelOS/Controllers/Analysis/ClassAnalysisController.cs

@@ -172,7 +172,7 @@ namespace TEAMModelOS.Controllers.Analysis
             }
             catch (Exception e)
             {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysis-recod()\n{e.Message}\n{e.StackTrace}\n", GroupNames.醍摩豆服務運維群組);
+                await _dingDing.SendBotMsg($"OS,{_option.Location},analysis/analysis-recod()\n{e.Message}\n{e.StackTrace}\n\n{request.ToJsonString()}", GroupNames.醍摩豆服務運維群組);
                 return BadRequest();
             }
 

+ 18 - 17
TEAMModelOS/Controllers/Both/ShareController.cs

@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Options;
+using OpenXmlPowerTools;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -139,6 +140,7 @@ namespace TEAMModelOS.Controllers
                                     return BadRequest();
                                 }
                                 (Syllabus syllabus, List<Share> shares) = DoAuth(request, syllabusD);
+                                string tmdid = "";
                                 foreach (var x in shares)
                                 {
                                     await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<Share>(x, new PartitionKey($"{x.code}"));
@@ -149,17 +151,17 @@ namespace TEAMModelOS.Controllers
                                     {
                                         continue;
                                     }
-                                    string tmdid = x.code.Replace("Share-", "").Replace($"{x.type}-", "");
-                                   
-                                   
-                                    if (x.type.Equals("coedit")) {
-                                        School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(request.school, new Azure.Cosmos.PartitionKey("Base"));
-                                        Teacher targetTeacher = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>($"{tmdid}", new PartitionKey($"Base"));
-                                        _coreAPIHttpService.PushNotify(new List<IdNameCode> { new IdNameCode { id = targetTeacher.id, name = targetTeacher.name, code = targetTeacher.lang } }, $"{x.type}_syllabus", Constant.NotifyType_IES5_Contect,
-                                                     new Dictionary<string, object> {
-                                                         { "tmdname", x.issuerName }, { "tmdid", x.issuer }, { "schoolId",school.id}, { "schoolName",school.name},{ "volumeId", x.volumeId }, { "syllabusId", x.id }, { "volumeName", x.volumeName }, { "syllabusName", x.syllabusName } }
-                                                     , _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
-                                    }
+                                    tmdid = x.code.Replace("Share-", "").Replace($"{x.type}-", "");
+                                    
+                                }
+                                if (request.type.Equals("coedit"))
+                                {
+                                    School school = await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, "School").ReadItemAsync<School>(request.school, new Azure.Cosmos.PartitionKey("Base"));
+                                    Teacher targetTeacher = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>($"{tmdid}", new PartitionKey($"Base"));
+                                    _coreAPIHttpService.PushNotify(new List<IdNameCode> { new IdNameCode { id = targetTeacher.id, name = targetTeacher.name, code = targetTeacher.lang } }, $"{request.type}_syllabus", Constant.NotifyType_IES5_Contect,
+                                                 new Dictionary<string, object> {
+                                                         { "tmdname", request.issuerName }, { "tmdid", request.issuer }, { "schoolId",school.id}, { "schoolName",school.name},{ "volumeId", request.volumeId }, { "syllabusId", quest.syllabusId }, { "volumeName", request.volumeName }, { "syllabusName", quest.syllabusName } }
+                                                 , _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
                                 }
                                 await client.GetContainer(Constant.TEAMModelOS, "School").UpsertItemAsync<Syllabus>(syllabus, new PartitionKey($"Syllabus-{request.school}"));
                             }
@@ -215,6 +217,7 @@ namespace TEAMModelOS.Controllers
                             else if (request.opt.Equals("add") || request.opt.Equals("edit"))
                             {
                                 (Syllabus vlm, List<Share> shares) = DoAuth(request, syllabusD);
+                                string tmdid = "";
                                 foreach (var x in shares)
                                 {
                                     await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<Share>(x, new PartitionKey($"{x.code}"));
@@ -225,13 +228,11 @@ namespace TEAMModelOS.Controllers
                                     {
                                         continue;
                                     }
-                                    string tmdid = x.code.Replace("Share-", "").Replace($"{x.type}-", "");
-                                    
-                                    Teacher targetTeacher = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>($"{tmdid}", new PartitionKey($"Base"));
-                                    _coreAPIHttpService.PushNotify(new List<IdNameCode> { new IdNameCode { id = targetTeacher.id, name = targetTeacher.name, code = targetTeacher.lang } }, $"{x.type}_syllabus", Constant.NotifyType_IES5_Contect,
-                                                 new Dictionary<string, object> { { "tmdname", x.issuerName } , { "tmdid", x.issuer },  { "volumeId", x.volumeId }, { "syllabusId", x.id }, { "volumeName", x.volumeName }, { "syllabusName", x.syllabusName } }, _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
-
+                                    tmdid = x.code.Replace("Share-", "").Replace($"{x.type}-", "");
                                 }
+                                Teacher targetTeacher = await client.GetContainer(Constant.TEAMModelOS, Constant.Teacher).ReadItemAsync<Teacher>($"{tmdid}", new PartitionKey($"Base"));
+                                _coreAPIHttpService.PushNotify(new List<IdNameCode> { new IdNameCode { id = targetTeacher.id, name = targetTeacher.name, code = targetTeacher.lang } }, $"{request.type}_syllabus", Constant.NotifyType_IES5_Contect,
+                                new Dictionary<string, object> { { "tmdname", request.issuerName }, { "tmdid", request.issuer }, { "volumeId", request.volumeId }, { "syllabusId", quest.syllabusId }, { "volumeName", request.volumeName }, { "syllabusName", quest.syllabusName } }, _option.Location, _configuration, _dingDing, _environment.ContentRootPath);
                                 await client.GetContainer(Constant.TEAMModelOS, "Teacher").UpsertItemAsync<Syllabus>(syllabusD, new PartitionKey($"Syllabus-{request.issuer}"));
                             }
                         }

+ 1 - 0
TEAMModelOS/Controllers/OpenApi/Business/BizCustomizeController.cs

@@ -425,6 +425,7 @@ namespace TEAMModelOS.Controllers
             StudentArtResult studentArtResult = new();
             var cosmosClient = _azureCosmos.GetCosmosClient();
             var ids = oAnswer.thirdAnswerId.Split("::");
+            await   _dingDing.SendBotMsg($"智音数据推送数据已接受\n参数:{jsonElement.ToJsonString()}", GroupNames.成都开发測試群組);
             if (ids.Length == 3)
             {
                 string artId = ids[0];