old_flsystem/应用/WebAPi/Qyery.cs

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
}
}