285 lines
15 KiB
C#
285 lines
15 KiB
C#
|
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" };
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获取转换率等信息(返回Json)
|
|||
|
/// </summary>
|
|||
|
/// <param name="stateTime">获取的开始时间</param>
|
|||
|
/// <param name="endTime">获取的截止时间</param>
|
|||
|
/// <returns>返回Json</returns>
|
|||
|
public async Task<string> 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<object> resultList = new List<object>();
|
|||
|
object lock_result = new object();
|
|||
|
//List<Action> actions = new List<Action>();
|
|||
|
var robots = new List<fl_robot_info>(_session.FindRobots());
|
|||
|
|
|||
|
//总提现
|
|||
|
var pointHists = _session.Find<fl_point_hist>("@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<OrderTemp>("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<OrderTemp>("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<OrderTemp>("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<fl_member_info>("@begin_time <= crt_time and crt_time < @end_time", new { begin_time = begin_time, end_time = end_time });
|
|||
|
|
|||
|
//最近沟通的用户集合
|
|||
|
var activeMemberInfos = _session.Find<fl_member_info>("@begin_time <= upd_time and upd_time < @end_time", new { begin_time = begin_time, end_time = end_time });
|
|||
|
|
|||
|
var statisticsRecords = _session.Find<fl_statistics_record>("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<string> temps = new List<string>();
|
|||
|
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<ItemPoint>(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>(string.Empty);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#region
|
|||
|
private class OrderTemp
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 绑定的用户
|
|||
|
/// </summary>
|
|||
|
public int db_userid { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 订单状态
|
|||
|
/// </summary>
|
|||
|
public SystemOrderStatus db_status { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 机器人名称
|
|||
|
/// </summary>
|
|||
|
public string db_robotname { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 机器人类型
|
|||
|
/// </summary>
|
|||
|
public ChatType db_robottype { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 总佣金
|
|||
|
/// </summary>
|
|||
|
public double fee { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 积分json
|
|||
|
/// </summary>
|
|||
|
public string db_point { get; set; }
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 购买数量
|
|||
|
/// </summary>
|
|||
|
public int num { get; set; }
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|
|||
|
}
|