using Api.Framework; using Api.Framework.Enums; using Api.Framework.Model; using Api.Framework.SDK; using Api.Framework.Tools; using Chat.Framework.WXSdk.Implement; using CsharpHttpHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WebAPi { public class Qyery { private static string[] not_Friends = new string[] { "fmessage", "floatbottle", "qmessage", "medianote", "qqmail", "weixin" }; /// /// 获取转换率等信息(返回Json) /// /// 获取的开始时间 /// 获取的截止时间 /// 返回Json public async Task FindCVR(DateTime _stateTime, DateTime _endTime) { var begin_time = _stateTime; var end_time = _endTime; if (begin_time >= end_time) throw new Exception("begin_time时间不能大于end_time时间"); return await Task.Run(() => { try { var _session = ApiClient.GetSession(); List resultList = new List(); object lock_result = new object(); //List actions = new List(); var robots = new List(_session.FindRobots()); //总提现 var pointHists = _session.Find("@begin_time <= crt_time and crt_time < @end_time and type = @type ", new { begin_time = begin_time, end_time = end_time, type = "提现扣除" }); //绑定用户的订单 var orderAlimamas = _session.Find("select db_userid,db_status,db_robotname,db_robottype,pub_share_pre_fee as fee,db_point,item_num as num from fl_order_alimama where @begin_time <= create_time and create_time < @end_time and db_userid != 0 and db_status in (1005,1002,1001,998)", new { begin_time = begin_time, end_time = end_time }); //绑定用户的订单 var orderJingdongs = _session.Find("select db_userid,db_status,db_robotname,db_robottype,estimateFee as fee,db_point,skuNum as num from fl_order_jingdong where @begin_time <= orderTime and orderTime < @end_time and db_userid != 0 and db_status in (1005,1002,1001,998)", new { begin_time = begin_time, end_time = end_time }); //绑定用户的订单 var orderPinduoduos = _session.Find("select db_userid,db_status,db_robotname,db_robottype,promotion_amount as fee,db_point,goods_quantity as num from fl_order_pinduoduo where @begin_time <= order_create_time and order_create_time < @end_time and db_userid != 0 and db_status in (1005,1002,1001,998)", new { begin_time = begin_time, end_time = end_time }); //时间段创建的用户集合 var newMemberInfos = _session.Find("@begin_time <= crt_time and crt_time < @end_time", new { begin_time = begin_time, end_time = end_time }); //最近沟通的用户集合 var activeMemberInfos = _session.Find("@begin_time <= upd_time and upd_time < @end_time", new { begin_time = begin_time, end_time = end_time }); var statisticsRecords = _session.Find("select * from fl_statistics_record"); foreach (var _item in robots) { var item = _item; //actions.Add(new Action(delegate //{ try { var session = ApiClient.GetSession(); #region 合计总佣金 第一个阿里妈妈。第二个京东。第三个拼多多 var tb_income = (decimal)orderAlimamas.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Sum(f => f.fee);//淘宝总佣金 var jd_income = (decimal)orderJingdongs.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Sum(f => f.fee);//京东总佣金 var pdd_income = (decimal)orderPinduoduos.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Sum(f => f.fee);//京东总佣金 #endregion //付款总金额 decimal totalIncome = tb_income + jd_income + pdd_income; #region 毛利合计 第一个阿里妈妈。第二个京东。第三个拼多多 var tb_point = orderAlimamas.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Select(f => f.db_point).ToList();//淘宝分出佣金 var jd_point = orderJingdongs.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Select(f => f.db_point).ToList();//京东分出佣金 var pdd_point = orderPinduoduos.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Select(f => f.db_point).ToList();//拼多多分出佣金 List temps = new List(); temps.AddRange(tb_point); temps.AddRange(jd_point); temps.AddRange(pdd_point); decimal amount_ceded = 0m;//给客户的部分(约等于) for (int i = 0; i < temps.Count; i++) { var point = HttpHelper.JsonToObject(temps[i]) as ItemPoint; if (point != null) { amount_ceded += ((decimal)point.UserPoint + (decimal)point.AwardOne + (decimal)point.AwardTwo + (decimal)point.AwardThree + (decimal)point.AwardCreate); } } #endregion //毛利(约等于) decimal totalMargin = totalIncome - amount_ceded; #region 订单数量合计 第一个阿里妈妈。第二个京东。第三个拼多多 int tb_order_count = orderAlimamas.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Sum(f => f.num);//淘宝总订单数 int jd_order_count = (int)orderJingdongs.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Sum(f => f.num);//京东总订单数 int pdd_order_count = orderPinduoduos.Where(f => f.db_robotname == item.name && f.db_robottype == item.type).Sum(f => f.num);//拼多多总订单数 #endregion //总订单数 var orderCount = tb_order_count + jd_order_count + pdd_order_count; //提现金额 var exchangeMoney = (decimal)(pointHists.Where(f => f.rid == item.id).Sum(f => f.point) * -1); //var gross_margin = (totalIncome == 0 ? "0%" : Math.Round(totalMargin / totalIncome * 100m, 4).ToString() + "%");//毛利率 //统计新人人数 var newMembers = newMemberInfos.Count(f => f.robot_name == item.name); #region 新人 //已经下单的人,就不验证是否查询过 var bindNewMembers = newMemberInfos.Where(f => f.robot_name == item.name && f.robot_type == item.type && f.bind_order != 0).Count(); var verifyMembers = newMemberInfos.Where(f => f.robot_name == item.name && f.robot_type == item.type && f.bind_order == 0).ToList(); var bindNewMembers2 = 0; for (int i = 0; i < verifyMembers.Count; i++) { var temp = statisticsRecords.FirstOrDefault(f => f.uid == verifyMembers[i].id); if (null != temp) { if (temp.querynum != 0) bindNewMembers2++; } } var activeNewMembers = bindNewMembers2 + bindNewMembers; //新人转化率 var newMemberCvr = activeNewMembers == 0 ? 0 : Decimal.Round((bindNewMembers / activeNewMembers), 2); //当天新人首单数量 //var pay_order_count = memberInfos.Where(f => f.robot_name == item.name && f.robot_type == item.type && f.bind_order != 0).Count(); #endregion #region 新老用户 //互动人数 var activeMembers = activeMemberInfos.Count(f => f.robot_name == item.name); //单粉产出 var eachValue = activeMemberInfos.Count == 0 ? 0 : Decimal.Round((totalMargin / activeMemberInfos.Count), 2); //新用户下单的人数 var _bindNewMembers = activeMemberInfos.Where(f => f.robot_name == item.name && f.robot_type == item.type && begin_time <= f.crt_time && f.crt_time < end_time && f.bind_order != 0).Count(); #region 老用户 //验证的人数.检查是否下单 var _verifyMembers1 = activeMemberInfos.Where(f => f.robot_name == item.name && f.robot_type == item.type && begin_time > f.crt_time && f.crt_time >= end_time).ToList(); int bindMembers = 0;//下单人数 foreach (var member in _verifyMembers1) { var count = 0; count += orderAlimamas.Count(f => f.db_userid == member.id); if (count == 0) { count += orderJingdongs.Count(f => f.db_userid == member.id); ; if (count == 0) count += orderPinduoduos.Count(f => f.db_userid == member.id); ; } if (count != 0) bindMembers++; } #endregion //互动下单人数 var activeBindMembers = bindMembers + _bindNewMembers; var activeMemberCvr = activeMemberInfos.Count == 0 ? 0 : Decimal.Round((activeBindMembers / activeMemberInfos.Count), 2); #endregion int totalFriend = 0; if (Chat.Framework.ChatClient.WXClient.ContainsKey(_item.name)) { var wxBase = Chat.Framework.ChatClient.WXClient.FirstOrDefault(f => f.Key == item.name).Value; if (wxBase == null) totalFriend = 0; else { if (wxBase.GetType() == typeof(WXClientImpl_HOOK)) { var wx = wxBase as WXClientImpl_HOOK; if (wx != null) totalFriend = wx.Friends.Values.ToList().Where(f => !f.Alias.Contains("@") && f.MsgType == 0 && !not_Friends.ToList().Contains(f.Alias)).ToList().Count; } else if (wxBase.GetType() == typeof(WXClientImpl_IPAD)) { var wx = wxBase as WXClientImpl_IPAD; if (wx != null) totalFriend = wx.Friends.Values.ToList().Where(f => !f.Alias.Contains("@") && f.MsgType == 0 && !not_Friends.ToList().Contains(f.Alias)).ToList().Count; } } } lock (lock_result) resultList.Add(new { robotName = item.name, robotNick = item.nick, robotType = item.type.ToString(), newMembers = newMembers, bindNewMembers = bindNewMembers, newMemberCvr = newMemberCvr, activeMembers = activeMembers, activeBindMembers = activeBindMembers, activeMemberCvr = activeMemberCvr, eachValue = eachValue, orderCount = orderCount, totalFriend = totalFriend, exchangeMoney = exchangeMoney, totalIncome = totalIncome, totalMargin = totalMargin }); } catch (Exception ex) { EventClient.OnEvent(this, $"{item.name} - {ex.Message} - {ex.StackTrace}"); } //})); } //Parallel.ForEach(actions, action => //{ // action.Invoke(); //}); //Task.WaitAll(actions.ToArray()); return Task.FromResult(HttpHelper.ObjectToJson(resultList)); } catch (Exception ex) { } return Task.FromResult(string.Empty); }); } #region private class OrderTemp { /// /// 绑定的用户 /// public int db_userid { get; set; } /// /// 订单状态 /// public SystemOrderStatus db_status { get; set; } /// /// 机器人名称 /// public string db_robotname { get; set; } /// /// 机器人类型 /// public ChatType db_robottype { get; set; } /// /// 总佣金 /// public double fee { get; set; } /// /// 积分json /// public string db_point { get; set; } /// /// 购买数量 /// public int num { get; set; } } #endregion } }