ningshuxia
2022-12-09 950a104d4690606f3b9744cc4b917b45fef34fb3
用户日志报表接口
已修改1个文件
已添加4个文件
305 ■■■■■ 文件已修改
Application/IStation.Application.OpenApi/test/report/Report_ShysController.cs 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogItem.cs 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogReportDto.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Application/IStation.Application.OpenApi/test/report/helper/XmlHelper.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Entry/IStation.WebApi.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Application/IStation.Application.OpenApi/test/report/Report_ShysController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
using Microsoft.AspNetCore.Mvc;
using System.Net;
using System.Net.Http.Headers;
using Microsoft.Extensions.Hosting.Internal;
using Microsoft.AspNetCore.Http.Extensions;
using IStation.Untity;
using Furion.DynamicApiController;
using System.ComponentModel.DataAnnotations;
using Mapster;
using Microsoft.AspNetCore.Authorization;
namespace IStation.Application
{
    /// <summary>
    /// æµ‹è¯•报表
    /// </summary>
    [Route("OpenApi/Test/Report")]
    [ApiDescriptionSettings("OpenApi", Name = "测试报表", Order = 1001)]
    public class Report_ShysController : IDynamicApiController
    {
        public readonly static Dictionary<string, string> ProvinceCodeDic = new Dictionary<string, string> { { "四川省", "510000" }, { "北京市", "110000" }, { "天津市", "120000" }, { "河北省", "130000" }, { "山西省", "140000" }, { "内蒙古自治区", "150000" }, { "辽宁省", "210000" }, { "吉林省", "220000" }, { "黑龙江省", "230000" }, { "上海市", "310000" }, { "江苏省", "320000" }, { "浙江省", "330000" }, { "安徽省", "340000" }, { "福建省", "350000" }, { "江西省", "360000" }, { "山东省", "370000" }, { "河南省", "410000" }, { "湖北省", "420000" }, { "湖南省", "430000" }, { "广东省", "440000" }, { "广西自治区", "450000" }, { "海南省", "460000" }, { "重庆市", "500000" }, { "贵州省", "520000" }, { "云南省", "530000" }, { "西藏自治区", "540000" }, { "陕西省", "610000" }, { "甘肃省", "620000" }, { "青海省", "630000" }, { "宁夏自治区", "640000" }, { "新疆自治区", "650000" }, { "台湾省", "710000" }, { "香港特别行政区", "810000" }, { "澳门特别行政区", "820000" } };
        /// <summary>
        /// ç”¨æˆ·æ—¥å¿—分析报表
        /// </summary>
        [AllowAnonymous]
        [NonUnify]
        [Route("UserLoginLogReport")]
        [HttpPost]
        public UserLoginLogReportDto UserLoginLogReport(DateTime StartDate)
        {
            var corps = new Service.Corpration().GetAll();
            if (corps == null || corps.Count < 1)
                return default;
            var users = new Service.User().GetAll();
            if (users == null || users.Count < 1)
                return default;
            var logs = new Service.UserLoginLog().GetListByStartDate(StartDate);
            if (logs == null || logs.Count < 1)
                return default;
            var dto = new UserLoginLogReportDto();
            dto.LoginLogList = new List<UserLoginLogItem>();
            dto.TotalUsers = users.Count;
            var uniqueVisitorList = logs.DistinctBy(x => x.UserID).ToList();
            var last7Days = DateTime.Now.AddDays(-7);
            var last30Days = DateTime.Now.AddDays(-30);
            dto.TodayUV = uniqueVisitorList.Where(x => x.LoginTime >= DateTime.Today).Count();
            dto.Last7DaysUV = uniqueVisitorList.Where(x => x.LoginTime >= last7Days).Count();
            dto.Last30DaysUV = uniqueVisitorList.Where(x => x.LoginTime >= last30Days).Count();
            var logGroups = logs.GroupBy(x => x.CorpID);
            foreach (var logGroup in logGroups)
            {
                var corp = corps.Find(x => x.ID == logGroup.Key);
                foreach (var log in logGroup)
                {
                    var area = RandomValues(ProvinceCodeDic, 1).First().Key;
                    var item = new UserLoginLogItem(log, corp.ShortName, area);
                    dto.LoginLogList.Add(item);
                }
            }
            var ReportPath = Path.Combine(Settings.DataFile.SaveFileUrl, @"UserloginLogReport");
            if (!Directory.Exists(ReportPath))
                Directory.CreateDirectory(ReportPath);
            var yyMM = DateTime.Today.ToString("yyyy-MM");
            var filePath = Path.Combine(ReportPath, yyMM + ".xml");
            filePath = filePath.Replace(@"\\", @"/");
            XmlHelper<UserLoginLogReportDto>.SaveObjectXmlFile(filePath, dto);
            return dto;
        }
        /// <summary>
        /// èŽ·å–Dictionary中不重复的随机Dictionary
        /// </summary>
        /// <typeparam name="TKey"></typeparam>
        /// <typeparam name="TValue"></typeparam>
        /// <param name="dict">原dictionary</param>
        /// <param name="count">返回随机个数(如果dict总个数少于count åˆ™è¿”回dict总个数)</param>
        /// <returns></returns>
        public static Dictionary<TKey, TValue> RandomValues<TKey, TValue>(Dictionary<TKey, TValue> dict, int count)
        {
            Random rand = new Random();
            Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue>();
            int size = dict.Count;
            count = count > size ? size : count;
            List<TKey> values = Enumerable.ToList(dict.Keys);
            while (dic.Count < count)
            {
                TKey tk = values[rand.Next(size)];
                if (!dic.Keys.Contains(tk))
                {
                    dic[tk] = dict[tk];
                }
            }
            return dic;
        }
    }
}
Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogItem.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Application
{
    /// <summary>
    /// ç”¨æˆ·æ—¥å¿—报表项
    /// </summary>
    public class UserLoginLogItem
    {
        /// <summary>
        ///
        /// </summary>
        public UserLoginLogItem()
        {
        }
        /// <summary>
        ///
        /// </summary>
        public UserLoginLogItem(Model.UserLoginLog rhs)
        {
            this.SoftType = rhs.SoftType;
            this.SoftTag = rhs.SoftTag;
            this.UserID = rhs.UserID;
            this.InputLoginName = rhs.InputLoginName;
            this.LoginTime = rhs.LoginTime;
            this.LoginIP = rhs.LoginIP;
            this.Message = rhs.Message;
        }
        /// <summary>
        ///
        /// </summary>
        public UserLoginLogItem(Model.UserLoginLog rhs, string corpName, string area) : this(rhs)
        {
            this.CorpName = corpName;
            this.Area = area;
        }
        /// <summary>
        /// ç”¨æˆ·æ ‡è¯†
        /// </summary>
        public long UserID { get; set; }
        /// <summary>
        /// è¾“入登录名称
        /// </summary>
        public string InputLoginName { get; set; }
        /// <summary>
        /// ç™»å½•æ—¶é—´
        /// </summary>
        public DateTime LoginTime { get; set; }
        /// <summary>
        /// ç™»å½•IP
        /// </summary>
        public string LoginIP { get; set; }
        /// <summary>
        /// å…¬å¸åç§°
        /// </summary>
        public string CorpName { get; set; }
        /// <summary>
        /// åœ°åŒº
        /// </summary>
        public string Area { get; set; }
        /// <summary>
        /// è½¯ä»¶ç±»åž‹
        /// </summary>
        public string SoftType { get; set; }
        /// <summary>
        /// è½¯ä»¶æ ‡ç­¾
        /// </summary>
        public string SoftTag { get; set; }
        /// <summary>
        /// ä¿¡æ¯
        /// </summary>
        public string Message { get; set; }
    }
}
Application/IStation.Application.OpenApi/test/report/dto/UserLoginLogReportDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Application
{
    /// <summary>
    /// ç”¨æˆ·æ—¥å¿—报表Dto
    /// </summary>
    public class UserLoginLogReportDto
    {
        /// <summary>
        /// æ€»ç”¨æˆ·äººæ•°
        /// </summary>
        public int TotalUsers { get; set; }
        /// <summary>
        /// ä»Šæ—¥è®¿å®¢æ•°é‡
        /// </summary>
        public int TodayUV { get; set; }
        /// <summary>
        /// æœ€è¿‘7天访客数量
        /// </summary>
        public int Last7DaysUV { get; set; }
        /// <summary>
        /// æœ€è¿‘30天访客数量
        /// </summary>
        public int Last30DaysUV { get; set; }
        /// <summary>
        /// ç™»é™†æ—¥å¿—项
        /// </summary>
        public List<UserLoginLogItem> LoginLogList { get; set; }
    }
}
Application/IStation.Application.OpenApi/test/report/helper/XmlHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace IStation.Application
{
    /// <summary>
    ///
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class XmlHelper<T> where T : class
    {
        /// <summary>
        /// å¯¹è±¡ç”ŸæˆXml文档
        /// </summary>
        public string ObjectToXml(T obj)
        {
            using (StringWriter writer = new StringWriter())
            {
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(writer, obj);
                return writer.ToString();
            }
        }
        /// <summary>
        /// xml文档生成类
        /// </summary>
        public T XmlToObject(string xmlStr)
        {
            try
            {
                using (StringReader reader = new StringReader(xmlStr))
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return serializer.Deserialize(reader) as T;
                }
            }
            catch (Exception ex)
            {
                var a = ex.Message;
                return null;
            }
        }
        /// <summary>
        /// ä¿å­˜å¯¹è±¡åˆ°xml文件中
        /// </summary>
        public static void SaveObjectXmlFile<T>(string fileName, T t) where T : class
        {
            var str = new XmlHelper<T>().ObjectToXml(t);
            File.WriteAllText(fileName, str, Encoding.UTF8);
        }
    }
}
Entry/IStation.WebApi.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -5,7 +5,7 @@
<Project>
  <PropertyGroup>
    <_PublishTargetUrl>D:\WorkData\IStation\IStationV4.1\Core\Service.V4.1\Entry\IStation.WebApi.Entry\bin\Release\net6.0\publish\</_PublishTargetUrl>
    <History>True|2022-12-08T07:02:22.5370248Z;True|2022-12-08T13:33:49.0557037+08:00;True|2022-12-08T13:26:29.9328742+08:00;False|2022-12-08T13:24:31.2512796+08:00;False|2022-12-08T13:21:44.3184417+08:00;True|2022-12-05T14:30:36.3961706+08:00;True|2022-12-05T14:27:43.9156234+08:00;True|2022-11-29T17:14:16.9758449+08:00;True|2022-11-29T11:38:23.5655208+08:00;True|2022-11-29T11:07:46.1871980+08:00;True|2022-11-29T11:03:45.1830032+08:00;True|2022-11-23T11:33:19.0882717+08:00;False|2022-11-23T11:30:48.0902065+08:00;False|2022-11-23T11:29:51.3610102+08:00;True|2022-11-14T21:11:17.8644235+08:00;True|2022-11-14T20:14:03.5550088+08:00;True|2022-11-14T19:17:19.2326062+08:00;True|2022-11-14T19:16:47.8958868+08:00;True|2022-11-14T19:05:18.2549422+08:00;True|2022-11-14T18:26:42.3745462+08:00;True|2022-11-14T17:38:44.6271564+08:00;True|2022-11-14T17:34:15.2334450+08:00;False|2022-11-14T17:14:35.5279015+08:00;True|2022-11-14T16:24:47.6469529+08:00;True|2022-11-14T15:37:59.2295089+08:00;True|2022-11-14T09:52:42.7169668+08:00;True|2022-11-11T13:19:08.1283593+08:00;True|2022-11-09T22:12:02.6483295+08:00;True|2022-11-09T21:11:04.3739799+08:00;True|2022-11-09T21:06:00.4538306+08:00;True|2022-11-09T20:55:34.2803958+08:00;True|2022-11-09T20:17:02.9468337+08:00;True|2022-11-09T18:07:35.3930811+08:00;True|2022-11-09T18:05:51.4828275+08:00;True|2022-11-09T16:17:12.1733545+08:00;True|2022-11-09T11:43:22.1152393+08:00;True|2022-11-04T11:18:49.1736708+08:00;False|2022-11-04T11:16:30.1928291+08:00;False|2022-11-04T11:15:20.2275455+08:00;False|2022-11-04T11:14:39.1289337+08:00;True|2022-11-04T11:04:37.8317148+08:00;True|2022-11-03T14:34:55.1009241+08:00;True|2022-11-03T14:16:29.1563357+08:00;True|2022-11-03T13:46:10.8366547+08:00;True|2022-11-03T11:48:24.5399936+08:00;True|2022-10-31T14:36:59.4971398+08:00;True|2022-10-28T13:58:42.2473049+08:00;True|2022-10-28T13:42:58.7180735+08:00;True|2022-10-28T12:56:06.9517417+08:00;True|2022-10-28T09:37:04.8336241+08:00;True|2022-10-27T16:13:52.0290129+08:00;True|2022-10-27T14:51:12.0416021+08:00;True|2022-10-27T14:46:01.8195700+08:00;True|2022-10-27T14:38:00.5077582+08:00;True|2022-10-27T14:28:16.2348825+08:00;False|2022-10-27T14:27:49.2720060+08:00;False|2022-10-27T14:27:25.1445739+08:00;True|2022-10-26T11:27:54.4483138+08:00;True|2022-10-26T11:19:37.6322046+08:00;True|2022-10-26T11:10:05.4129456+08:00;True|2022-10-25T16:33:32.7872520+08:00;True|2022-10-24T16:12:49.4291001+08:00;True|2022-10-24T16:10:25.3757944+08:00;True|2022-10-24T14:04:51.7783988+08:00;True|2022-10-21T18:51:32.0221235+08:00;True|2022-10-21T18:35:12.1463858+08:00;True|2022-10-21T09:54:19.2138550+08:00;True|2022-10-21T09:38:21.1672347+08:00;True|2022-10-19T12:04:59.9103579+08:00;True|2022-10-19T11:57:45.1000513+08:00;True|2022-10-19T11:49:03.6494799+08:00;True|2022-10-19T11:06:22.4198711+08:00;True|2022-10-18T11:17:20.1435537+08:00;True|2022-10-18T09:08:58.6802639+08:00;True|2022-10-17T16:33:12.8912333+08:00;True|2022-10-17T14:23:10.0264671+08:00;True|2022-10-17T14:16:07.3590282+08:00;True|2022-10-17T11:53:21.9425089+08:00;True|2022-10-17T11:45:51.9336429+08:00;True|2022-10-14T14:37:15.6323508+08:00;True|2022-10-11T09:01:44.5831439+08:00;True|2022-10-09T14:03:43.6568874+08:00;True|2022-10-09T11:15:56.2934983+08:00;True|2022-10-09T09:39:28.1074512+08:00;True|2022-10-08T18:45:23.9581502+08:00;True|2022-10-08T18:35:18.5574217+08:00;True|2022-10-08T16:12:04.2903137+08:00;True|2022-10-08T15:59:54.5588351+08:00;True|2022-10-08T15:55:01.2711550+08:00;True|2022-10-08T15:19:08.5487617+08:00;True|2022-10-08T15:11:55.8626990+08:00;False|2022-10-08T15:02:33.5639703+08:00;True|2022-10-08T09:23:21.6592006+08:00;True|2022-10-07T15:35:37.7532304+08:00;True|2022-10-07T15:04:51.9161653+08:00;False|2022-10-07T14:58:32.8816319+08:00;False|2022-10-07T14:54:55.4175944+08:00;False|2022-10-07T14:52:46.7215376+08:00;False|2022-10-07T14:51:14.0508027+08:00;False|2022-10-07T14:49:57.6007572+08:00;</History>
    <History>True|2022-12-09T02:43:23.4654553Z;True|2022-12-08T15:02:22.5370248+08:00;True|2022-12-08T13:33:49.0557037+08:00;True|2022-12-08T13:26:29.9328742+08:00;False|2022-12-08T13:24:31.2512796+08:00;False|2022-12-08T13:21:44.3184417+08:00;True|2022-12-05T14:30:36.3961706+08:00;True|2022-12-05T14:27:43.9156234+08:00;True|2022-11-29T17:14:16.9758449+08:00;True|2022-11-29T11:38:23.5655208+08:00;True|2022-11-29T11:07:46.1871980+08:00;True|2022-11-29T11:03:45.1830032+08:00;True|2022-11-23T11:33:19.0882717+08:00;False|2022-11-23T11:30:48.0902065+08:00;False|2022-11-23T11:29:51.3610102+08:00;True|2022-11-14T21:11:17.8644235+08:00;True|2022-11-14T20:14:03.5550088+08:00;True|2022-11-14T19:17:19.2326062+08:00;True|2022-11-14T19:16:47.8958868+08:00;True|2022-11-14T19:05:18.2549422+08:00;True|2022-11-14T18:26:42.3745462+08:00;True|2022-11-14T17:38:44.6271564+08:00;True|2022-11-14T17:34:15.2334450+08:00;False|2022-11-14T17:14:35.5279015+08:00;True|2022-11-14T16:24:47.6469529+08:00;True|2022-11-14T15:37:59.2295089+08:00;True|2022-11-14T09:52:42.7169668+08:00;True|2022-11-11T13:19:08.1283593+08:00;True|2022-11-09T22:12:02.6483295+08:00;True|2022-11-09T21:11:04.3739799+08:00;True|2022-11-09T21:06:00.4538306+08:00;True|2022-11-09T20:55:34.2803958+08:00;True|2022-11-09T20:17:02.9468337+08:00;True|2022-11-09T18:07:35.3930811+08:00;True|2022-11-09T18:05:51.4828275+08:00;True|2022-11-09T16:17:12.1733545+08:00;True|2022-11-09T11:43:22.1152393+08:00;True|2022-11-04T11:18:49.1736708+08:00;False|2022-11-04T11:16:30.1928291+08:00;False|2022-11-04T11:15:20.2275455+08:00;False|2022-11-04T11:14:39.1289337+08:00;True|2022-11-04T11:04:37.8317148+08:00;True|2022-11-03T14:34:55.1009241+08:00;True|2022-11-03T14:16:29.1563357+08:00;True|2022-11-03T13:46:10.8366547+08:00;True|2022-11-03T11:48:24.5399936+08:00;True|2022-10-31T14:36:59.4971398+08:00;True|2022-10-28T13:58:42.2473049+08:00;True|2022-10-28T13:42:58.7180735+08:00;True|2022-10-28T12:56:06.9517417+08:00;True|2022-10-28T09:37:04.8336241+08:00;True|2022-10-27T16:13:52.0290129+08:00;True|2022-10-27T14:51:12.0416021+08:00;True|2022-10-27T14:46:01.8195700+08:00;True|2022-10-27T14:38:00.5077582+08:00;True|2022-10-27T14:28:16.2348825+08:00;False|2022-10-27T14:27:49.2720060+08:00;False|2022-10-27T14:27:25.1445739+08:00;True|2022-10-26T11:27:54.4483138+08:00;True|2022-10-26T11:19:37.6322046+08:00;True|2022-10-26T11:10:05.4129456+08:00;True|2022-10-25T16:33:32.7872520+08:00;True|2022-10-24T16:12:49.4291001+08:00;True|2022-10-24T16:10:25.3757944+08:00;True|2022-10-24T14:04:51.7783988+08:00;True|2022-10-21T18:51:32.0221235+08:00;True|2022-10-21T18:35:12.1463858+08:00;True|2022-10-21T09:54:19.2138550+08:00;True|2022-10-21T09:38:21.1672347+08:00;True|2022-10-19T12:04:59.9103579+08:00;True|2022-10-19T11:57:45.1000513+08:00;True|2022-10-19T11:49:03.6494799+08:00;True|2022-10-19T11:06:22.4198711+08:00;True|2022-10-18T11:17:20.1435537+08:00;True|2022-10-18T09:08:58.6802639+08:00;True|2022-10-17T16:33:12.8912333+08:00;True|2022-10-17T14:23:10.0264671+08:00;True|2022-10-17T14:16:07.3590282+08:00;True|2022-10-17T11:53:21.9425089+08:00;True|2022-10-17T11:45:51.9336429+08:00;True|2022-10-14T14:37:15.6323508+08:00;True|2022-10-11T09:01:44.5831439+08:00;True|2022-10-09T14:03:43.6568874+08:00;True|2022-10-09T11:15:56.2934983+08:00;True|2022-10-09T09:39:28.1074512+08:00;True|2022-10-08T18:45:23.9581502+08:00;True|2022-10-08T18:35:18.5574217+08:00;True|2022-10-08T16:12:04.2903137+08:00;True|2022-10-08T15:59:54.5588351+08:00;True|2022-10-08T15:55:01.2711550+08:00;True|2022-10-08T15:19:08.5487617+08:00;True|2022-10-08T15:11:55.8626990+08:00;False|2022-10-08T15:02:33.5639703+08:00;True|2022-10-08T09:23:21.6592006+08:00;True|2022-10-07T15:35:37.7532304+08:00;True|2022-10-07T15:04:51.9161653+08:00;False|2022-10-07T14:58:32.8816319+08:00;False|2022-10-07T14:54:55.4175944+08:00;False|2022-10-07T14:52:46.7215376+08:00;False|2022-10-07T14:51:14.0508027+08:00;</History>
    <LastFailureDetails />
  </PropertyGroup>
</Project>