Ver código fonte

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

CrazyIter_Bin 1 ano atrás
pai
commit
7cd337aca9

+ 1 - 1
TEAMModelBI/ClientApp/public/index.html

@@ -12,7 +12,7 @@
     </title>
 </head>
 <script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
-<script src="https://at.alicdn.com/t/c/font_2934132_zba0ifa4ele.js"></script>
+<script src="https://at.alicdn.com/t/c/font_2934132_8gobztzrfnq.js"></script>
 <script src="../src/access/iconfont.js"></script>
 
 <body>

BIN
TEAMModelBI/ClientApp/src/assets/img/notspecial-icon.png


BIN
TEAMModelBI/ClientApp/src/assets/img/special-icon.png


+ 8 - 3
TEAMModelBI/ClientApp/src/view/userInquire/details.vue

@@ -5,7 +5,10 @@
     <div class="userdetails" v-loading="loading" element-loading-text="数据加载中...">
         <div class="topbox">
            <div class="img-name">
-            <div class="topbox-images"><el-image :src="randomImage" fit="contain" /></div>
+            <div class="topbox-images">
+                <el-image :src="userPortrait" v-if="userPortrait"/>
+                <el-image :src="randomImage" fit="contain" v-else/>
+            </div>
             <div class="topbox-name">
                 <div class="topbox-name-text">{{usernames}}</div>
                 <div class="topbox-name-advance" @click="userdetailState=true">查看账户进阶数据<el-icon><MoreFilled /></el-icon></div>
@@ -50,7 +53,7 @@
         <el-divider />
         <!--账户进阶数据-->
         <div class="user-details" v-if="userdetailState">
-            <Userdetail @updateView='handleChildEvent '></Userdetail>
+            <Userdetail @updateView='handleChildEvent' :detailsData="pointsData"></Userdetail>
         </div>
          <!--账户进阶数据 end-->
         <!--产品页面-->
@@ -714,6 +717,7 @@ let headerData=ref([
     require('@/assets/img/default3.png'),
     require('@/assets/img/default4.png'),
     ])
+let userPortrait=ref()     //用户头像
 const randomImage = computed(()=>{
     const randomIndex = Math.floor(Math.random() * headerData.value.length);
     console.log(randomIndex,'随机头像')
@@ -732,7 +736,8 @@ function initdata() {
     let transmitData = detailsData.value[transferNum.value]
     console.log(transmitData,'数据')
     //header 基础信息 
-    let { name,id,mobile, mail, schoolCode, schoolCodeW, points,country,province,city,} = transmitData
+    let { name,id,mobile, mail, schoolCode, schoolCodeW, points,country,province,city,picture} = transmitData
+    userPortrait.value=picture
     usernames.value=name
     userdata.value[0].value = id
     userdata.value[1].value = mobile

+ 2 - 1
TEAMModelBI/ClientApp/src/view/userInquire/index.vue

@@ -56,7 +56,7 @@ let searchvalue=ref('')
 let selecttypes = ref('precise')
 let searchResult=ref()
 let searchLoading=ref(false)
-const searchRecordsArr = ref(JSON.parse(localStorage.getItem('searchRecords')));
+const searchRecordsArr = ref(localStorage.getItem('searchRecords') ?  JSON.parse(localStorage.getItem('searchRecords')):[]);
 const backClicks=()=>{pageShow.value='default'}
 console.log(searchRecordsArr.value,'搜索记录')
 function seachSole(datavalue) {
@@ -105,6 +105,7 @@ function seachSole(datavalue) {
 // 保存搜索记录到localStorage(重复搜索的只记录一个)
 function saveSearchRecord(keyword) {
   let searchRecords = localStorage.getItem('searchRecords');
+  console.log(searchRecords,'存储数据')
   !searchRecords ?searchRecords = []:searchRecords = JSON.parse(searchRecords);
   if (!searchRecords.includes(keyword)) {
     searchRecords.push(keyword);

+ 67 - 15
TEAMModelBI/ClientApp/src/view/userInquire/userdetail.vue

@@ -10,23 +10,26 @@
                                 <use :xlink:href="[item.state ? item.icon+'1':item.icon]"></use>
                             </svg>
                         </div>
+                        <div class="third-party-item" title="教育云">
+                            <img :src="specialBind" class="third-party-itemicon">
+                        </div>
                      </div>
                 </el-form-item>
                 <el-form-item label="用户积分">
                     <div class="user-from-integral">
-                        <span>58</span><span>/</span><span>78</span>
+                        <span>{{integralAndticket.integral.used}}</span><span>/</span><span>{{integralAndticket.integral.total}}</span>
                     </div>
                 </el-form-item>
                 <el-form-item label="用户票卷">
                     <div class="user-from-integral">
-                        <span>8</span><span>/</span><span>8</span>
+                        <span>{{integralAndticket.ticket.used}}</span><span>/</span><span>{{integralAndticket.ticket.total}}</span>
                     </div>
                 </el-form-item>
-                <el-form-item label="注册时间">
+                <!-- <el-form-item label="注册时间">
                     <div class="user-from-integral">
                         <span>2019-05-28</span>
                     </div>
-                </el-form-item>
+                </el-form-item> -->
                 <el-form-item label="账户语系">
                     <div class="user-from-integral">
                         <div v-show="!userdata.countrystate">
@@ -43,9 +46,9 @@
                               />
                             </el-select>
                         </div>
-                        <div class="redacticon">
+                        <!-- <div class="redacticon">
                             <el-icon size="20" @click="userdata.countrystate=true"><EditPen /></el-icon>
-                        </div>
+                        </div> -->
                     </div>
                 </el-form-item>
                 <el-form-item label="单位名称">
@@ -56,9 +59,9 @@
                         <div v-show="userdata.companystate">
                             <el-input v-model="userdata.company"  placeholder="公司/单位 名称" />
                         </div>
-                        <div class="redacticon">
+                        <!-- <div class="redacticon">
                             <el-icon size="20" @click="userdata.companystate=true"><EditPen /></el-icon>
-                        </div>
+                        </div> -->
                     </div>
                 </el-form-item>
                 <el-form-item label="单位类别">
@@ -76,9 +79,9 @@
                                 />
                             </el-select>
                         </div>
-                        <div class="redacticon">
+                        <!-- <div class="redacticon">
                             <el-icon size="20" @click="userdata.typestate=true"><EditPen /></el-icon>
-                        </div>
+                        </div> -->
                     </div>
                 </el-form-item>
                 <el-form-item label="职称">
@@ -89,9 +92,9 @@
                         <div v-show="userdata.professionalstate">
                             <el-input v-model="userdata.professional"  placeholder="职称" />
                         </div>
-                        <div class="redacticon">
+                        <!-- <div class="redacticon">
                             <el-icon size="20" @click="userdata.professionalstate=true"><EditPen /></el-icon>
-                        </div>
+                        </div> -->
                     </div>
                 </el-form-item>
                 <el-form-item class="submitbtn" v-show="userdata.countrystate || userdata.companystate || userdata.typestate || userdata.professionalstate">
@@ -108,6 +111,9 @@
  import { ref, getCurrentInstance, watch, h, nextTick, onMounted,defineEmits } from 'vue'
  import { EditPen, Back } from '@element-plus/icons-vue'
  const emits = defineEmits(['updateView'])
+ let props = defineProps({
+    detailsData: Object,
+})
  let userdata = ref({
       name: '',
       country: '',
@@ -120,9 +126,13 @@
       professionalstate:false,
  })
  let thridPartydata = ref([
-      { name: '微信', icon: '#icon-weixin', state: true, key: 'wechart' },
-      { name: '钉钉', icon: '#icon-dingding', state: true, key: 'dingding' },
+      { name: '微信', icon: '#icon-weixin', state: false, key:'wechart' },
+      { name: '钉钉', icon: '#icon-dingding', state: false, key:'ding' },
+      { name: 'Facebook', icon:'#icon-facebook', state: false, key:'facebook' },
+      { name: 'Google', icon:'#icon-google', state: false, key:'google' },
+      { name: 'Apple', icon:'#icon-logo_apple', state: false, key:'apple' },
  ])
+ let specialBind=ref(require('@/assets/img/notspecial-icon.png'))
  let options=ref( [
     {
       value: 'zh-cn',
@@ -137,6 +147,16 @@
       label: '简体',
     },
   ])
+ let integralAndticket=ref({
+    integral:{
+        used:0,
+        total:0,
+    },
+    ticket:{
+        used:0,
+        total:0,
+    }
+ })
 const optionsT = ref([
   {
     value: 'Option1',
@@ -165,7 +185,38 @@ function handleChange(value) {
  function backs() {
     console.log('123')
     emits('updateView',true);
- }
+}
+function inidatas(){
+    console.log(props,'用户详情')
+    let originalData=props?.detailsData
+    //处理绑定第三方
+    let {wechat,ding,facebook,google,apple,educloudtw,points,coupons,lang,unitName,jobTitle,unitType}=originalData
+    wechat ? thridPartydata.value[0].state=true:thridPartydata.value[0].state=false
+    ding ? thridPartydata.value[1].state=true:thridPartydata.value[1].state=false
+    facebook ? thridPartydata.value[2].state=true:thridPartydata.value[2].state=false
+    google ? thridPartydata.value[3].state=true:thridPartydata.value[3].state=false
+    apple ? thridPartydata.value[4].state=true:thridPartydata.value[4].state=false
+    educloudtw ? specialBind.value=require('@/assets/img/special-icon.png'):specialBind.value=require('@/assets/img/notspecial-icon.png')
+    //积分票卷
+    integralAndticket.value.integral.used=points.balance
+    integralAndticket.value.integral.total=points.points
+    integralAndticket.value.ticket.used=coupons.length
+    integralAndticket.value.ticket.total=coupons.length
+    //语系 公司 职称
+    userdata.value.country=lang ==='zh-cn' ? '中文简体':lang ==='zh-tw' ?'中文繁体':'英语'
+    userdata.value.company=unitName
+    userdata.value.type =unitType == '1'? '基礎教育機構':
+    unitType =='2' ? 中等教育機構:unitType=='3' ? '高等教育機構':unitType=='4' ? '政府單位機構':unitType=='5' ? 'NGO機構':
+    unitType =='6' ? '企業機構':unitType=='7' ? '其他':unitType=='8' ? '學前教育':unitType=='9' ? '特殊教育':''
+    userdata.value.professional=jobTitle
+}
+onMounted(() => {
+    inidatas()
+})
+watch(()=>props,(newdata)=>{
+    console.log(newdata,'新值-进阶数据')
+    newdata.detailsData ? inidatas():''
+},{deep:true})
  </script>
  <style scoped>
  .user-forward{
@@ -186,6 +237,7 @@ function handleChange(value) {
     overflow: hidden;
     margin-right: 25px;
     margin-left: 0px;
+    cursor: pointer;
  }
  .third-party{
     display: flex;

+ 28 - 6
TEAMModelBI/Controllers/BITmid/TmidController.cs

@@ -73,7 +73,7 @@ namespace TEAMModelBI.Controllers.BITmid
                 Dictionary<string, TmidStics> tmidDic = new();
 
                 QueryDefinition query =
-                       new QueryDefinition(@"SELECT c.id, c.name, c.mobile, c.mail FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
+                       new QueryDefinition(@"SELECT c.id, c.name, c.picture, c.mobile, c.mail, c.lang, c.wechat, c.facebook, c.google, c.ding, c.apple, c.educloudtw, c.ts FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
                        .WithParameter("@key", tmids);
                 await foreach (var item in cosmosClientCsv2
                             .GetContainer("Core", "ID2")
@@ -88,10 +88,17 @@ namespace TEAMModelBI.Controllers.BITmid
                             if(!tmids.Contains(id)) tmids.Add(id);
                             //基本資料
                             TmidStics tmidStics = (tmidDic.ContainsKey(id)) ? tmidDic[id] : new() { id = id };
-                            string tmidName = doc.GetProperty("name").GetString();
-                            string tmidMobile = GenDataMask(doc.GetProperty("mobile").GetString(), "mobile");
-                            string tmidMail = GenDataMask(doc.GetProperty("mail").GetString(), "mail");
-
+                            tmidStics.name = doc.GetProperty("name").GetString();
+                            tmidStics.picture = doc.GetProperty("picture").GetString();
+                            tmidStics.mobile = GenDataMask(doc.GetProperty("mobile").GetString(), "mobile");
+                            tmidStics.mail = GenDataMask(doc.GetProperty("mail").GetString(), "mail");
+                            tmidStics.lang = (doc.TryGetProperty("lang", out JsonElement lang)) ? lang.GetString() : string.Empty;
+                            tmidStics.wechat = (doc.TryGetProperty("wechat", out JsonElement wechat) && !string.IsNullOrWhiteSpace(wechat.GetString())) ? true : false;
+                            tmidStics.facebook = (doc.TryGetProperty("facebook", out JsonElement facebook) && !string.IsNullOrWhiteSpace(facebook.GetString())) ? true : false;
+                            tmidStics.google = (doc.TryGetProperty("google", out JsonElement google) && !string.IsNullOrWhiteSpace(google.GetString())) ? true : false;
+                            tmidStics.ding = (doc.TryGetProperty("ding", out JsonElement ding) && !string.IsNullOrWhiteSpace(ding.GetString())) ? true : false;
+                            tmidStics.apple = (doc.TryGetProperty("apple", out JsonElement apple) && !string.IsNullOrWhiteSpace(apple.GetString())) ? true : false;
+                            tmidStics.ts = (doc.TryGetProperty("ts", out JsonElement ts)) ? ts.GetInt64() : 0;
                             //票券
                             var usersCoupons = tableCouponClient.Get<DynamicTableEntity>(id);
                             foreach (var coupon in usersCoupons)
@@ -140,7 +147,7 @@ namespace TEAMModelBI.Controllers.BITmid
                 }
 
                 //ID進階資料
-                query = new QueryDefinition(@"SELECT c.id, c.name, c.mobile, c.mail, c.country, c.province, c.city, c.schoolCode, c.schoolCodeW FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
+                query = new QueryDefinition(@"SELECT c.id, c.name, c.mobile, c.mail, c.country, c.province, c.city, c.schoolCode, c.schoolCodeW, c.unitType, c.unitName, c.jobTitle FROM c WHERE (ARRAY_CONTAINS(@key, c.id) OR ARRAY_CONTAINS(@key, c.mobile))")
                        .WithParameter("@key", tmids);
                 await foreach (var item in cosmosClientCsv2
                             .GetContainer("Core", "ID2")
@@ -161,6 +168,9 @@ namespace TEAMModelBI.Controllers.BITmid
                             tmidStics.city = doc.GetProperty("city").GetString();
                             tmidStics.schoolCode = (doc.TryGetProperty("schoolCode", out JsonElement schCode)) ? schCode.GetString() : string.Empty;
                             tmidStics.schoolCodeW = (doc.TryGetProperty("schoolCodeW", out JsonElement schCodeW)) ? schCodeW.GetString() : string.Empty;
+                            tmidStics.unitType = (doc.TryGetProperty("unitType", out JsonElement unitType)) ? unitType.GetString() : string.Empty;
+                            tmidStics.unitName = (doc.TryGetProperty("unitName", out JsonElement unitName)) ? unitName.GetString() : string.Empty;
+                            tmidStics.jobTitle = (doc.TryGetProperty("jobTitle", out JsonElement jobTitle)) ? jobTitle.GetString() : string.Empty;
                         }
                     }
                 }
@@ -538,6 +548,7 @@ namespace TEAMModelBI.Controllers.BITmid
         {
             public string id { get; set; }
             public string name { get; set; }
+            public string picture { get; set; }
             public string mobile { get; set; }
             public string mail { get; set; }
             public string country { get; set; }
@@ -545,6 +556,10 @@ namespace TEAMModelBI.Controllers.BITmid
             public string city { get; set; }
             public string schoolCode { get; set; }
             public string schoolCodeW { get; set; }
+            public string lang { get; set; }
+            public string unitType { get; set; } //1:基礎教育機構(K-小學) 2:中等教育機構(國中、高中/職) 3:高等教育機構 4:政府單位機構 5:NGO機構 6:企業機構 7:其他 8:學前教育 9:特殊教育
+            public string unitName { get; set; }
+            public string jobTitle { get; set; }
             public TmidSticsIes5 ies5 { get; set; } = new(); //IES統計資料
             public TmidPoints points { get; set; } = new();
             public TmidSokrates sokrates { get; set; } = new();
@@ -553,6 +568,13 @@ namespace TEAMModelBI.Controllers.BITmid
             public List<TmidLoginTime> login { get; set; } = new();
             public List<object> prod { get; set; } = new();
             public TmidIot iot { get; set; } = new();
+            public bool wechat { get; set; }
+            public bool facebook { get; set; }
+            public bool google { get; set; }
+            public bool ding { get; set; }
+            public bool apple { get; set; }
+            public bool educloudtw { get; set; }
+            public long ts { get; set; } //資料最終變更時間
         }
         //TMID統計 IES5資訊
         private class TmidSticsIes5

+ 7 - 6
TEAMModelOS.FunctionV4/TimeTrigger/IESTimerTrigger.cs

@@ -438,13 +438,14 @@ namespace TEAMModelOS.FunctionV4.TimeTrigger
 
         /// <summary>
         /// 每天執行 計算各學生各科錯題庫的數量,記入Redis 執行時間:每日2時1分
+        /// 「新增錯題數」取得方法改由智慧錯題的時間戳記判斷,每日統計錯題數已不需要
         /// </summary>
-        [Function("CntStuErrorItems")]
-        public async Task CntStuErrorItems([TimerTrigger("0 1 2 * * *")] TimerInfo myTimer, ILogger log)
-        {
-            var _azureCosmosClient = _azureCosmos.GetCosmosClient();
-            await ErrorItemsService.cntStuErrorItemsAsync(_azureRedis, _azureCosmosClient, _dingDing);
-        }
+        //[Function("CntStuErrorItems")]
+        //public async Task CntStuErrorItems([TimerTrigger("0 1 2 * * *")] TimerInfo myTimer, ILogger log)
+        //{
+        //    var _azureCosmosClient = _azureCosmos.GetCosmosClient();
+        //    await ErrorItemsService.cntStuErrorItemsAsync(_azureRedis, _azureCosmosClient, _dingDing);
+        //}
 
         public class UnusedLock { 
             public int field { get; set; }

+ 5 - 5
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -7589,11 +7589,11 @@ const LANG_EN_US = {
             totals:'Total'
         },
         classrooming: {
-            title: 'Lesson Statistics',
-            taskNums: 'Total Tasks',
-            productionNums: 'Total Works',
-            topicNums: 'Total Questions',
-            interactionNums: 'Total Interactions',
+            title: 'Statistics in Class',
+            taskNums: 'Learning tasks',
+            productionNums: 'Learning works',
+            topicNums: 'Questions',
+            interactionNums: 'Student interactions',
         },
         device: {
             title: 'Device Statistics',

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

@@ -7591,10 +7591,10 @@ const LANG_ZH_CN = {
         },
         classrooming: {
             title: '课中统计',
-            taskNums: '任务数',
-            productionNums: '作品数',
-            topicNums: '题目数',
-            interactionNums: '互动次数',
+            taskNums: '学习任务数',
+            productionNums: '学习作品数',
+            topicNums: '测验题目数',
+            interactionNums: '学生互动次数',
         },
         device: {
             title: '设备统计',

+ 5 - 5
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -7590,11 +7590,11 @@ const LANG_ZH_TW = {
             totals: '總計',
         },
         classrooming: {
-            title: '應用統計',
-            taskNums: '任務數',
-            productionNums: '作品數',
-            topicNums: '題目數',
-            interactionNums: '互動次數',
+            title: '課中統計',
+            taskNums: '學習任務數',
+            productionNums: '學習作品數',
+            topicNums: '測驗題目數',
+            interactionNums: '學生互動次數',
         },
         device: {
             title: '裝置統計',

+ 8 - 8
TEAMModelOS/ClientApp/src/view/iot/areaiot.vue

@@ -69,13 +69,13 @@
                         </div> -->
                         <div :class="[item.key ==='classtime' || item.key ==='participationnum' ? 'topbox-lefts-ts':'topbox-lefts' ]">
                             <div :class="[item.key ==='participationnum' && locals==='en-us' ? 'common-title':'','item-title']">{{item.title}}</div>
-                            <div :class="[item.key === 'classtime' || item.key === 'participationnum' ? 'item-nums-special':'item-nums']">
+                            <div :class="[item.key === 'classtime' || item.key === 'participationnum' ? 'item-nums':'item-nums']">
                                     <p v-if="item.key === 'classtime' || item.key === 'participationnum'">
-                                        {{item.valueText}}
+                                        <!-- {{item.valueText}}
                                         <span class="timetag">Min</span>
-                                        <br/>
+                                        <br/> -->
                                         <span>
-                                            <span class="total-text">{{$t('schoolIot.basics.totals')}}</span>
+                                            <!-- <span class="total-text">{{$t('schoolIot.basics.totals')}}</span> -->
                                             {{item.valueHText}}
                                             <span class="timetag">H</span>
                                         </span>
@@ -86,7 +86,7 @@
                                     </p>
                             </div>
                         </div>
-                        <div class="interval-character" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">/</div>
+                        <!-- <div class="interval-character" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">/</div>
                         <div class="totalclass" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">
                         <div v-if="item.key ==='roomnum'">
                             <p class="totalclass-total">{{$t('schoolIot.basics.classTotals')}}</p>
@@ -100,7 +100,7 @@
                             <p class="totalclass-total">{{$t('schoolIot.basics.studentTotals')}}</p>
                             <p class="totalclass-num">{{item.total}}</p>
                         </div>    
-                        </div>
+                        </div> -->
                     </div>
                 </dv-border-box-12>
             </div>
@@ -243,10 +243,10 @@ export default {
         // { title: '学校简码', icon: '#icon-xuanzexuexiao-01', value: 'hbcn', key: 'code' },
         { title: this.$t('schoolIot.basics.classnums'), icon: '#icon-shouhuifangzi', value: 0, key: 'roomnum',total:0 },
         { title: this.$t('schoolIot.basics.teachnums'), icon: '#icon-jiaoshijie', value: 0, key: 'teachnum' ,total:0 },
-        { title: this.$t('schoolIot.basics.studentnums'), icon: '#icon-zongrenshu', value: 0, key: 'studentnum' ,total:0 },
-        { title: this.$t('schoolIot.basics.studentTime'), icon: '#icon-_shijian_xiaoshuai', value: 0, key: 'participationnum',valueText:'',valueHText:'',   },
         { title: this.$t('schoolIot.basics.classroomTotal'), icon: '#icon-ketang', value: 0, key: 'classnum' },
         { title: this.$t('schoolIot.basics.classroomTime'), icon: '#icon--shijian ', value:0, key: 'classtime',valueText:'',valueHText:'',},
+        { title: this.$t('schoolIot.basics.studentnums'), icon: '#icon-zongrenshu', value: 0, key: 'studentnum' ,total:0 },
+        { title: this.$t('schoolIot.basics.studentTime'), icon: '#icon-_shijian_xiaoshuai', value: 0, key: 'participationnum',valueText:'',valueHText:'',   },
         ],
         inuseList:[
         { title: this.$t('schoolIot.classrooming.taskNums'), value: 0, icon: 'iconfont icon-renwu',src:require("@/assets/image/iot/task.png"),class: 'task', textClass: 'task-text' },

+ 2 - 2
TEAMModelOS/ClientApp/src/view/iot/echarts/bar/bar.vue

@@ -143,10 +143,10 @@
 							trigger: 'item',
 						},
 						grid: {
-							top:'10%',
+							top:'15%',
 							left:'7%',
 							right:'3%',
-							bottom:'10%'
+							bottom:'8%'
 						},
 						toolbox: {
 							show: false

+ 33 - 17
TEAMModelOS/ClientApp/src/view/iot/schooliot.vue

@@ -38,15 +38,15 @@
                 <dv-border-box-12>
                     <div></div>
                     <div class="topbox-item" v-for="(item,index) in basicaList" :key="index">
-                        <div :class="[item.key ==='classtime' || item.key ==='participationnum' ? 'topbox-lefts-ts':'topbox-lefts' ]">
+                        <div :class="[item.key ==='classtime' || item.key ==='participationnum' ? 'topbox-lefts':'topbox-lefts' ]">
                             <div :class="[item.key ==='participationnum' && locals==='en-us' ? 'common-title':'','item-title']">{{item.title}}</div>
-                            <div :class="[item.key === 'classtime' || item.key === 'participationnum' ? 'item-nums-special':'item-nums']">
+                            <div :class="[item.key === 'classtime' || item.key === 'participationnum' ? 'item-nums':'item-nums']">
                                     <p v-if="item.key === 'classtime' || item.key === 'participationnum'">
-                                        {{item.valueText}}
+                                        <!-- {{item.valueText}}
                                         <span class="timetag">Min</span>
-                                        <br/>
+                                        <br/> -->
                                         <span>
-                                            <span class="total-text">{{$t('schoolIot.basics.totals')}}</span>
+                                            <!-- <span class="total-text">{{$t('schoolIot.basics.totals')}}</span> -->
                                             {{item.valueHText}}
                                             <span class="timetag">H</span>
                                         </span>
@@ -57,8 +57,8 @@
                                     </p>
                             </div>
                         </div>
-                        <div class="interval-character" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">/</div>
-                        <div class="totalclass" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">
+                        <!-- <div class="interval-character" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">/</div> -->
+                        <!-- <div class="totalclass" v-show="item.key === 'roomnum' || item.key === 'teachnum' || item.key === 'studentnum'">
                         <div v-if="item.key ==='roomnum'">
                             <p class="totalclass-total">{{$t('schoolIot.basics.classTotals')}}</p>
                             <p class="totalclass-num">{{item.total}}</p>
@@ -71,7 +71,7 @@
                             <p class="totalclass-total">{{$t('schoolIot.basics.studentTotals')}}</p>
                             <p class="totalclass-num">{{item.total}}</p>
                         </div>    
-                        </div>
+                        </div> -->
                     </div>
                 </dv-border-box-12>
             </div>
@@ -93,7 +93,10 @@
                     </dv-border-box-11>
                 </div>
                 <div class="restsbox-right">
-                    <dv-border-box-11 :title="$t('schoolIot.device.title')">
+                    <dv-border-box-11 title="数量与占比">
+                        <div class="total-solution">
+                            <Bar title="学期" :cdata="bars"></Bar>
+                        </div>
                         <!--设备统计-->
                         <!-- <div class="right-box">
                             <div class="right-box-left">
@@ -197,10 +200,10 @@ export default {
         // { title: '学校简码', icon: '#icon-xuanzexuexiao-01', value: 'hbcn', key: 'code' },
         { title: this.$t('schoolIot.basics.classnums'), icon: '#icon-shouhuifangzi', value: 65, key: 'roomnum',total:77, },
         { title: this.$t('schoolIot.basics.teachnums'), icon: '#icon-jiaoshijie', value: 158, key: 'teachnum',total:77, },
-        { title: this.$t('schoolIot.basics.studentnums'), icon: '#icon-zongrenshu', value: 7603, key: 'studentnum',total:77,},
-        { title: this.$t('schoolIot.basics.studentTime'), icon: '#icon-_shijian_xiaoshuai', value: 450, key: 'participationnum',valueText:'',valueHText:'',  },
         { title: this.$t('schoolIot.basics.classroomTotal'), icon: '#icon-ketang', value: 45, key: 'classnum' },
         { title: this.$t('schoolIot.basics.classroomTime'), icon: '#icon--shijian ', value: 648, key: 'classtime',valueText:'',valueHText:'',  },
+        { title: this.$t('schoolIot.basics.studentnums'), icon: '#icon-zongrenshu', value: 7603, key: 'studentnum',total:77,},
+        { title: this.$t('schoolIot.basics.studentTime'), icon: '#icon-_shijian_xiaoshuai', value: 450, key: 'participationnum',valueText:'',valueHText:'',  },
         ],
         inuseList:[
         { title: this.$t('schoolIot.classrooming.taskNums'), value: 15, icon: 'iconfont icon-renwu',src:require("@/assets/image/iot/task.png"),class: 'task', textClass: 'task-text' },
@@ -590,26 +593,26 @@ export default {
 }
 .restsbox{
     width:100%;
-    height:21vh;
+    height:30vh;
     display: flex;
     flex-wrap: nowrap;
     justify-content: space-between;
 }
 .restsbox-left{
-    width:100%;
+    width:50%;
 }
 .restsbox-right{
-    width:0%;
+    width:50%;
 }
 .left-item{
   width: 21%;
   display: flex;
-  height: 110px;
+  height: 130px;
   justify-content: center;
   align-items: center;
   border-radius: 5px;
   background-color: rgba(19, 25, 47, 0.6);
-  margin: 4% 2% 1% 2%;
+  margin: 2% 2% 0% 2%;
 }
 .item-img {
   width: 30%;
@@ -671,7 +674,7 @@ export default {
 .bottombox{
     width:100%;
     display: flex;
-    height:50vh;
+    height:44vh;
 }
 .bottombox-left{
     width:55%;
@@ -692,6 +695,13 @@ export default {
     /* display: flex;
     flex-wrap: wrap; */
 }
+.total-solution{
+    width:100%;
+    height:80%;
+    margin:0% 2%;
+    background-color: rgba(19, 25, 47, 0.6);
+    margin-top:5.5%;
+}
 .bottombox-right{
     width:45%;
 }
@@ -767,9 +777,15 @@ export default {
 .total-text{
     margin:0px 0px;
 }
+
 </style>
 <style>
 .schooliotbox .topbox  .border-box-content,.schooliotbox .restsbox .border-box-content{
     display: flex;
 }
+.restsbox-left .border-box-content{
+    display: flex;
+    justify-content: center !important;
+    align-items: center !important;
+}
 </style>

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

@@ -2169,6 +2169,7 @@ namespace TEAMModelOS.Controllers
                 int lTypeMis = 0; ///學習型態: 任務
                 int lTypeTst = 0; ///學習型態: 測驗
                 int lTypeDif = 0; ///學習型態: 差異化
+                List<string> deviceList = new List<string>(); ///設備統計(教室數統計)
                 List<string> htcDevList = new List<string>(); ///設備統計-HiTeach Device list
                 List<string> htaDevList = new List<string>(); ///設備統計-HiTA Device list
                 List<string> htccDevList = new List<string>(); ///設備統計-HiTeachCC Device list
@@ -2201,6 +2202,7 @@ namespace TEAMModelOS.Controllers
                         missionFin += data.missionFin;
                         item += data.item;
                         interact += data.interact;
+                        deviceList = deviceList.Union(data.deviceList).ToList();
                         if (data.toolType.Equals("HiTeach")) htcDevList = htcDevList.Union(data.deviceList).ToList();
                         if (data.toolType.Equals("HiTA")) htaDevList = htaDevList.Union(data.deviceList).ToList();
                         if (data.toolType.Equals("HiTeachCC")) htccDevList = htccDevList.Union(data.deviceList).ToList();
@@ -2228,7 +2230,7 @@ namespace TEAMModelOS.Controllers
                 }
                 int htccDevCnt = htccDevList.Count; ///設備統計-HiTeachCC上線數
 
-                return Ok(new { sdate = $"{dateFromYear}-{dateFromMonth}-{dateFromDay}", edate = $"{dateToYear}-{dateToMonth}-{dateToDay}", classCnt, teacherCnt, teacherShow, studentCnt, deviceAuthCnt, stuShow, stuLessonLengMin, lessonRecord, lessonLengMin, mission, missionFin, item, interact, htcDevCnt, htcDevTotalCnt, htaDevCnt, htaDevTotalCnt, htccDevCnt, lTypeCoop, lTypeIact, lTypeMis, lTypeTst, lTypeDif, iotData });
+                return Ok(new { sdate = $"{dateFromYear}-{dateFromMonth}-{dateFromDay}", edate = $"{dateToYear}-{dateToMonth}-{dateToDay}", classCnt, teacherCnt, teacherShow, tmidList, studentCnt, deviceAuthCnt, stuShow, stuLessonLengMin, lessonRecord, lessonLengMin, mission, missionFin, item, interact, deviceList, htcDevCnt, htcDevTotalCnt, htaDevCnt, htaDevTotalCnt, htccDevCnt, lTypeCoop, lTypeIact, lTypeMis, lTypeTst, lTypeDif, iotData });
             }
             catch (Exception ex)
             {