소스 검색

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

zhouj1203@hotmail.com 1 년 전
부모
커밋
c1db7a31f7

+ 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_fnonom4jyg.js"></script>
+<script src="https://at.alicdn.com/t/c/font_2934132_37rznfydj44.js"></script>
 <script src="../src/access/iconfont.js"></script>
 
 <body>

BIN
TEAMModelBI/ClientApp/src/assets/img/ticket-img.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 106 - 22
TEAMModelBI/ClientApp/src/view/userInquire/details.vue


+ 11 - 10
TEAMModelBI/ClientApp/src/view/userInquire/hita.vue

@@ -17,9 +17,10 @@
  import bars from '@/components/echarts/commonBar.vue'
  import * as echarts from 'echarts'
  let basicsdata = ref([
-      { title: '使用次数', value: 58, key: 'frequency' },
-      { title: '使用时长', value: 584, key: 'time' },
-      { title: '协助课堂', value: 55, key: 'assist' },
+      { title: '任务数', value: 58, key: 'frequency' },
+      { title: '作品数', value: 584, key: 'time' },
+      { title: '题目数', value: 55, key: 'assist' },
+      { title: '互动次数', value: 55, key: 'interact' },
  ])
  let echartsBar = ref({
     backgroundColor: 'rgba(255,255,255,.3)',
@@ -36,25 +37,25 @@
         bottom: '12%'
     },
     xAxis: [{
-        data: ['即问即答','抢权','翻牌','统计图'],
+        data: ['合作','互动','任务','差异化','测验','无型态','未上课'],
         axisLine: {
             lineStyle: {
                 color: '#333'
             }
         },
         axisLabel: {
-            margin: 10,
+            // margin: 10,
             color: '#333',
             textStyle: {
-                fontSize: 14
+                fontSize: 10
             },
         },
     }],
     yAxis: [{
-        name: "(次)",
+         name: "课堂型态",
         nameTextStyle: {
             color: '#0177d4',
-            fontSize: 16
+            fontSize: 12
         },
         axisLine: {
             show:true,
@@ -77,7 +78,7 @@
     series: [{
         type: 'bar',
         data: [300, 450, 770, 203],
-        barWidth: '20px',
+        barWidth: '16px',
         itemStyle:{
             normal:{
                 color:new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
@@ -133,7 +134,7 @@
     line-height: 40px;
  }
  .content-item{
-    width:25%;
+    width:23%;
     border-radius: 5px;
     box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 5px
  }

+ 7 - 13
TEAMModelBI/ClientApp/src/view/userInquire/hiteach.vue

@@ -83,12 +83,6 @@
                                 </svg>
                                 <span>{{item.people}}</span>
                             </div>
-                            <div class="information-matter">
-                                <svg class="information-icon" aria-hidden="true">
-                                    <use xlink:href="#icon-T"></use>
-                                </svg>
-                                <span>{{item.t}}</span>
-                            </div>
                         </div>
                         <div class="data-time">
                             <span>{{item.starTime}}</span>
@@ -218,12 +212,12 @@ let tdatas = ref([
 let splashesdata = ref({
 })
 let classrecored = ref([
-    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, t: 65, starTime: '2023-06-25 14:23' },
-    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, t: 65, starTime: '2023-06-25 14:23' },
-    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, t: 65, starTime: '2023-06-25 14:23' },
-    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, t: 65, starTime: '2023-06-25 14:23' },
-    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, t: 65, starTime: '2023-06-25 14:23' },
-    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, t: 65, starTime: '2023-06-25 14:23' },
+    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36,  starTime: '2023-06-25 14:23' },
+    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36,  starTime: '2023-06-25 14:23' },
+    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36,  starTime: '2023-06-25 14:23' },
+    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36,  starTime: '2023-06-25 14:23' },
+    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36, starTime: '2023-06-25 14:23' },
+    { name: '教室五/三年二班', equipment: '15fsdfsd-cs4854645fdcssa-156464dsf-sadsa', time: '119', people: 36,  starTime: '2023-06-25 14:23' },
     
 ])
 function selectTime(values) {
@@ -393,7 +387,7 @@ onMounted(() => {
     width:15%;
 }
 .item-equipment{
-    width:40%;
+    width:49%;
     display: flex;
     flex-direction: column;
     line-height: 30px;

+ 1 - 1
TEAMModelBI/ClientApp/src/view/userInquire/ies.vue

@@ -92,7 +92,7 @@
     text-align: left;
  }
  .schools-item-name{
-    font-size:22px;
+    font-size:20px;
     font-weight: bold;
  }
  .schools-item-location{

+ 215 - 0
TEAMModelBI/ClientApp/src/view/userInquire/score.vue

@@ -0,0 +1,215 @@
+<template>
+    <div class="score-content">
+        <div class="score-header">
+            <div class="score-header-item" v-for="item in scoredata" :key="item.key">
+                <div class="score-header-title">{{item.title}}</div>
+                <div class="score-header-num">{{item.value}}</div>
+            </div>
+        </div>
+        <el-divider />
+        <div class="score-detail">
+            <el-tabs :tab-position="tabPosition" style="height: 255px" class="demo-tabs">
+                <el-tab-pane label="全部">
+                    <div class="total-score">
+                        <div class="score-total-item" v-for="(item,index) in scoredetail.total" :key="index">
+                            <div class="total-item-img">
+                                <svg class="scorelockicon" aria-hidden="true">
+                                    <use :xlink:href="item.type ==='add' ? '#icon-pre_icon_wodejifen':'#icon-yishiyong'"></use>
+                                </svg>
+                            </div>
+                            <div class="score-total-type">
+                                <div>类型:</div>
+                                <div :class="[item.type ==='add' ? 'score-total-type-text':'score-total-type-deltext']">{{item.typename}}</div>
+                            </div>
+                            <div class="score-total-value">
+                                <svg class="scoreicons" aria-hidden="true">
+                                    <use xlink:href="#icon-xinyujifen"></use>
+                                </svg>
+                                <span :class="[item.type ==='add' ? 'score-total-type-text':'score-total-type-deltext']">{{item.value}}</span>
+                            </div>
+                            <div class="score-total-time">
+                                <span>{{item.time}}</span>
+                            </div>
+                    </div>
+                    </div>
+                </el-tab-pane>
+                <el-tab-pane label="使用">
+                    <div class="total-score">
+                        <div class="score-total-item" v-for="(item,index) in scoredetail.usedata" :key="index">
+                            <div class="total-item-img">
+                                <svg class="scorelockicon" aria-hidden="true">
+                                    <use :xlink:href="item.type ==='add' ? '#icon-pre_icon_wodejifen':'#icon-yishiyong'"></use>
+                                </svg>
+                            </div>
+                            <div class="score-total-type">
+                                <div>类型:</div>
+                                <div :class="[item.type ==='add' ? 'score-total-type-text':'score-total-type-deltext']">{{item.typename}}</div>
+                            </div>
+                            <div class="score-total-value">
+                                <svg class="scoreicons" aria-hidden="true">
+                                    <use xlink:href="#icon-xinyujifen"></use>
+                                </svg>
+                                <span :class="[item.type ==='add' ? 'score-total-type-text':'score-total-type-deltext']">{{item.value}}</span>
+                            </div>
+                            <div class="score-total-time">
+                                <span>{{item.time}}</span>
+                            </div>
+                    </div>
+                    </div>
+                </el-tab-pane>
+                <el-tab-pane label="增加">
+                    <div class="total-score">
+                        <div class="score-total-item" v-for="(item,index) in scoredetail.adddata" :key="index">
+                            <div class="total-item-img">
+                                <svg class="scorelockicon" aria-hidden="true">
+                                    <use :xlink:href="item.type ==='add' ? '#icon-pre_icon_wodejifen':'#icon-yishiyong'"></use>
+                                </svg>
+                            </div>
+                            <div class="score-total-type">
+                                <div>类型:</div>
+                                <div :class="[item.type ==='add' ? 'score-total-type-text':'score-total-type-deltext']">{{item.typename}}</div>
+                            </div>
+                            <div class="score-total-value">
+                                <svg class="scoreicons" aria-hidden="true">
+                                    <use xlink:href="#icon-xinyujifen"></use>
+                                </svg>
+                                <span :class="[item.type ==='add' ? 'score-total-type-text':'score-total-type-deltext']">{{item.value}}</span>
+                            </div>
+                            <div class="score-total-time">
+                                <span>{{item.time}}</span>
+                            </div>
+                    </div>
+                    </div>
+                </el-tab-pane>
+            </el-tabs>
+        </div>
+    </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance, watch, h, nextTick, onMounted } from 'vue'
+let tabPosition=ref('left')
+let scoredata = ref([
+    { title: '已使用', value: 23, key: 'used' },
+    { title: '当前', value: 58, key: 'now' },
+    {title:'总计',value:81,key:'total'},
+])
+let scoredetail = ref({
+    total: [
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        { type: 'use', typename: '兑换激活码', value: '-500', time: '2023/05/23 15:23' },
+        {type:'add',typename:'系统添加',value:'+2000',time:'2023/05/23 15:23'},
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        {type:'add',typename:'活动奖励',value:'+2000',time:'2023/05/23 15:23'},
+    ],
+    usedata: [
+        { type: 'use', typename: '兑换激活码', value: '-500', time: '2023/05/23 15:23' },
+        { type: 'use', typename: '兑换激活码', value: '-500', time: '2023/05/23 15:23' },
+        { type: 'use', typename: '兑换激活码', value: '-500', time: '2023/05/23 15:23' },
+    ],
+    adddata: [
+    { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+    {type:'add',typename:'系统添加',value:'+2000',time:'2023/05/23 15:23'},
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        {type:'add',typename:'系统添加',value:'+2000',time:'2023/05/23 15:23'},
+        { type: 'add', typename: '活动奖励', value: '+2000', time: '2023/05/23 15:23' },
+        {type:'add',typename:'系统添加',value:'+2000',time:'2023/05/23 15:23'},
+    ]
+})
+</script>
+<style scoped>
+.score-content{
+    /* padding: 1%; */
+}
+.score-header{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+.score-header-item{
+    display: flex;
+    flex-direction: column;
+    width: 30%;
+    border-radius: 5px;
+    box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 5px;
+    line-height: 20px;
+}
+.score-header-title{
+    font-size: 14px;
+    color: #303133;
+}
+.score-header-num{
+    font-size: 18px;
+    font-weight: bold;
+    color: #303133;
+}
+.score-total-item{
+    display: flex;
+    line-height: 20px;
+    padding: 2px;
+    align-items: center;
+    justify-content: space-around;
+    width:98%;
+    box-shadow: rgba(0, 0, 0, 0.4) 0px 0px 5px;
+    margin: 1% 1%;
+    padding: 3px 15px;
+}
+.score-total-item:hover{
+    box-shadow: rgba(0, 0, 0, 0.7) 0px 0px 5px;
+    cursor: pointer;
+}
+.total-item-img{
+    width:10%;
+}
+.scorelockicon{
+  width: 1.4em;
+  height: 1.4em;
+  vertical-align: 0em;
+  fill: currentColor;
+  overflow: hidden;
+  margin-right: 5px;
+  margin-left: 0px;
+}
+.scoreicons{
+  width: 1em;
+  height: 1em;
+  vertical-align: 0em;
+  fill: currentColor;
+  overflow: hidden;
+  margin-right: 5px;
+  margin-left: 0px;
+}
+.score-total-type{
+    width:25%;
+    font-size:12px;
+    display: flex;
+    flex-direction: column;
+    color: #bcc0cc;
+}
+.score-total-type-text{
+    color:#0099ff;
+}
+.score-total-type-deltext{
+    color:#f89898;
+}
+.score-total-value{
+    width:30%;
+    font-size:14px;
+    color:#0099ff;
+}
+.score-total-time{
+    width:20%;
+    font-size:12px;
+    color: #bcc0cc;
+}
+.total-score{
+    display: flex;
+    height:255px;
+    flex-direction: column;
+    overflow: hidden;
+    overflow-y: auto;
+    padding-bottom: 5%;
+}
+</style>

+ 7 - 4
TEAMModelBI/ClientApp/src/view/userInquire/socrates.vue

@@ -33,7 +33,8 @@
  </script>
  <style scoped>
  .socrates-content{
-    padding: 1%;
+    padding: 2% 1%;
+    margin-top:10%;
  }
  .socrates-header,.socrates-auxiliary{
     display: flex;
@@ -41,12 +42,14 @@
     justify-content: space-between;
  }
  .socrates-item,.auxiliary-item{
-    width:20%;
+    width:23%;
     border-radius: 5px;
-    box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 5px
+    box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 5px;
+    line-height: 40px;
+    margin:4% 1%;
  }
  .socrates-item-title{
-    font-size: 16px;
+    font-size: 14px;
     color: #303133;
  }
  .socrates-item-value{

+ 210 - 0
TEAMModelBI/ClientApp/src/view/userInquire/ticket.vue

@@ -0,0 +1,210 @@
+<template>
+    <div class="ticket-content">
+        <div class="ticket-header">
+            <div class="ticket-header-item" v-for="item in ticketdata" :key="item.key">
+                <div class="ticket-header-item-title">{{item.title}}</div>
+                <div class="ticket-header-item-value">{{item.value}}</div>
+            </div>
+        </div>
+        <el-divider />
+        <div class="ticket-detail">
+            <el-tabs :tab-position="tabPosition" style="height: 255px" class="demo-tabs">
+                <el-tab-pane label="全部">
+                    <div class="ticket-total">
+                        <div :class="[item.type ==='use' ? 'usebox':'','ticket-total-item']" v-for="item in ticketlist" :key="item.code">
+                            <div class="ticket-total-item-title">
+                                <div class="ticket-subhead">票卷码</div>
+                                <div class="ticket-code">{{item.code}}</div>
+                            </div>
+                            <div class="ticket-total-item-content">
+                                <div class="ticket-total-item-scope">
+                                    {{item.scope}}
+                                </div>
+                                <div class="ticket-total-item-type">
+                                    {{item.source}}
+                                </div>
+                                <div class="ticket-total-item-time" v-show="item.type ==='gain'">
+                                    {{item.time}} 到期
+                                </div>
+                                <div class="ticket-total-item-usetime" v-show="item.type ==='use'">
+                                    {{item.time}} 使用
+                                </div>
+                                <div class="ticket-use" v-show="item.type ==='use'">
+                                    <svg class="useicon" aria-hidden="true">
+                                        <use xlink:href="#icon-yishiyong"></use>
+                                    </svg>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </el-tab-pane>
+                <el-tab-pane label="使用">
+                    <div class="ticket-total">
+                        <div :class="[item.type ==='use' ? 'usebox':'','ticket-total-item']" v-for="item in usedata" :key="item.code">
+                            <div class="ticket-total-item-title">
+                                <div class="ticket-subhead">票卷码</div>
+                                <div class="ticket-code">{{item.code}}</div>
+                            </div>
+                            <div class="ticket-total-item-content">
+                                <div class="ticket-total-item-scope">
+                                    {{item.scope}}
+                                </div>
+                                <div class="ticket-total-item-type">
+                                    {{item.source}}
+                                </div>
+                                <div class="ticket-total-item-usetime">
+                                    {{item.time}} 使用
+                                </div>
+                                <div class="ticket-use">
+                                    <svg class="useicon" aria-hidden="true">
+                                        <use xlink:href="#icon-yishiyong"></use>
+                                    </svg>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </el-tab-pane>
+                <el-tab-pane label="拥有">
+                    <div class="ticket-total">
+                        <div :class="[item.type ==='use' ? 'usebox':'','ticket-total-item']" v-for="item in gaindata" :key="item.code">
+                            <div class="ticket-total-item-title">
+                                <div class="ticket-subhead">票卷码</div>
+                                <div class="ticket-code">{{item.code}}</div>
+                            </div>
+                            <div class="ticket-total-item-content">
+                                <div class="ticket-total-item-scope">
+                                    {{item.scope}}
+                                </div>
+                                <div class="ticket-total-item-type">
+                                    {{item.source}}
+                                </div>
+                                <div class="ticket-total-item-time">
+                                    {{item.time}} 到期
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </el-tab-pane>
+            </el-tabs>
+        </div>
+    </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance, watch, h, nextTick, onMounted,computed } from 'vue'
+let tabPosition=ref('left')
+let ticketdata = ref([
+    { title: '已使用', value: 5, key: 'use' },
+    { title: '未使用', value: 33, key: 'notuse' },
+    { title: '总计', value: 38, key: 'total' },
+])
+let ticketlist = ref([
+    { code: '154dsf-454sdfds-545fg4d-552', scope: 'WebIRS 50人授權', source: '系统授予', time: '2023/11/22',type:'gain'},
+    { code: '154dsf-454sdfds-545fg4d-552', scope: 'WebIRS 50人授權', source: '系统授予', time: '2023/11/22',type:'gain' },
+    { code: '154dsf-454sdfds-545fg4d-552', scope: 'WebIRS 50人授權', source: '系统授予', time: '2023/11/22',type:'use'},
+    { code: '154dsf-454sdfds-545fg4d-552', scope: 'WebIRS 50人授權', source: '系统授予', time: '2023/11/22',type:'gain' },
+    { code: '154dsf-454sdfds-545fg4d-552', scope: 'WebIRS 50人授權', source: '系统授予', time: '2023/11/22',type:'gain' },
+    {code:'154dsf-454sdfds-545fg4d-552',scope:'WebIRS 50人授權',source:'系统授予',time:'2023/11/22',type:'gain'},
+])
+let usedata = computed(() => { 
+    return ticketlist.value.filter((item) => { return item.type ==='use'})
+})
+let gaindata = computed(() => {
+    return ticketlist.value.filter((item) => { return item.type ==='gain'})
+ })
+</script>
+<style scoped>
+.ticket-header{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    line-height: 20px;
+}
+.ticket-header-item{
+    display: flex;
+    flex-direction: column;
+    border-radius: 5px;
+    box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 5px;
+    width:30%;
+}
+.ticket-header-item-title{
+    font-size: 14px;
+    color: #303133;
+}
+.ticket-header-item-value{
+    font-size: 18px;
+    font-weight: bold;
+    color: #303133;
+}
+.ticket-total{
+    display: flex;
+    height:255px;
+    flex-direction: column;
+    overflow: hidden;
+    overflow-y: auto;
+    padding-bottom: 5%;
+}
+.ticket-total-item{
+    display: flex;
+    justify-content: space-around;
+    background: url('../../assets/img/ticket-img.png');
+    background-size: 100% 100%;
+    width:100%;
+    height:100px;
+    line-height: 20px;
+    padding: 10px 10px;
+    margin:10px 1px;
+    align-items: center;
+    transition: transform 0.3s ease;
+    position: relative;
+}
+.ticket-total-item:hover{
+    transform: scale(1.05)
+}
+.ticket-total-item-title{
+    width:50%;
+    display: flex;
+    flex-direction: column;
+}
+.ticket-subhead{
+    font-size:14px;
+    font-weight: bold;
+    margin:5px 0px;
+}
+.ticket-code{
+    font-size:16px;
+    font-weight: bold;
+}
+.ticket-total-item-scope{
+    font-size:14px;
+}
+.ticket-total-item-content{
+    width:50%;
+}
+.ticket-total-item-time,.ticket-total-item-type{
+    font-size:12px;
+    color:#bbbecd;
+}
+.ticket-total-item-usetime{
+    font-size:12px;
+    color:#79bbff;
+    font-weight: bold;
+}
+.ticket-use{
+    position: absolute;
+    top:20%;
+    left:40%;
+}
+.useicon{
+  width: 4.5em;
+  height: 4.5em;
+  vertical-align: 0em;
+  fill: currentColor;
+  overflow: hidden;
+  margin-right: 5px;
+  margin-left: 0px;
+  z-index:999999;
+}
+.usebox{
+    color:#bbbecd !important;
+}
+</style>

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

@@ -89,8 +89,8 @@
                 </div>
                 <div class="restsbox-right">
                     <dv-border-box-11 :title="$t('schoolIot.device.title')">
-                        <div class="right-box">
-                            <!-- <dv-scroll-board :config="config" style="width:100%;height:100%" /> -->
+                        <!--设备统计-->
+                        <!-- <div class="right-box">
                             <div class="right-box-left">
                                 <BaseCircle  circleId="hiteach" chatName="HiTeach" :percent="equipmentData.hiteachPercent" :subTitle="equipmentData.hiteachOnline" :totalNum="equipmentData.hiteachTotal"></BaseCircle>
                             </div>
@@ -100,7 +100,8 @@
                             <div class="right-box-left">
                                 <BaseCircle  circleId="hitachcc" chatName="HiTeach CC" :percent="equipmentData.ccPercent" :subTitle="equipmentData.ccOnline" totalNum="0"></BaseCircle>
                             </div>
-                        </div>
+                        </div> -->
+                         <!--设备统计 end-->
                     </dv-border-box-11>    
                 </div>
              </div>
@@ -403,7 +404,6 @@ export default {
            let arr = [item.schName, item.tmidCnt, item.classCnt,item.lessonLengMin]
            newArr.push(arr)
          })
-         console.log(newArr, '排行帮')
          let newArrs={
             header: [this.$t('areaIot.classrank.schoolName'),this.$t('areaIot.classrank.teachNum'),this.$t('areaIot.classrank.classNum'),this.$t('areaIot.classrank.totalTime')],
             data: [],
@@ -628,8 +628,11 @@ export default {
     flex-wrap: nowrap;
     justify-content: space-between;
 }
-.restsbox-left,.restsbox-right{
-    width:50%;
+.restsbox-left{
+    width:100%;
+}
+.restsbox-right{
+    width:0%;
 }
 .left-item{
   width: 21%;
@@ -639,10 +642,10 @@ export default {
   align-items: center;
   border-radius: 5px;
   background-color: rgba(19, 25, 47, 0.6);
-  margin: 9% 2% 1% 2%;
+  margin: 4% 2% 1% 2%;
 }
 .item-img {
-  width: 45%;
+  width: 30%;
   position:relative
 }
 .item-img img{
@@ -658,9 +661,6 @@ export default {
 .item-box {
   padding: 5px 0px;
 }
-.item-img {
-  width: 45%;
-}
 .item-box {
   width: 54%;
 }

+ 11 - 10
TEAMModelOS/ClientApp/src/view/iot/schooliot.vue

@@ -88,8 +88,8 @@
                 </div>
                 <div class="restsbox-right">
                     <dv-border-box-11 :title="$t('schoolIot.device.title')">
-                        <div class="right-box">
-                            <!-- <dv-scroll-board :config="config" style="width:100%;height:100%" /> -->
+                        <!--设备统计-->
+                        <!-- <div class="right-box">
                             <div class="right-box-left">
                                 <BaseCircle  circleId="hiteach" chatName="HiTeach" :percent="equipmentData.hiteachPercent" :subTitle="equipmentData.hiteachOnline" :totalNum="equipmentData.hiteachTotal"></BaseCircle>
                             </div>
@@ -99,7 +99,8 @@
                             <div class="right-box-left">
                                 <BaseCircle  circleId="hitachcc" chatName="HiTeach CC" :percent="equipmentData.ccPercent" :subTitle="equipmentData.ccOnline" totalNum="0"></BaseCircle>
                             </div>
-                        </div>
+                        </div> -->
+                         <!--设备统计 end-->
                     </dv-border-box-11>    
                 </div>
              </div>
@@ -573,8 +574,11 @@ export default {
     flex-wrap: nowrap;
     justify-content: space-between;
 }
-.restsbox-left,.restsbox-right{
-    width:50%;
+.restsbox-left{
+    width:100%;
+}
+.restsbox-right{
+    width:0%;
 }
 .left-item{
   width: 21%;
@@ -584,10 +588,10 @@ export default {
   align-items: center;
   border-radius: 5px;
   background-color: rgba(19, 25, 47, 0.6);
-  margin: 9% 2% 1% 2%;
+  margin: 4% 2% 1% 2%;
 }
 .item-img {
-  width: 45%;
+  width: 30%;
   position:relative
 }
 .item-img img{
@@ -603,9 +607,6 @@ export default {
 .item-box {
   padding: 5px 0px;
 }
-.item-img {
-  width: 45%;
-}
 .item-box {
   width: 54%;
 }

+ 46 - 2
TEAMModelOS/Controllers/System/WeChatPayController.cs

@@ -8,6 +8,7 @@ using System.Text.Json;
 using System.Threading.Tasks;
 using TEAMModelOS.Filter;
 using TEAMModelOS.SDK.DI;
+using TEAMModelOS.SDK.Extension;
 
 namespace TEAMModelOS.Controllers
 {/// <summary>
@@ -17,11 +18,13 @@ namespace TEAMModelOS.Controllers
     [ApiController]
     public class WeChatPayController:ControllerBase
     {
+        private readonly DingDing _dingDing;
         private readonly WeChatPayFactory _weChatPayFactory;
         private readonly SnowflakeId _snowflakeId;
-        public WeChatPayController(WeChatPayFactory weChatPayFactory, SnowflakeId snowflakeId) { 
+        public WeChatPayController(WeChatPayFactory weChatPayFactory, SnowflakeId snowflakeId,DingDing dingDing) { 
             _weChatPayFactory = weChatPayFactory;
             _snowflakeId=snowflakeId;
+            _dingDing = dingDing;
         }
         [EnableCors("AllowSpecificOrigin")]
         [HttpPost("pay-qrcode-url")]
@@ -45,7 +48,7 @@ namespace TEAMModelOS.Controllers
                 AppId = "wx0e64117a6937dc02",
                 Description =json.TryGetProperty("description", out JsonElement  _Description) ? _Description.ToString(): "订单描述",
                 ExpireTime = DateTimeOffset.Now.AddMinutes(10),
-                NotifyUrl = "https://test.teammodel.cn/test/pay-notify",
+                NotifyUrl = "https://test.teammodel.cn/wechat/pay-notify",
                 Amount = new CreatePayTransactionNativeRequest.Types.Amount()
                 {
                     Total = total
@@ -60,5 +63,46 @@ namespace TEAMModelOS.Controllers
                 return Ok(new { code = 400, errorCode = response.ErrorCode, errorMessage = response.ErrorMessage });
             }
         }
+        [ProducesDefaultResponseType]
+        [HttpPost("pay-notify")]
+        public async Task<IActionResult> PayNotify(JsonElement json)
+        {
+            try {
+                await _dingDing.SendBotMsg($"微信支付通知(原始数据):{json.ToJsonString()}", GroupNames.成都开发測試群組);
+                var client = _weChatPayFactory.GetWechatTenpayClient();
+                var callbackModel = client.DeserializeEvent(json.ToJsonString());
+                if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType))
+                {
+                    /* 根据事件类型,解密得到支付通知敏感数据 */
+                    var callbackResource = client.DecryptEventResource<SKIT.FlurlHttpClient.Wechat.TenpayV3.Events.TransactionResource>(callbackModel);
+                    var data = new
+                    {
+                        callbackResource.OutTradeNumber,
+                        callbackResource.TransactionId,
+                        callbackResource.Payer,
+                        callbackResource.Amount,
+                        callbackResource.MerchantId,
+                        callbackResource.AppId,
+                        callbackResource.TradeType,
+                        callbackResource.TradeState,
+                        callbackResource.TradeStateDescription,
+                        callbackResource.BankType,
+                        callbackResource.Attachment,
+                        callbackResource.SuccessTime,
+                        callbackResource.Scene,
+                        callbackResource.PromotionList
+                    };
+                    await _dingDing.SendBotMsg($"微信支付通知(解析数据):{data.ToJsonString()}", GroupNames.成都开发測試群組);
+                }
+                else {
+                    await _dingDing.SendBotMsg($"微信支付通知(解析数据)非支付成功结果:{callbackModel.EventType}", GroupNames.成都开发測試群組);
+                }
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"微信支付通知异常:{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+            }
+            return Ok();
+        }
     }
 }