CrazyIter_Bin 1 年之前
父節點
當前提交
e7599d734f

+ 94 - 1
TEAMModelOS.SDK/Models/Cosmos/Common/Activity.cs

@@ -484,6 +484,8 @@ namespace TEAMModelOS.SDK.Models
         /// file  sokrates
         /// </summary>
         public string type { get; set; }
+
+        public  HashSet<string> uploadType { get; set; }
         /// <summary>
         /// ["file"], 提交作品的格式
         /// </summary>
@@ -747,10 +749,12 @@ namespace TEAMModelOS.SDK.Models
         public List<ContestAttachment> files { get; set; } = new List<ContestAttachment>();
         public List<ContestAttachment> lessons { get; set; } = new List<ContestAttachment>();
         public List<ContestSokrates> sokrates { get; set; } = new List<ContestSokrates>();
+        public List<ContestUploadComplex> complexes { get; set; } = new List<ContestUploadComplex>();
         /// <summary>
         /// file  sokrates,lesson
         /// </summary>
         public string type { get; set; }
+        public HashSet<string> uploadType { get; set; }= new HashSet<string>();
         public string schoolId { get; set; }
         public string schoolName { get; set; }
         public string schoolPicture { get; set; }
@@ -761,6 +765,8 @@ namespace TEAMModelOS.SDK.Models
         public string name { get; set; }
     }
 
+
+
     public class EnrollUpload
     {
 
@@ -769,11 +775,12 @@ namespace TEAMModelOS.SDK.Models
         public List<ContestAttachment> files { get; set; } = new List<ContestAttachment>();
         public List<ContestAttachment> lessons { get; set; } = new List<ContestAttachment>();
         public List<ContestSokrates> sokrates { get; set; } = new List<ContestSokrates>();
-
+        public List<ContestUploadComplex> complexes { get; set; } = new List<ContestUploadComplex>();
         /// <summary>
         /// file  sokrates
         /// </summary>
         public string type { get; set; }
+        public HashSet<string> uploadType { get; set; } = new HashSet<string>();
         /// <summary>
         ///作品id
         /// </summary>
@@ -1072,6 +1079,92 @@ namespace TEAMModelOS.SDK.Models
         public List<string> tag { get; set; } = new List<string>();
         public string lessonId { get; set; }
     }
+    public class ContestUploadComplex
+    {
+        /// <summary>
+        ///  file  sokrates,lesson
+        /// </summary>
+        public string type { get; set; }
+
+        /// <summary>
+        /// 课例和苏格拉底作品的复合结构
+        /// </summary>
+        public LessonSokrates lessonSokrates { get; set; }
+        /// <summary>
+        /// 文件类型的作品
+        /// </summary>
+        public ContestAttachment uploadFile { get; set; }
+    }
+
+    public class LessonSokrates : LessonRecord
+    {
+        #region 扩展公共属性
+        /// <summary>
+        /// 课例,苏格拉底的附件,用于存放课件等额外的信息
+        /// </summary>
+        public List<ContestAttachment> attachments { get; set; } = new List<ContestAttachment>();
+        #endregion  扩展公共属性
+
+        #region 苏格拉底属性
+        /// <summary>
+        /// 地址
+        /// </summary>
+        public string url { get; set; }
+
+        /// <summary>
+        /// 苏格拉底报告
+        /// </summary>
+        public string report { get; set; }
+        /// <summary>
+        /// 课例ID
+        /// </summary>
+        public string recordId { get; set; }
+        /// <summary>
+        /// 封面
+        /// </summary>
+        public string poster { get; set; }
+
+        #endregion 苏格拉底属性
+
+        #region 课例属性
+        /// <summary>
+        /// 是否展示课例历程
+        /// </summary>
+        public int showProcess { get; set; }
+        #endregion 课例属性
+        /*
+         #region  苏格拉底和课例类型作品的公共属性
+        /// <summary>
+        /// 课例名称
+        /// </summary>
+        public string name { get; set; }
+        /// <summary>
+        /// 教师id 
+        /// </summary>
+        public string tmdid { get; set; }
+
+        /// <summary>
+        /// 教师醍摩豆id名称
+        /// </summary>
+        public string tmdname { get; set; }
+        /// <summary>
+        /// 教师醍摩豆id名称
+        /// </summary>
+        public string tmdpicture { get; set; }
+
+        /// <summary>
+        ///必填 开始时间(时间戳) 1606393763434
+        /// </summary>
+        public long startTime { get; set; }
+        /// <summary>
+        /// 视频播放时长
+        /// </summary>
+        public double duration { get; set; }
+
+        #endregion 苏格拉底和课例类型作品的公共属性
+         */
+    }
+
 
     public class ContestSokrates
     { 

+ 252 - 0
TEAMModelOS/ClientApp/public/bill.html

@@ -0,0 +1,252 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8" />
+    <title>Api Analysis</title>
+    <!-- 引入刚刚下载的 ECharts 文件 -->
+    <!-- 引入 layui.css -->
+    <link rel="stylesheet" href="https://unpkg.com/layui@2.6.8/dist/css/layui.css">
+    <!-- 引入 layui.js -->
+    <script src="https://unpkg.com/layui@2.6.8/dist/layui.js"></script>
+    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.3.3/echarts.min.js"></script>
+    <script src="https://maplemei.gitee.io/xm-select/xm-select.js" type="text/javascript" charset="utf-8"></script>
+    <style>
+        body {
+            background-color: #ededed;
+        }
+
+        div {
+            background-color: #fff;
+            border-radius: 10px;
+        }
+    </style>
+
+</head>
+
+<body>
+
+    <div id="condition" style=" margin-bottom: 10px; padding: 20px 20px 8px 10px; margin-top: 10px;"
+        class="layui-form-item">
+
+        <form class="layui-form" action="" lay-filter="info">
+            <div class="layui-row">
+                <div class="layui-col-xs3">
+                    <div class="grid-demo grid-demo-bg1">
+                        <button type="submit" class="layui-btn layui-btn-radius" lay-submit=""
+                            lay-filter="search">查询账单</button>
+                        <div class="layui-inline">
+
+                            <label class="layui-form-label">日期选择:</label>
+                            <div class="layui-input-block">
+
+                                <input type="text" name="date" id="date" autocomplete="off" class="layui-input">
+
+                            </div>
+
+                        </div>
+
+                    </div>
+                </div>
+                <div class="layui-col-xs3">
+                    <div class="grid-demo">
+
+                        <div class="layui-form-item">
+                            <div id="ResourceGroup"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-col-xs3">
+                    <div class="grid-demo grid-demo-bg1">
+                        <div class="layui-form-item">
+                            <div id="MeterCategory"></div>
+                        </div>
+                    </div>
+                </div>
+                <div class="layui-col-xs3">
+                    <div class="grid-demo">
+                        <div class="layui-form-item">
+                            <div id="ConsumedService"></div>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+        </form>
+    </div>
+    <!-- 为 ECharts 准备一个定义了宽高的 DOM  -->
+    <div id="regionChart" style="width: 100%;height:400px;margin-bottom: 20px;"></div>
+    <div id="minChart" style="width: 100%;height:400px;margin-bottom: 20px;"></div>
+    <script>
+        layui.use(['jquery', 'form', 'laydate'], function () {
+            var laydate = layui.laydate;
+            var form = layui.form;
+            var layer = layui.layer;
+            var date = new Date();
+            //年月范围
+            laydate.render({
+                elem: '#date', type: 'month', range: true, format: 'yyyy/MM', max: "date"
+            });
+            //如果需要使用原始保单提交方式(刷新整个页面)
+            //请注释掉下方 监听表单的 代码
+            form.on('submit(search)', function (data) {
+                //打印表单数据
+                alert(JSON.stringify(data.field))
+                // layer.alert("提交成功;如果需要使用原始保单提交方式,请注释掉本段代码", {
+                //     title: '提示'
+                // });
+                //ajax操作等
+                // some code
+
+                $.ajax({
+                    url: "https://rc.teammodel.cn/bill/report",
+                    data: data.field,
+                    type: "post",
+                    dataType: "json",
+                    headers: { 'Content-Type': 'application/json;charset=utf-8' }, //接口json格式
+                    success: function (data) {
+                        console.log(data);
+                        layer.alert(JSON.stringify(data), {
+                            title: data
+                        });
+                    },
+                    error: function (data) {
+                        layer.alert(JSON.stringify(data), {
+                            title: data
+                        });
+                    }
+                });
+                return false;
+            });
+        })
+        {
+            var options_ResourceGroup = {
+                el: '#ResourceGroup',
+                name: 'ResourceGroup',//表单的name属性
+                // layVerify: 'required',//必填项
+                //layVerType: 'tips',//提示类型 同layui
+                //tips: '你喜欢什么水果呢?傻瓜教程',
+                toolbar: {//工具条,全选,清空,反选,自定义
+                    show: true,
+                    list: [
+                        'ALL',
+                        'CLEAR',
+                        'REVERSE'
+                    ]
+                },
+                data: [],
+                //initValue: ['shuiguo','shucai'],//默认初始化,也可以数据中selected属性
+                //language: 'zn',//语言包
+                //filterable: true,//搜索功能
+                //autoRow: true,//选项过多,自动换行
+                // repeat: true,//是否支持重复选择
+                //max: 2,//最多选择2个
+                // template({ item, sels, name, value }){
+                //    //template:自定义下拉框的模板
+                //     return item.name  + '<span style="position: absolute; right: 10px; color: #8799a3">'+value+'</span>' 
+                // },
+            };
+            var ResourceGroupData = xmSelect.render(options_ResourceGroup)
+            setTimeout(function () {
+                //假设data是ajax 异步获取的
+                var data = [
+                    //selected属性可以初始化下拉框
+                    //{name: '水果', value:'shuiguo',selected:true, disabled: true},
+                    { name: '水果', value: 'shuiguo', disabled: true },
+                    { name: '蔬菜', value: 'shucai' },
+                    { name: '桌子', value: 'zhuozi' },
+                    { name: '北京', value: 'beijing' },
+                ];
+                //模拟通过ajax 获取json数据,异步更新多选下拉框的值
+                ResourceGroupData.update({ data: data })
+            }, 100);
+
+        }
+
+        {
+            var options_MeterCategory = {
+                el: '#MeterCategory',
+                name: 'MeterCategory',//表单的name属性
+                //  layVerify: 'required',//必填项
+                //  layVerType: 'tips',//提示类型 同layui
+                tips: '你喜欢什么水果呢?傻瓜教程',
+                toolbar: {//工具条,全选,清空,反选,自定义
+                    show: true,
+                    list: [
+                        'ALL',
+                        'CLEAR',
+                        'REVERSE'
+                    ]
+                },
+                data: [],
+                //initValue: ['shuiguo','shucai'],//默认初始化,也可以数据中selected属性
+                //language: 'zn',//语言包
+                //filterable: true,//搜索功能
+                //autoRow: true,//选项过多,自动换行
+                // repeat: true,//是否支持重复选择
+                //max: 2,//最多选择2个
+                // template({ item, sels, name, value }){
+                //    //template:自定义下拉框的模板
+                //     return item.name  + '<span style="position: absolute; right: 10px; color: #8799a3">'+value+'</span>' 
+                // },
+            };
+            var MeterCategoryData = xmSelect.render(options_MeterCategory)
+            setTimeout(function () {
+                //假设data是ajax 异步获取的
+                var data = [
+                    //selected属性可以初始化下拉框
+                    //{name: '水果', value:'shuiguo',selected:true, disabled: true},
+                    { name: '水果', value: 'shuiguo', disabled: true },
+                    { name: '蔬菜', value: 'shucai' },
+                    { name: '桌子', value: 'zhuozi' },
+                    { name: '北京', value: 'beijing' },
+                ];
+                //模拟通过ajax 获取json数据,异步更新多选下拉框的值
+                MeterCategoryData.update({ data: data })
+            }, 100);
+        }
+        {
+            var options_ConsumedService = {
+                el: '#ConsumedService',
+                name: 'ConsumedService',//表单的name属性
+                // layVerify: 'required',//必填项
+                //layVerType: 'tips',//提示类型 同layui
+                // tips: '你喜欢什么水果呢?傻瓜教程',
+                toolbar: {//工具条,全选,清空,反选,自定义
+                    show: true,
+                    list: [
+                        'ALL',
+                        'CLEAR',
+                        'REVERSE'
+                    ]
+                },
+                data: [],
+                //initValue: ['shuiguo','shucai'],//默认初始化,也可以数据中selected属性
+                //language: 'zn',//语言包
+                //filterable: true,//搜索功能
+                //autoRow: true,//选项过多,自动换行
+                // repeat: true,//是否支持重复选择
+                //max: 2,//最多选择2个
+                // template({ item, sels, name, value }){
+                //    //template:自定义下拉框的模板
+                //     return item.name  + '<span style="position: absolute; right: 10px; color: #8799a3">'+value+'</span>' 
+                // },
+            };
+            var ConsumedServiceData = xmSelect.render(options_ConsumedService)
+            setTimeout(function () {
+                //假设data是ajax 异步获取的
+                var data = [
+                    //selected属性可以初始化下拉框
+                    //{name: '水果', value:'shuiguo',selected:true, disabled: true},
+                    { name: '水果', value: 'shuiguo', disabled: true },
+                    { name: '蔬菜', value: 'shucai' },
+                    { name: '桌子', value: 'zhuozi' },
+                    { name: '北京', value: 'beijing' },
+                ];
+                //模拟通过ajax 获取json数据,异步更新多选下拉框的值
+                ConsumedServiceData.update({ data: data })
+            }, 100);
+        }
+    </script>
+</body>
+</html>

+ 17 - 3
TEAMModelOS/Controllers/Both/CourseBaseController.cs

@@ -1781,10 +1781,15 @@ namespace TEAMModelOS.Controllers.Both
                                 {
                                     var courseBase = courseBases.Find(z =>!string.IsNullOrWhiteSpace(item.courseId) &&  z.id.Equals(item.courseId));
                                     if (courseBase != null) {
-                                        item.schedules.ForEach(z =>
-                                        {
+                                        foreach (var z in item.schedules) 
+                                        {  
                                             //CourseCheckImport courseCheckImport = new CourseCheckImport { name=courseBase?.name, stime=date, grade=courseBase.grade, courseNo=courseBase.no };
                                             CourseCheckImport courseCheckImport = new CourseCheckImport { name=courseBase?.name, grade=courseBase.grade, courseNo=courseBase.no };
+
+                                            if (string.IsNullOrWhiteSpace(z.type)||string.IsNullOrWhiteSpace(z.groupId))
+                                            {
+                                                continue;
+                                            }
                                             if (z.type.Equals("class") &&!string.IsNullOrWhiteSpace(z.groupId))
                                             {
                                                 var clazz = classes.Find(x => x.id.Equals(z.groupId));
@@ -1794,7 +1799,12 @@ namespace TEAMModelOS.Controllers.Both
                                                     courseCheckImport.list=$"{clazz?.year}-{clazz?.no}";
                                                     courseCheckImport.listName=clazz?.name;
                                                 }
+                                                else
+                                                {
+                                                    continue;
+                                                }
                                             }
+                                            
                                             if (z.type.Equals("teach")&&!string.IsNullOrWhiteSpace(z.groupId))
                                             {
                                                 var groupList = groupLists.Find(x => x.id.Equals(z.groupId));
@@ -1804,7 +1814,9 @@ namespace TEAMModelOS.Controllers.Both
                                                     courseCheckImport.list=$"{groupList?.name}";
                                                     courseCheckImport.listName=groupList?.name;
                                                 }
+                                                else { continue; }
                                             }
+                                           
                                             if (!string.IsNullOrWhiteSpace(z.teacherId))
                                             {
                                                 var teacher = teachers.Find(x => x.id.Equals(z.teacherId));
@@ -1813,7 +1825,9 @@ namespace TEAMModelOS.Controllers.Both
                                                     courseCheckImport.tmdid=teacher?.id;
                                                     courseCheckImport.tmdName=teacher?.name;
                                                 }
+                                                else { continue; }
                                             }
+                                            else { continue; }
                                             if (z.assistants!=null  && z.assistants.Count>0)
                                             {
                                                 var teacher_assistants = teachers.FindAll(x => z.assistants.Contains(x.id));
@@ -1825,7 +1839,7 @@ namespace TEAMModelOS.Controllers.Both
 
                                             }
                                             imports.Add(courseCheckImport);
-                                        });
+                                        };
                                     }
                                     
                                 }

+ 78 - 1
TEAMModelOS/Controllers/Both/LessonRecordController.cs

@@ -2,6 +2,7 @@
 using Azure.Messaging.ServiceBus;
 using HTEXLib.COMM.Helpers;
 using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Cors;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Configuration;
@@ -1101,6 +1102,82 @@ namespace TEAMModelOS.Controllers
             return lessonRecords;
         }
 
-      
+        /// <summary>
+        /// 验证IES课例
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [HttpGet("lesson-record-verify")]
+        [Authorize(Roles = "IES")]
+        [AuthToken(Roles = "teacher")]
+        [EnableCors("AllowSpecificOrigin")]//跨域
+        public async Task<IActionResult> LessonRecordVerify([FromQuery] string id , [FromQuery]  string owner, [FromQuery] string scope, [FromQuery] string token  ) 
+        {
+            (string tmdid, _, _, string school) = HttpContext.GetAuthTokenInfo();
+            if (!string.IsNullOrWhiteSpace(id)) { return Ok(new { code=4001,msg="id不能为空" }); }
+            if (!string.IsNullOrWhiteSpace(scope)) { return Ok(new { code = 4002, msg = "scope不能为空" }); }
+            if (!string.IsNullOrWhiteSpace(owner)) { return Ok(new { code = 4003, msg = "owner不能为空" }); }
+            if (!string.IsNullOrWhiteSpace(token)) { return Ok(new { code = 4004, msg = "token不能为空" }); }
+            string tbname;
+            string code;
+
+            if (scope.Equals("school") && !string.IsNullOrWhiteSpace(owner))
+            {
+                code = $"LessonRecord-{owner}";
+                tbname = "School";
+            }
+            else if ($"{scope}".Equals("private") && owner.Equals(tmdid))
+            {
+                code = $"LessonRecord";
+                tbname = "Teacher";
+            }
+            else
+            {
+                { return Ok(new { code = 400, msg = "参数错误" }); }
+            }
+
+            Azure.Response response =  await _azureCosmos.GetCosmosClient().GetContainer(Constant.TEAMModelOS, tbname).ReadItemStreamAsync(id, new PartitionKey(code));
+            if (response.Status==200)
+            {
+                LessonRecord lessonRecord = JsonDocument.Parse(response.Content).RootElement.ToObject<LessonRecord>();
+                if (lessonRecord.scope.Equals("school"))
+                {
+                    if (lessonRecord.school.Equals(school))
+                    {
+                        if (lessonRecord.tmdid.Equals(tmdid))
+                        {
+                            return Ok(new { code = 200, lessonRecord });
+                        }
+                        else
+                        {
+                            ///不是本人的课例
+                            ///(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
+                            return Ok(new { code = 2031, lessonRecord });
+                        }
+                    }
+                    else
+                    {
+                        //不是同一个学校的课例
+                        ///(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
+                        return Ok(new { code = 2032, lessonRecord });
+                    }
+                }
+                else {
+                    if (lessonRecord.tmdid.Equals(tmdid))
+                    {
+                        return Ok(new { code = 200, lessonRecord });
+                    }
+                    else
+                    {
+                        ///不是本人的课例
+                        ///(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
+                        return Ok(new { code = 2031, lessonRecord });
+                    }
+                }
+            }
+            else {
+                return Ok(new { code = 404, msg = "课例不存在" });
+            }
+        }
     }
 }

+ 39 - 103
TEAMModelOS/Controllers/XTest/BillController.cs

@@ -2,6 +2,7 @@
 using DocumentFormat.OpenXml.Spreadsheet;
 using HTEXLib.COMM.Helpers;
 using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Cors;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
@@ -59,109 +60,10 @@ namespace TEAMModelOS.Controllers.XTest
             _dingDing = dingDing;
             _option = option.Value;
         }
-        [HttpGet("data")]
-        [RequestSizeLimit(102_400_000_00)] //最大10000m左右
-        public async Task<IActionResult> data(JsonElement j1son) {
-            try
-            {
-                string location = _option.Location;
-                var datetime = DateTimeOffset.UtcNow.AddHours(-1);
-                var y = datetime.Year;
-                var m = datetime.Month >= 10 ? $"{datetime.Month}" : $"0{datetime.Month}";
-                var d = datetime.Day >= 10 ? $"{datetime.Day}" : $"0{datetime.Day}";
-                var h = datetime.Hour >= 10 ? $"{datetime.Hour}" : $"0{datetime.Hour}";
-#if DEBUG
-                if (location.Equals("China-Dep"))
-#else
-                if (location.Equals("China"))
-#endif
-
-                {
-                    //string path = $"resourceId=/SUBSCRIPTIONS/73B7F9EF-D8B7-4444-9E8D-D80B43BF3CD4/RESOURCEGROUPS/TEAMMODELCHENGDU/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/OSFIREWARE/y={y}/m={m}/d={d}/h={h}/m=00/PT1H.json";
-                    string path = $"resourceId=/SUBSCRIPTIONS/73B7F9EF-D8B7-4444-9E8D-D80B43BF3CD4/RESOURCEGROUPS/TEAMMODELCHENGDU/PROVIDERS/MICROSOFT.WEB/SITES/TEAMMODELOS/y={y}/m={m}/d={d}/h={h}/m=00/PT1H.json";
-                    var retn = await BILogAnalyseService.GetPathAnalyse(_azureStorage, _ipSearcher, _dingDing, path, "LogStorage");
-                    if (retn.recCnts.IsNotEmpty())
-                    {
-                        //https://teammodelos.blob.core.chinacloudapi.cn/0-public/pie-borderRadius.html
-                        string publishUrl = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={HttpUtility.UrlEncode(retn.saveUrls.First(), Encoding.UTF8)}&time={HttpUtility.UrlEncode(datetime.AddHours(8).ToString("yyyy年MM月dd日 HH时"), Encoding.UTF8)}";
-                        string ulrs = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={retn.saveUrls.First()}&time={datetime.AddHours(8).ToString("yyyy年MM月dd日 HH时")}";
-                        string ulr = $"http://cdhabook.teammodel.cn:8805/screen/screenshot-png?width=1920&height=1450&url={HttpUtility.UrlEncode(ulrs, Encoding.UTF8)}&delay=5000";
-                        string image = "";
-                        try
-                        {
-                            string strs = await _httpClient.CreateClient().GetStringAsync(ulr);
-                            if (!string.IsNullOrWhiteSpace(strs))
-                            {
-                                JsonElement json = strs.ToObject<JsonElement>();
-                                json.TryGetProperty("url", out JsonElement base64);
-                                using (MemoryStream ms = new MemoryStream(Convert.FromBase64String($"{base64}")))
-                                {
-                                    image = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(ms, $"visitCnt/{y}{m}{d}", $"{y}{m}{d}{h}.png", false);
-                                }
-
-                            }
-                        }
-                        catch (Exception ex)
-                        {
-
-                        }
-                        await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录(小时)\n> 记录时间:{datetime.AddHours(8).ToString("yyyy-MM-dd HH")}\n> ![screenshot]({image})\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}" +
-                            $" [发布地址]({publishUrl}) \n", GroupNames.醍摩豆服務運維群組);
-                    }
-
-                    //处理昨天的防火墙日志
-                    if (h.Equals("00"))
-                    {
-                        var pastTime = datetime.AddHours(-1);
-                        var ptY = pastTime.Year;
-                        var ptM = pastTime.Month >= 10 ? $"{pastTime.Month}" : $"0{pastTime.Month}";
-                        var ptD = pastTime.Day >= 10 ? $"{pastTime.Day}" : $"0{pastTime.Day}";
-
-                        string dayPath = $"resourceId=/SUBSCRIPTIONS/73B7F9EF-D8B7-4444-9E8D-D80B43BF3CD4/RESOURCEGROUPS/TEAMMODELCHENGDU/PROVIDERS/MICROSOFT.WEB/SITES/TEAMMODELOS/y={ptY}/m={ptM}/d={ptD}";
-                        var retnDay = await BILogAnalyseService.GetPathAnalyse(_azureStorage, _ipSearcher, _dingDing, dayPath, "LogStorage", timeType: "Day");
-
-                        if (retn.recCnts.IsNotEmpty())
-                        {
-                            //一天的统计
-                            string dayPublishUrl = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={HttpUtility.UrlEncode(retnDay.saveUrls.First(), Encoding.UTF8)}&time={HttpUtility.UrlEncode(pastTime.ToString("yyyy年MM月dd日"), Encoding.UTF8)}";
-                            string dayUrls = $"https://teammodelos.blob.core.chinacloudapi.cn/0-public/api-count.html?url={retnDay.saveUrls.First()}&time={pastTime.ToString("yyyy年MM月dd日")}";
-                            string dayUrl = $"http://cdhabook.teammodel.cn:8805/screen/screenshot-png?width=1920&height=1450&url={HttpUtility.UrlEncode(dayUrls, Encoding.UTF8)}&delay=6000";
-                            string dayImage = "";
-
-                            try
-                            {
-                                string dayStr = await _httpClient.CreateClient().GetStringAsync(dayUrl);
-                                if (!string.IsNullOrWhiteSpace(dayStr))
-                                {
-                                    JsonElement dayJson = dayStr.ToObject<JsonElement>();
-                                    dayJson.TryGetProperty("url", out JsonElement dayBase64);
-                                    using (MemoryStream dayMs = new(Convert.FromBase64String($"{dayBase64}")))
-                                    {
-                                        dayImage = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(dayMs, $"visitCnt/{ptY}{ptM}{ptD}", "days.png", false);
-                                    }
-                                }
-                            }
-                            catch (Exception ex) { }
-                            await _dingDing.SendBotMarkdown("防火墙日志记录", $"#### 防火墙日志记录(天)\n> 记录时间:{pastTime.AddHours(8).ToString("yyyy-MM-dd")}\n> ![screenshot]({dayImage})\n> ###### 发布时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}" +
-                            $" [发布地址]({dayPublishUrl}) \n", GroupNames.醍摩豆服務運維群組);
-                        }
-                    }
-                }
-                else if (location.Contains("Global"))
-                {
-
-                }
-            }
-            catch (Exception ex)
-            {
-                // await _dingDing.SendBotMsg($"FireWallFileLog 防火墙日志记录: {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}\n{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
-            }
-
-            return Ok();
-        }
-
-
+        
         [HttpPost("report")]
+        [EnableCors("AllowSpecificOrigin")]
+        [AllowAnonymous]
         [RequestSizeLimit(102_400_000_00)] //最大10000m左右
         public async Task<IActionResult> Report(JsonElement json)
         {
@@ -169,6 +71,9 @@ namespace TEAMModelOS.Controllers.XTest
 
                 List<KeyBillDetail> monthData = new List<KeyBillDetail>();
                 List<DayBillDetail> dayData = new List<DayBillDetail>();
+                List<DayBillDetail> resourceGroupDataGroup = new List<DayBillDetail>();
+                List<DayBillDetail> meterCategoryDataGroup = new List<DayBillDetail>();
+                List<DayBillDetail> consumedServiceDataGroup = new List<DayBillDetail>();
                 string BillToken = _configuration.GetValue<string>("Azure:Bill:Token");
                 List<string> times = json.GetProperty("times").ToObject<List<string>>();
 
@@ -513,6 +418,35 @@ namespace TEAMModelOS.Controllers.XTest
                     
                     });
 
+                    var ResourceGroupData = billDetails.GroupBy(x => x.ResourceGroup);
+                    DayBillDetail ResourceGroupDataBillDetail = new DayBillDetail() { month= time };
+                    foreach (var group in ResourceGroupData)
+                    {
+                        ResourceGroupDataBillDetail.bills.Add(new KeyBillDetail() { key= group.Key, cost= group.Select(x => x.ExtendedCost).Sum() });
+                    }
+                    ResourceGroupDataBillDetail.bills= ResourceGroupDataBillDetail.bills.OrderByDescending(x => x.cost).ToList();
+                    resourceGroupDataGroup.Add(ResourceGroupDataBillDetail);
+
+
+                    var MeterCategoryData = billDetails.GroupBy(x => x.MeterCategory);
+                    DayBillDetail MeterCategoryDataBillDetail = new DayBillDetail() { month= time };
+                    foreach (var group in MeterCategoryData) {
+
+                        MeterCategoryDataBillDetail.bills.Add(new KeyBillDetail() { key= group.Key, cost= group.Select(x => x.ExtendedCost).Sum() });
+                    }
+                    MeterCategoryDataBillDetail.bills= MeterCategoryDataBillDetail.bills.OrderByDescending(x => x.cost).ToList();
+                    meterCategoryDataGroup.Add(MeterCategoryDataBillDetail);
+
+
+                    DayBillDetail ConsumedServiceDataBillDetail = new DayBillDetail() { month= time };
+                    var ConsumedServiceData = billDetails.GroupBy(x => x.ConsumedService);
+                    foreach (var group in ConsumedServiceData) {
+                        ConsumedServiceDataBillDetail.bills.Add(new KeyBillDetail() { key= group.Key, cost= group.Select(x => x.ExtendedCost).Sum() });
+                    }
+                    ConsumedServiceDataBillDetail.bills= ConsumedServiceDataBillDetail.bills.OrderByDescending(x => x.cost).ToList();
+                    consumedServiceDataGroup.Add(ConsumedServiceDataBillDetail);
+
+
                     DayBillDetail dayBillDetail = new DayBillDetail() { month= time};
                     for (int i = 1; i<=31; i++)
                     {
@@ -536,7 +470,9 @@ namespace TEAMModelOS.Controllers.XTest
                 {
                     await _azureStorage.GetBlobContainerClient("teammodelos").UploadFileByContainer(dict.ToJsonString(), "bill", $"dict.json", true);
                 }
-                return Ok(new {   monthData, dayData, dict, dictCond, code=200});
+                return Ok(new {   monthData, dayData, dict, dictCond, code=200, consumedServiceDataGroup ,meterCategoryDataGroup,resourceGroupDataGroup});
+
+
             } catch (Exception ex) {
                 return Ok(new { code = 500 ,msg= $"{ex.Message}{ex.StackTrace}"});
             }

文件差異過大導致無法顯示
+ 3 - 0
TEAMModelOS/appsettings.Development.json