Ejemplo n.º 1
0
        /// <summary>
        /// 绑定新用户
        /// </summary>
        /// <param name="sysUser"></param>
        /// <param name="openId"></param>
        /// <returns></returns>
        public long InsertWeChatUserAndBind(SysUser sysUser, string openId)
        {
            var newIndex       = _accountData.InsertAndBindWechatUser(sysUser, openId);
            var costTypeServer = new CostTypeService();

            costTypeServer.InitCostType(newIndex);
            var costChannelServer = new CostChannelService();

            costChannelServer.InitCostChannel(newIndex);
            return(newIndex);
        }
        /// <summary>
        /// 获取用户的所有账户信息
        /// </summary>
        /// <param name="userIds"></param>
        /// <returns></returns>
        public List <dynamic> GetStatisticsAllChannel(List <long> userIds)
        {
            var channelServer = new CostChannelService();
            //获取所有用户的统计信息
            List <CanPayAcountModel> channelCanPayList = _dataAccess.GetStatisticsCanPay(userIds);
            //获取所有用户账户
            var channelList = channelServer.GetList(-1, userIds, 1, 10000, out _);
            var result      = new List <dynamic>();

            if (channelList == null || channelList.Count < 1)
            {
                return(result);
            }

            #region [家庭成员所有]

            if (userIds.Count > 1)
            {
                var allOutCost = channelCanPayList.Where(e => e.CostInOrOut == CostInOrOutEnum.Out)
                                 .Sum(e => e.CostCount);
                var allInCost      = channelCanPayList.Where(f => f.CostInOrOut == CostInOrOutEnum.In).Sum(s => s.CostCount);
                var allCouldCost   = allInCost - allOutCost;
                var channelAccount = new Dictionary <string, decimal>();
                if (channelList.Any())
                {
                    channelList.ForEach(f =>
                    {
                        if (!channelAccount.ContainsKey(f.CostChannelName))
                        {
                            channelAccount.Add(f.CostChannelName, 0);
                        }
                    }
                                        );
                }

                channelCanPayList.ForEach(h =>
                {
                    if (channelAccount.ContainsKey(h.CostChannelName))
                    {
                        channelAccount[h.CostChannelName] = channelAccount[h.CostChannelName] +
                                                            (h.CostInOrOut == CostInOrOutEnum.In
                                                                ? h.CostCount
                                                                : h.CostCount * -1);
                    }
                    else
                    {
                        channelAccount.Add(h.CostChannelName, h.CostInOrOut == CostInOrOutEnum.In
                            ? h.CostCount
                            : h.CostCount * -1);
                    }
                });
                var data = channelAccount.Select(f => new CanPayAcountModel
                {
                    CostCount       = f.Value,
                    CostChannelName = f.Key,
                    CostChannel     = channelList.FirstOrDefault(r => r.CostChannelName == f.Key)?.Id
                }).ToList();
                result.Add(new
                {
                    StatisticsModel = new
                    {
                        allCouldCost = $"{allCouldCost:N2}",
                        allInCost    = $"{allInCost:N2}",
                        allOutCost   = $"{allOutCost:N2}"
                    },
                    channelAcount = data,
                    userId        = -1
                });
            }

            #endregion

            #region [计算成员的统计信息]
            foreach (var canPayAccountModels in channelCanPayList.GroupBy(f => f.UserId))
            {
                var itemOutCost        = canPayAccountModels.Where(e => e.CostInOrOut == CostInOrOutEnum.Out).Sum(e => e.CostCount);
                var itemInCost         = canPayAccountModels.Where(f => f.CostInOrOut == CostInOrOutEnum.In).Sum(s => s.CostCount);
                var itemCouldCost      = itemInCost - itemOutCost;
                var itemChannelAccount = new Dictionary <string, decimal>();
                var itemChannelList    = channelList.Where(r => r.UserId == canPayAccountModels.Key).ToList();
                if (itemChannelList.Any())
                {
                    itemChannelList.ForEach(r => itemChannelAccount.Add(r.CostChannelName, 0));
                }
                foreach (var h in canPayAccountModels)
                {
                    if (itemChannelAccount.ContainsKey(h.CostChannelName))
                    {
                        itemChannelAccount[h.CostChannelName] = itemChannelAccount[h.CostChannelName] +
                                                                (h.CostInOrOut == CostInOrOutEnum.In
                                                                   ? h.CostCount
                                                                   : h.CostCount * -1);
                    }
                    else
                    {
                        itemChannelAccount.Add(h.CostChannelName, h.CostInOrOut == CostInOrOutEnum.In
                            ? h.CostCount
                            : h.CostCount * -1);
                    }
                }
                var itemData = itemChannelAccount.Select(f => new CanPayAcountModel {
                    CostCount = f.Value, CostChannelName = f.Key, CostChannel = itemChannelList.FirstOrDefault(r => r.CostChannelName == f.Key)?.Id
                }).ToList();
                result.Add(new
                {
                    StatisticsModel = new
                    {
                        allCouldCost = $"{itemCouldCost:N2}",
                        allInCost    = $"{itemInCost:N2}",
                        allOutCost   = $"{itemOutCost:N2}"
                    },
                    channelAcount = itemData,
                    userId        = canPayAccountModels.Key
                });
                userIds.Remove(canPayAccountModels.Key);
            }
            #endregion

            #region 处理没有数据的情况

            if (userIds.Count > 0)
            {
                userIds.ForEach(f =>
                {
                    result.Add(new
                    {
                        StatisticsModel = new
                        {
                            allCouldCost = $"{0:N2}",
                            allInCost    = $"{0:N2}",
                            allOutCost   = $"{0:N2}"
                        },
                        channelAcount = new List <CanPayAcountModel>(),
                        userId        = f
                    });
                });
            }

            #endregion

            return(result);
        }