ComplianceServer/oldcode/Core.BLL/Application/Order/QueryAudit.cs

492 lines
24 KiB
C#

using CRM.Core.BLL.B;
using CRM.Core.BLL.Mon;
using CRM.Core.Common.WebHelper;
using CRM.Core.DAL;
using CRM.Core.Model;
using CRM.Core.Model.EntityAudit;
using CRM.Core.Model.EntityUserCenter;
using CRM.Core.Model.QueryModels;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using WX.CRM.Common;
using static CRM.Core.BLL.Application.Order.ExportAudit;
namespace CRM.Core.BLL.Application.Order
{
public class QueryAudit
{
private static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
private Mon_Order_Module_Income_BL _orderModelIncome = new Mon_Order_Module_Income_BL();
private B_Audit_Items_BL b_Audit_Items_bl = new B_Audit_Items_BL();
public AuditResultQuery.AuditResult GetItemAuditResult(int itemId, string querytype)
{
B_Audit_Check_BL b_Audit_Check_BL = new B_Audit_Check_BL();
AuditResultQuery.AuditResult auditResult = new AuditResultQuery.AuditResult();
try
{
auditResult.auditItemResults = new List<AuditResultQuery.AuditItemResult>();
var sql = "SELECT monkey From b_audit_check order by id desc limit 1";
var monkey = MySqlDbHelper.ExecuteScalar(ConStringHelper.AuditConn, CommandType.Text, sql);
var lastmonkey = Int32.Parse(monkey.ToString());
var auditchecks = b_Audit_Check_BL.GetList(d => d.Monkey == lastmonkey &&d.QueryType.Equals("cur") && d.itemId == itemId).OrderByDescending(d => d.Id);
if (auditchecks == null)
{
Logger.Debug($"auditchecks is null,lastmonkey{lastmonkey}");
}
var base_ItemsResult = auditchecks.ToDictionary(d => d.Categorie, d => d.Resultskv);
var itemName = auditchecks.FirstOrDefault().Item;
// var baseKV = JsonHelper.FromJson<Dictionary<int, double>>(base_ItemsResult.FirstOrDefault().Value.Resultskv);
auditResult.sumPayprice = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["sumPayprice"]).FirstOrDefault().Value;
auditResult.sumRefundprice = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["sumRefundprice"]).FirstOrDefault().Value;
var incomekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["income"]);
var depositreceivedkv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["depositreceived"]);
var costpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["costprice"]);
var lastcostpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["lastcostprice"]);
var checkCostpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["checkCostprice"]);
var modulePricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["modulePrice"]);
var modulRefundpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["modulRefundprice"]);
var orderRefundpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["orderRefundprice"]);
var noUseOrderRefundpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["noUseOrderRefundprice"]);
var paypricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["payprice"]);
var usepricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["useprice"]);
//var onlinePricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["onlinePrice"]);
var costpriceRefundkv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["costpriceRefund"]);
var monIncomekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["monIncome"]);
var actualRefundpricekv = JsonHelper.FromJson<Dictionary<int, decimal>>(base_ItemsResult["actualRefundprice"]);
var depConsumekvstr = "";
var depConsumekv = new Dictionary<int, decimal>();
if (base_ItemsResult.TryGetValue("depConsume", out depConsumekvstr))
{
depConsumekv = JsonHelper.FromJson<Dictionary<int, decimal>>(depConsumekvstr);
}
foreach (var item in incomekv)
{
AuditResultQuery.AuditItemResult result = new AuditResultQuery.AuditItemResult();
result.mon = item.Key;
result.item = itemName;
result.income = Math.Round(item.Value, 2);
decimal depositreceived = 0m;
depositreceivedkv.TryGetValue(item.Key, out depositreceived);
result.depositreceived = Math.Round(depositreceived, 2);
decimal costprice = 0m;
costpricekv.TryGetValue(item.Key, out costprice);
result.costprice = Math.Round(costprice, 2);
decimal lastcostprice = 0m;
lastcostpricekv.TryGetValue(item.Key, out lastcostprice);
result.lastcostprice = Math.Round(lastcostprice, 2);
decimal checkCostprice = 0m;
checkCostpricekv.TryGetValue(item.Key, out checkCostprice);
result.checkCostprice = Math.Round(checkCostprice, 2);
decimal modulePrice = 0m;
modulePricekv.TryGetValue(item.Key, out modulePrice);
result.modulePrice = Math.Round(modulePrice, 2);
decimal modulRefundprice = 0m;
modulRefundpricekv.TryGetValue(item.Key, out modulRefundprice);
result.modulRefundprice = Math.Round(modulRefundprice, 2);
decimal orderRefundprice = 0m;
orderRefundpricekv.TryGetValue(item.Key, out orderRefundprice);
result.orderRefundprice = Math.Round(orderRefundprice, 2);
decimal noUseOrderRefundprice = 0m;
noUseOrderRefundpricekv.TryGetValue(item.Key, out noUseOrderRefundprice);
result.noUseOrderRefundprice = Math.Round(noUseOrderRefundprice, 2);
decimal payprice = 0m;
paypricekv.TryGetValue(item.Key, out payprice);
result.payprice = Math.Round(payprice, 2);
decimal useprice = 0m;
usepricekv.TryGetValue(item.Key, out useprice);
result.useprice = Math.Round(useprice, 2);
//decimal onlinePrice = 0m;
//onlinePricekv.TryGetValue(item.Key, out onlinePrice);
//result.onlinePrice = Math.Round(onlinePrice, 2);
decimal costpriceRefund = 0m;
costpriceRefundkv.TryGetValue(item.Key, out costpriceRefund);
result.costpriceRefund = Math.Round(costpriceRefund, 2);
decimal monIncome = 0m;
monIncomekv.TryGetValue(item.Key, out monIncome);
result.monIncome = Math.Round(monIncome, 2);
decimal actualRefundprice = 0m;
actualRefundpricekv.TryGetValue(item.Key, out actualRefundprice);
result.actualRefundprice = Math.Round(actualRefundprice, 2);
decimal depConsume = 0m;
depConsumekv.TryGetValue(item.Key, out depConsume);
result.depConsume = Math.Round(depConsume, 2);
auditResult.auditItemResults.Add(result);
}
var finish = _orderModelIncome.GetLastFinish();
auditResult.auditDate = finish==null?"":finish.Day.ToString("yyyy-MM-dd");
auditResult.DataEnd = finish == null ? "" : finish.DataEnd.ToString("yyyy-MM-dd");
var auditendDate = "";
if (!string.IsNullOrEmpty(auditResult.DataEnd))
{
auditendDate = finish.DataEnd.AddMonths(1).AddDays(-finish.DataEnd.Day - 1).ToString("yyyy-MM-dd");
}
auditResult.remark = $"数据日期:{auditResult.DataEnd}(预结算到:{auditendDate}),总金额:{auditResult.sumPayprice},总退款:{auditResult.sumRefundprice}";
}catch(Exception ex)
{
Logger.Error(ex);
}
return auditResult;
}
public AuditResultQuery.AuditResult GetAuditResult(int monkey, string querytype)
{
B_Audit_Check_BL b_Audit_Check_BL = new B_Audit_Check_BL();
AuditResultQuery.AuditResult auditResult = new AuditResultQuery.AuditResult();
try
{
auditResult.auditItemResults = new List<AuditResultQuery.AuditItemResult>();
var lastmonkey = monkey;
if (monkey == 0)
{
var sql = "SELECT monkey From b_audit_check order by id desc limit 1";
var monkeystr = MySqlDbHelper.ExecuteScalar(ConStringHelper.AuditConn, CommandType.Text, sql);
lastmonkey = Int32.Parse(monkeystr.ToString());
}
var where = PredicateExtensionses.True<B_Audit_Check>();
where = where.And(d => d.Monkey == lastmonkey);
where = where.And(d => d.QueryType.Equals("cur"));
var audit_checklist = b_Audit_Check_BL.GetList(where).OrderByDescending(d => d.Id).ToList();
//var auditkvs = audit_checklist.Where(d => d.Categorie.Equals("income")).FirstOrDefault().Resultskv;
var auditItemResults= new List<AuditResultQuery.AuditItemResult>();
foreach (var audit_checkitem in audit_checklist.GroupBy(d => d.Item))
{
AuditResultQuery.AuditItemResult result = new AuditResultQuery.AuditItemResult();
result.item = audit_checkitem.Key;
foreach (var item in audit_checkitem)
{
result.itemId = item.itemId;
result.parentId = B_Audit_Items_BL.GetAudit_ItemFromId(item.itemId).ParentId;
result.sort = B_Audit_Items_BL.GetAudit_ItemFromId(item.itemId).Sort;
Type type = result.GetType();
var value = 0m;
JsonHelper.FromJson<Dictionary<int, decimal>>(item.Resultskv).TryGetValue(monkey, out value);
result.mon = monkey;
foreach (var typeinfo in type.GetProperties())
{
if (typeinfo.Name == item.Categorie)
{
typeinfo.SetValue(result, Math.Round(value, 2));
}
}
}
auditItemResults.Add(result);
}
auditResult.auditItemResults = AuditResultQuery.SortTrees(auditItemResults,1);
var finish = _orderModelIncome.GetLastFinish();
auditResult.auditDate = finish == null ? "" : finish.Day.ToString("yyyy-MM-dd");
auditResult.DataEnd = finish == null ? "" : finish.DataEnd.ToString("yyyy-MM-dd");
var auditendDate = "";
if (!string.IsNullOrEmpty(auditResult.DataEnd))
{
auditendDate = finish.DataEnd.AddMonths(1).AddDays(-finish.DataEnd.Day - 1).ToString("yyyy-MM-dd");
}
auditResult.remark = $"数据日期:{auditResult.DataEnd}(预结算到:{auditendDate})";
}
catch (Exception ex)
{
Logger.Error(ex);
}
return auditResult;
}
public AuditResultQuery.AuditResult GetAuditResult(int monkey,int? itemId, string querytype)
{
B_Audit_Check_BL b_Audit_Check_BL = new B_Audit_Check_BL();
AuditResultQuery.AuditResult auditResult = new AuditResultQuery.AuditResult();
try
{
auditResult.auditItemResults = new List<AuditResultQuery.AuditItemResult>();
var lastmonkey = monkey;
if (monkey == 0)
{
var sql = "SELECT monkey From b_audit_check order by id desc limit 1";
var monkeystr = MySqlDbHelper.ExecuteScalar(ConStringHelper.AuditConn, CommandType.Text, sql);
lastmonkey = Int32.Parse(monkeystr.ToString());
}
var where = PredicateExtensionses.True<B_Audit_Check>();
where = where.And(d => d.Monkey == lastmonkey);
var audit_checklist = b_Audit_Check_BL.GetList(where).OrderByDescending(d => d.Id).ToList();
//var auditkvs = audit_checklist.Where(d => d.Categorie.Equals("income")).FirstOrDefault().Resultskv;
foreach (var audit_checkitem in audit_checklist.GroupBy(d => d.Item))
{
AuditResultQuery.AuditItemResult result = new AuditResultQuery.AuditItemResult();
result.item = audit_checkitem.Key;
foreach (var item in audit_checkitem)
{
result.itemId = item.itemId;
result.parentId = B_Audit_Items_BL.GetAudit_ItemFromId(item.itemId).ParentId;
Type type = result.GetType();
var value = 0m;
JsonHelper.FromJson<Dictionary<int, decimal>>(item.Resultskv).TryGetValue(monkey, out value);
result.mon = monkey;
foreach (var typeinfo in type.GetProperties())
{
if (typeinfo.Name == item.Categorie)
{
typeinfo.SetValue(result, Math.Round(value, 2));
}
}
}
auditResult.auditItemResults.Add(result);
}
auditResult.auditItemResults = auditResult.auditItemResults.OrderBy(d => d.itemId).ToList();
var finish = _orderModelIncome.GetLastFinish();
auditResult.auditDate = finish == null ? "" : finish.Day.ToString("yyyy-MM-dd");
auditResult.DataEnd = finish == null ? "" : finish.DataEnd.ToString("yyyy-MM-dd");
var auditendDate = "";
if (!string.IsNullOrEmpty(auditResult.DataEnd)) {
auditendDate = finish.DataEnd.AddMonths(1).AddDays(-finish.DataEnd.Day - 1).ToString("yyyy-MM-dd");
}
auditResult.remark = $"数据日期:{auditResult.DataEnd}(预结算到:{auditendDate})";
}
catch (Exception ex)
{
Logger.Error(ex);
}
return auditResult;
}
/// <summary>
/// 查询渠道消费数据(广告投放等)
/// </summary>
public void QuerydepConsumes()
{
B_Audit_Check_BL b_Audit_Check_BL = new B_Audit_Check_BL();
List<B_Audit_Check> b_Audit_CheckList = new List<B_Audit_Check>();
List < AuditResultQuery.ItemdepConsume> itemdepConsumes = new List<AuditResultQuery.ItemdepConsume>();
var monkey = Int32.Parse(DateTime.Now.ToString("yyyyMM"));
var categorie = "depConsume";
var queryType = "cur";
var categorieName = "渠道消费";
Logger.Info("开始查询渠道消费结果");
var sql = "SELECT dep.title,con.deptid,dep.campainid,DATE_FORMAT(con.ctime,'%Y%m') mon ,sum(con.price) price From dncmspromotion.channelconsumetotaldept con LEFT JOIN `dncmsbase`.`deptment` dep on dep.id = con.deptid GROUP BY con.deptid,dep.campainid,dep.title,DATE_FORMAT(con.ctime, '%Y%m')";
var ds= MySqlDbHelper.DataQueray(ConStringHelper.UserCenterConn, CommandType.Text, sql);
List<AuditResultQuery.depConsume> depConsumes = ds.Tables[0].ToList<AuditResultQuery.depConsume>();
var depConsumesGroup = depConsumes.GroupBy(d => d.campainid);
//分类分渠道数据
foreach (var item in depConsumesGroup)
{
var b_Audit_Items= b_Audit_Items_bl.GetAudit_ItemsFromChannel(item.Key);
foreach (var b_Audit_Item in b_Audit_Items)
{
foreach (var depConsume in item)
{
AuditResultQuery.ItemdepConsume itemdepConsume = new AuditResultQuery.ItemdepConsume()
{
itemid = b_Audit_Item.Id,
item= b_Audit_Item.Item,
mon=depConsume.mon,
price=depConsume.price
};
itemdepConsumes.Add(itemdepConsume);
}
}
};
//写入分渠道数据
foreach (var item in itemdepConsumes.GroupBy(d=>new { d.itemid,d.item}))
{
B_Audit_Check b_Audit_Check = new B_Audit_Check()
{
Monkey = monkey,
QueryType = queryType,
itemId = item.Key.itemid,
Item = item.Key.item,
Categorie = categorie,
CategorieName = categorieName,
Resultskv = JsonHelper.ToJson(item.GroupBy(d => d.mon).ToDictionary(d =>int.Parse( d.Key), d => d.Sum(a => a.price))),
Ctime = DateTime.Now
};
b_Audit_CheckList.Add(b_Audit_Check);
}
b_Audit_Check_BL.Delete(d => d.Monkey == monkey&& d.Categorie == categorie);
b_Audit_Check_BL.AddList(b_Audit_CheckList);
Logger.Info(string.Format("更新渠道消费结果{0}条", b_Audit_CheckList.Count));
}
public Dictionary<int, double> GetAuditCost()
{
Dictionary<int, double> kvs = new Dictionary<int, double>();
string sql = "SELECT mon,sum(cost) cost From audit_cost GROUP BY mon ORDER BY mon;";
var ds = MySqlDbHelper.DataQueray(ConStringHelper.AuditConn, CommandType.Text, sql);
foreach (DataRow item in ds.Tables[0].Rows)
{
kvs.Add(int.Parse(item["mon"].ToString()), double.Parse(item["cost"].ToString()));
}
return kvs;
}
public List<ExportAudit.ExportItem> QueryAuditItems(string queryType)
{
List<ExportAudit.ExportItem> exportItems = new List<ExportAudit.ExportItem>();
DateTime endDate;
var finish = _orderModelIncome.GetLastFinish();
if (finish == null)
{
throw new Exception("未找到结算数据,请确认!");
}
var fDate = finish.DataEnd;
if (queryType.Equals(AuditResultQuery.QueryType.income.ToString()) || queryType.Equals(AuditResultQuery.QueryType.qc.ToString()))
{
fDate = finish.Day;
endDate = finish.Day;
}
else if (queryType.Equals(AuditResultQuery.QueryType.act.ToString()))
{
fDate = finish.Day;
endDate = finish.Day.AddYears(3);
}
else
{
endDate = fDate.AddYears(3);
}
Stopwatch stopwatch = new Stopwatch();
B_Audit_Items_BL _B_Audit_Items = new B_Audit_Items_BL();
B_Audit_Querysql_BL _B_Audit_Querysql = new B_Audit_Querysql_BL();
Mon_Ym_BL _Mon_Ym_BL = new Mon_Ym_BL();
//获取设置和sql
var audititems = _B_Audit_Items.GetList(t => t.Querytype.Contains(queryType + ",")).OrderBy(d => d.Sort).ToList();
var auditquerysql = _B_Audit_Querysql.GetList(t => t.Querytype.Contains(queryType + ",")).ToList();
_Mon_Ym_BL.InitMon_Ym(endDate);
//截止时间
var fdate = fDate.AddDays(1).ToString("yyyy-MM-dd");
//生成channel query sql
var audititemschannel = _B_Audit_Items.InitChannlquery(audititems);
StringBuilder QueryTimes= new StringBuilder();
foreach (var item in B_Audit_Items_BL.SortTrees(audititems))
{
var categorieskv = new Dictionary<string, ExportAudit.Category>();
foreach (var sqlitem in auditquerysql)
{
var querysql = sqlitem.Querytemp;
if (!string.IsNullOrEmpty(item.Channel))
{
querysql = querysql.Replace("@channelquery", string.Format("where {0}", item.Channelquery));
}
if (!string.IsNullOrEmpty(item.Subqueryitems) && !string.IsNullOrEmpty(sqlitem.Subquery))
{
var subquerysqllist = new List<string>();
var subitemkv = JsonHelper.FromJson<ConcurrentDictionary<string, string>>(item.Subqueryitems);
var subquerykv = JsonHelper.FromJson<ConcurrentDictionary<string, string>>(sqlitem.Subquery);
foreach (var subitem in subitemkv)
{
var subquerysql = "";
if (subquerykv.TryGetValue(subitem.Key, out subquerysql))
{
subquerysql = subquerysql.Replace(string.Format("@{0}", subitem.Key), subitem.Value);
subquerysqllist.Add(subquerysql);
}
}
var subquerysqlstr = string.Join(" and ", subquerysqllist.ToArray());
querysql = querysql.Replace("@subquery", string.Format(" and {0}", subquerysqlstr));
}
querysql = querysql.Replace("@timeend", string.Format("'{0}'", fdate));
querysql = querysql.Replace("@channelquery", "where 1=1").Replace("@subquery", "");
//如果查询语句中没有where就
if (!querysql.Contains("where") && querysql.Contains("and"))
{
var index = querysql.IndexOf("and");
querysql = querysql.Remove(index, 3).Insert(index, "where");
}
Logger.Info(string.Format("{0},{1},\r\n{2}", item.Item, sqlitem.Name, querysql));
stopwatch.Restart();
var kvlist = _B_Audit_Querysql.ExcultQuery(querysql);
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds > 100)
{
QueryTimes.Append($"{item.Item},{sqlitem.Name},{stopwatch.ElapsedMilliseconds}\r\n");
}
Logger.Info(string.Format("耗时:[{0}]结果:\r\n{1}", stopwatch.ElapsedMilliseconds, kvlist.ToJson()));
var categorie = new ExportAudit.Category { key = sqlitem.QueryKey, name = sqlitem.Name, keyValues = kvlist };
categorieskv.Add(categorie.key, categorie);
}
exportItems.Add(new ExportAudit.ExportItem { id = item.Id, Name = item.Item, categorieskv = categorieskv });
}
Logger.Info(QueryTimes.ToString());
return exportItems;
}
}
}