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(); 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>(base_ItemsResult.FirstOrDefault().Value.Resultskv); auditResult.sumPayprice = JsonHelper.FromJson>(base_ItemsResult["sumPayprice"]).FirstOrDefault().Value; auditResult.sumRefundprice = JsonHelper.FromJson>(base_ItemsResult["sumRefundprice"]).FirstOrDefault().Value; var incomekv = JsonHelper.FromJson>(base_ItemsResult["income"]); var depositreceivedkv = JsonHelper.FromJson>(base_ItemsResult["depositreceived"]); var costpricekv = JsonHelper.FromJson>(base_ItemsResult["costprice"]); var lastcostpricekv = JsonHelper.FromJson>(base_ItemsResult["lastcostprice"]); var checkCostpricekv = JsonHelper.FromJson>(base_ItemsResult["checkCostprice"]); var modulePricekv = JsonHelper.FromJson>(base_ItemsResult["modulePrice"]); var modulRefundpricekv = JsonHelper.FromJson>(base_ItemsResult["modulRefundprice"]); var orderRefundpricekv = JsonHelper.FromJson>(base_ItemsResult["orderRefundprice"]); var noUseOrderRefundpricekv = JsonHelper.FromJson>(base_ItemsResult["noUseOrderRefundprice"]); var paypricekv = JsonHelper.FromJson>(base_ItemsResult["payprice"]); var usepricekv = JsonHelper.FromJson>(base_ItemsResult["useprice"]); //var onlinePricekv = JsonHelper.FromJson>(base_ItemsResult["onlinePrice"]); var costpriceRefundkv = JsonHelper.FromJson>(base_ItemsResult["costpriceRefund"]); var monIncomekv = JsonHelper.FromJson>(base_ItemsResult["monIncome"]); var actualRefundpricekv = JsonHelper.FromJson>(base_ItemsResult["actualRefundprice"]); var depConsumekvstr = ""; var depConsumekv = new Dictionary(); if (base_ItemsResult.TryGetValue("depConsume", out depConsumekvstr)) { depConsumekv = JsonHelper.FromJson>(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(); 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(); 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(); 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>(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(); 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(); 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>(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; } /// /// 查询渠道消费数据(广告投放等) /// public void QuerydepConsumes() { B_Audit_Check_BL b_Audit_Check_BL = new B_Audit_Check_BL(); List b_Audit_CheckList = new List(); List < AuditResultQuery.ItemdepConsume> itemdepConsumes = new List(); 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 depConsumes = ds.Tables[0].ToList(); 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 GetAuditCost() { Dictionary kvs = new Dictionary(); 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 QueryAuditItems(string queryType) { List exportItems = new List(); 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(); 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(); var subitemkv = JsonHelper.FromJson>(item.Subqueryitems); var subquerykv = JsonHelper.FromJson>(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; } } }