Ejemplo n.º 1
0
        //  可选优化,IEnumerable查询会加载所有结果,IQueryable只会加载分页结果
        //  controller已确保EnterpriseID的正确使用
        private static IEnumerable <OperationLog> SearchOperationLogsByMongo(SearchLogConditionDto condition)
        {
            try
            {
                IEnumerable <OperationLog> reList;
                List <string> uIDList = new List <string>();
                var           mgdb    = new MongoDbProvider <OperationLog>();

                //  不存在UserID时候查询过程
                if (string.IsNullOrEmpty(condition.UserID))
                {
                    using (var db = new BCEnterpriseContext())
                    {
                        uIDList = db.FrontUsers.Where(obj => (string.IsNullOrEmpty(condition.EnterpriseID) ? true : obj.EnterpiseID == condition.EnterpriseID) && (string.IsNullOrEmpty(condition.UserName) ? true : obj.Name.Contains(condition.UserName))).Select(o => o.UserID).ToList();
                    }
                    if (0 == uIDList.Count)
                    {
                        if (string.IsNullOrEmpty(condition.OperationID))
                        {
                            // 第一次显示操作日志判断
                            reList = mgdb.GetAll(obj => (string.IsNullOrEmpty(condition.EnterpriseID) || obj.EnterpriseID == condition.EnterpriseID) && (obj.OperateTime > (condition.StartTime ?? DateTime.MinValue)) &&
                                                 (obj.OperateTime < (condition.EndTime ?? DateTime.Now)));
                        }
                        else
                        {
                            //  UserID和UserName为空,仅根据企业ID和操作ID查询
                            reList = mgdb.GetAll(obj => (string.IsNullOrEmpty(condition.EnterpriseID) || obj.EnterpriseID == condition.EnterpriseID) &&
                                                 (obj.OperationID.ToLower().Contains(condition.OperationID.ToLower())) &&
                                                 (obj.OperateTime > (condition.StartTime ?? DateTime.MinValue)) &&
                                                 (obj.OperateTime < (condition.EndTime ?? DateTime.Now)));
                        }
                    }
                    else
                    {
                        //  输入UserName查询得到uIDList模糊查询
                        var tempCondition = string.IsNullOrEmpty(condition.OperationID) ? "" : condition.OperationID.ToLower();
                        reList = mgdb.GetAll(obj => (uIDList.Contains(obj.UserID)) &&
                                             (string.IsNullOrEmpty(condition.EnterpriseID) || obj.EnterpriseID == condition.EnterpriseID) &&
                                             (string.IsNullOrEmpty(condition.OperationID) || obj.OperationID.ToLower().Contains(tempCondition)) &&
                                             (obj.OperateTime > (condition.StartTime ?? DateTime.MinValue)) &&
                                             (obj.OperateTime < (condition.EndTime ?? DateTime.Now)));
                    }
                }

                //  指定UserID查询过程
                else
                {
                    //  指定了UserID查询
                    reList = mgdb.GetAll(obj => (obj.UserID == condition.UserID) &&
                                         (string.IsNullOrEmpty(condition.EnterpriseID) || obj.EnterpriseID == condition.EnterpriseID) &&
                                         (obj.OperateTime > (condition.StartTime ?? DateTime.MinValue)) &&
                                         (obj.OperateTime < (condition.EndTime ?? DateTime.Now)));
                }
                return(reList);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 2
0
        public List <OperationLogDto> SearchLogsByCondition(SearchLogConditionDto condition, int pageSize, int pageIndex, out int count)
        {
            try
            {
                if (null == condition)
                {
                    throw new KnownException("没有给定任何搜索条件查询!");
                }

                //  从MongoDB查询得到OperationLog
                var reList = SearchOperationLogsByMongo(condition);

                //  分页显示
                count = reList.Count();
                int pageTotal;

                if (pageSize > 0)
                {
                    pageTotal = (count + pageSize - 1) / pageSize;
                }
                else
                {
                    pageSize  = 10;
                    pageTotal = (count + pageSize - 1) / pageSize;
                }

                if (pageIndex > pageTotal)
                {
                    pageIndex = pageTotal;
                }
                if (pageIndex < 1)
                {
                    pageIndex = 1;
                }
                #region 由OperationLog相关ID通过EF查出对应Name
                using (var db = new BCEnterpriseContext())
                {
                    //  将从MongoDB查询按照分页ToList需要的结果,根据其结果的ID再通过EF查询对应的Name
                    var l = reList
                            .OrderByDescending(obj => obj.OperateTime)
                            .Skip(pageSize * (pageIndex - 1))
                            .Take(pageSize).ToList();

                    var userIds      = l.Select(n => n.UserID);
                    var operationIds = l.Select(n => n.OperationID);

                    var users = (from u in db.FrontUsers
                                 where userIds.Any(n => n == u.UserID)
                                 select new { u.UserID, u.Name }).Distinct().ToList();

                    var operations = (from fun in db.RFAFunctions
                                      where operationIds.Any(n => n.StartsWith(fun.FunctionID))
                                      select new { fun.FunctionID, fun.Name }
                                      ).Distinct().ToList();

                    Func <string, string> generateOperationName = (operationId) =>
                    {
                        if (string.IsNullOrEmpty(operationId))
                        {
                            return(string.Empty);
                        }

                        var result = new StringBuilder();
                        var subIds = operationId.Split(".".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                        for (int i = 0; i < subIds.Length; i++)
                        {
                            var tempId = string.Empty;
                            int index  = 0;
                            while (index <= i)
                            {
                                tempId = string.Format("{0}.{1}", tempId, subIds[index]);
                                index++;
                            }
                            if (!string.IsNullOrEmpty(tempId))
                            {
                                tempId = tempId.Trim('.');
                                var tempOperation = operations.FirstOrDefault(n => n.FunctionID == tempId);
                                if (tempOperation != null)
                                {
                                    result.AppendFormat("{0}.", tempOperation.Name);
                                }
                            }
                        }
                        var resultName = result.ToString();
                        return(string.IsNullOrEmpty(resultName) ? resultName : resultName.Trim('.'));
                    };

                    var resultLogs = (from op in l
                                      join u in users on op.UserID equals u.UserID into tempU
                                      from tu in tempU.DefaultIfEmpty()
                                      select new OperationLogDto
                    {
                        Id = op.Id,
                        UserID = op.UserID,
                        OperationID = op.OperationID,
                        EnterpriseID = op.EnterpriseID,
                        ClientIP = op.ClientIP,
                        OperationData = op.OperationData,
                        OperateTime = op.OperateTime,
                        OperationName = generateOperationName(op.OperationID),
                        UserName = tu.Name,
                    }).ToList();
                    return(resultLogs);
                }
                #endregion
            }
            catch (Exception ex)
            {
                throw new KnownException(ex.Message);
            }
        }