/// <summary> /// 线上,下载推广计划报表 /// </summary> public List <EntityCampaignReport> DownLoadCampaignReport(EntityUser session, long campaignId, int days) { List <EntityCampaignReport> lstAll = new List <EntityCampaignReport>(); string strStartDay = DateTime.Now.AddDays(0 - days).Date.ToString("yyyy-MM-dd"); string strEndDay = DateTime.Now.AddDays(-1).Date.ToString("yyyy-MM-dd"); string jsonBaseRpt = DownLoadCamapginBaseReport(session, campaignId, strStartDay, strEndDay).ToLower(); if (!string.IsNullOrEmpty(jsonBaseRpt) && jsonBaseRpt.Length > 2) { var arrBaseRpt = new DynamicJsonParser().FromJson(jsonBaseRpt); foreach (var item in arrBaseRpt) { EntityCampaignReport rpt = new EntityCampaignReport(); rpt.date = item.date; rpt.campaign_id = item.campaignid; rpt.nick = item.nick; rpt.impressions = item.impressions == null ? 0 : item.impressions; rpt.click = item.click == null ? 0 : item.click; rpt.ctr = item.ctr == null ? 0M : item.ctr; rpt.cost = Convert.ToDecimal(item.cost == null ? 0M : item.cost) / 100.0M; rpt.cpc = item.cpc == null ? 0M : item.cpc; rpt.avgpos = item.avgpos == null ? 0M : item.avgpos; rpt.source = item.source; lstAll.Add(rpt); } } string jsonEffectRpt = DownLoadCampaignEffectReport(session, campaignId, strStartDay, strEndDay).ToLower(); if (!string.IsNullOrEmpty(jsonEffectRpt) && jsonEffectRpt.Length > 2) { var arrEffectRpt = new DynamicJsonParser().FromJson(jsonEffectRpt); foreach (var item in arrEffectRpt) { EntityCampaignReport rpt = lstAll.Find(o => o.date == item.date); if (rpt == null) { logger.ErrorFormat("base:{0}\r\n effect:{1}", jsonBaseRpt, jsonEffectRpt); continue; } rpt.directpay = Convert.ToDecimal(item.directpay == null ? 0M : item.directpay) / 100.0M; rpt.indirectpay = Convert.ToDecimal(item.indirectpay == null ? 0M : item.indirectpay) / 100.0M; rpt.directpaycount = item.directpaycount == null ? 0 : item.directpaycount; rpt.indirectpaycount = item.indirectpaycount == null ? 0 : item.indirectpaycount; rpt.favitemcount = item.favitemcount == null ? 0 : item.favitemcount; rpt.favshopcount = item.favshopcount == null ? 0 : item.favshopcount; rpt.totalpay = rpt.directpay + rpt.indirectpay; rpt.totalpaycount = rpt.directpaycount + rpt.indirectpaycount; rpt.totalfavcount = rpt.favitemcount + rpt.favshopcount; rpt.roi = rpt.cost == 0M ? 0M : Math.Round((rpt.directpay + rpt.indirectpay) / rpt.cost, 2); } } return(lstAll); }
public string HelloWorld() { //测试session,使用EnableSession = true EntityUser user = HttpContext.Current.Session["user"] as EntityUser; if (user != null) { string strUserInfo = DynamicJsonParser.FromObject(user); return(strUserInfo); } else { return(null); } }
/// <summary> /// 缓存,设置用户店铺下所有的宝贝 /// </summary> public static Boolean SetUserOnlineItemCache(string nick, List <EntityItem> lstItem) { string cacheKey = string.Format("top_onlineitems_nick_{0}", nick); try { string cacheValue = CommonFunction.Compress(DynamicJsonParser.FromObject(lstItem)); return(wsFindWordProxy.SetValueTimeOut(cacheKey, cacheValue, constMonthAsSecond)); } catch (Exception se) { logger.Error(string.Format("缓存,设置{0}的宝贝失败", nick), se); } return(false); }
/// <summary> /// 线上,获取宝贝信息 /// </summary> public static EntityItem GetItemOnline(string itemIdOrUrl) { EntityItem result = null; try { string strItem = wsKeywordForecastProxy.GetItemInfoCache(null, itemIdOrUrl); result = DynamicJsonParser.ToObject <EntityItem>(strItem); } catch (Exception se) { logger.Error("缓存,获取宝贝信息错误", se); return(null); } return(result); }
/// <summary> /// 缓存,设置用户宝贝找词的结果(时长:7天) /// </summary> public static Boolean SetUserItemFindKeywordCacheWeek(string nick, long itemId, List <EntityWordData> findKewordResult) { string cacheKey = string.Format("top_findkeyword_itemid_{0}_nick_{1}", itemId, nick); try { //findKewordResult.wd = null; //由于数据太多暂时不放进缓存 string cacheValue = CommonFunction.Compress(DynamicJsonParser.FromObject(findKewordResult)); return(wsFindWordProxy.SetValueTimeOut(cacheKey, cacheValue, constSevenDayAsSecond)); } catch (Exception se) { logger.Error(string.Format("缓存,设置宝贝:{0},用户:{1}找词结果失败", itemId, nick), se); } return(false); }
/// <summary> /// 缓存,根据类目ID获取类目信息 /// </summary> public static List <Top.Api.Domain.InsightCategoryInfoDTO> GetCatsFullInfoOnline(string categoryIds) { if (string.IsNullOrEmpty(categoryIds)) { return(new List <Top.Api.Domain.InsightCategoryInfoDTO>()); } List <Top.Api.Domain.InsightCategoryInfoDTO> lstResult = null; try { string strResponse = wsKeywordForecastProxy.GetCatsFullInfoOnline(null, "1", categoryIds); lstResult = DynamicJsonParser.ToObject <List <Top.Api.Domain.InsightCategoryInfoDTO> >(strResponse); } catch (Exception se) { logger.Error(string.Format("缓存,获取类目id:{0}的类目信息失败", categoryIds), se); } return(lstResult); }
/// <summary> /// 缓存,获取用户上架在线销售的全部宝贝,默认从缓存那数据 /// </summary> public static List <EntityItem> GetUserOnlineItems(EntityUser session, Boolean isFromCache = true) { List <EntityItem> lstItem = null; try { string strResult = wsFindWordProxy.GetUserOnlineItems(null, session.fSubUserName, session.fSession, "tkc", isFromCache); if (strResult != null) { lstItem = DynamicJsonParser.ToObject <List <EntityItem> >(CommonFunction.Decompress(strResult)); } } catch (Exception se) { logger.Error("缓存,获取类目下热门词错误", se); return(null); } return(lstItem); }
/// <summary> /// 缓存,获取用户宝贝找词的结果 /// </summary> public static List <EntityWordData> GetUserItemFindKeywordCache(string nick, long itemId) { List <EntityWordData> result = null; string cacheKey = string.Format("top_findkeyword_itemid_{0}_nick_{1}", itemId, nick); try { string cacheValue = wsFindWordProxy.GetValueTimeOut(cacheKey); if (cacheValue != null) { result = DynamicJsonParser.ToObject <List <EntityWordData> >(CommonFunction.Decompress(cacheValue)); } } catch (Exception se) { logger.Error(string.Format("缓存,获取宝贝:{0},用户:{1}找词结果失败", itemId, nick), se); } return(result); }
/// <summary> /// 缓存,获取用户店铺下所有的宝贝 /// </summary> public static List <EntityItem> GetUserOnlineItemCache(string nick) { List <EntityItem> result = null; string cacheKey = string.Format("top_onlineitems_nick_{0}", nick); try { string cacheValue = wsFindWordProxy.GetValueTimeOut(cacheKey); if (cacheValue != null) { result = DynamicJsonParser.ToObject <List <EntityItem> >(CommonFunction.Decompress(cacheValue)); } } catch (Exception se) { logger.Error(string.Format("缓存,获取{0}的宝贝失败", nick), se); } return(result); }
public Campaign[] GetAllCampaignOnline() {//线上,获取所有的计划 EntityUser user = HttpContext.Current.Session["user"] as EntityUser; if (user == null) { return(null); } //获取用户所有的推广计划信息 List <Campaign> lstCampaignInfoOnline = new List <Campaign>(); try { string cacheKey_CampaignInfo = string.Format("top_campaigninfo_nick_{0}", user.fSubUserName); string cacheValue_CampaignInfo = wsProxyFindWord.GetValue(cacheKey_CampaignInfo); if (cacheValue_CampaignInfo == null) { lstCampaignInfoOnline = bllCampaign.GetCampaignOnline(user); if (lstCampaignInfoOnline != null) { wsProxyFindWord.SetValueTimeOut(cacheKey_CampaignInfo, DynamicJsonParser.FromObject(lstCampaignInfoOnline), 15 * 60); //缓存15分钟 } } else { lstCampaignInfoOnline = DynamicJsonParser.ToObject <List <Campaign> >(cacheValue_CampaignInfo); } } catch (Exception se) { logger.Error(string.Format("获取计划信息出错,参数:{0}", user.fSubUserName), se); } return(lstCampaignInfoOnline.ToArray()); }
public List <EntityWordData> GetItemKeywords(EntityUser user, string itemIdOrUrl) { //获取计划信息 if (user == null) { return(null); } EntityItem itemOnline = CommonHandler.GetItemOnline(itemIdOrUrl); if (itemOnline == null || itemOnline.item_id == 0) { return(new List <EntityWordData>()); } else { logger.InfoFormat("用户:{0},宝贝:{1},标题:{2}", user.fUserName, itemOnline.item_id, itemOnline.item_title); } //缓存获取找词的数量 List <EntityWordData> resultFindKeyword = CommonHandler.GetUserItemFindKeywordCache(user.fSubUserName, itemOnline.item_id); if (resultFindKeyword != null && resultFindKeyword.Count() > 100) { logger.InfoFormat("用户:{0},宝贝:{1},缓存取词", user.fUserName, itemOnline.item_id); return(resultFindKeyword); } //重新找词 logger.InfoFormat("用户:{0},宝贝:{1},开始找词", user.fUserName, itemOnline.item_id); resultFindKeyword = new List <EntityWordData>(); //发送蜘蛛抓词任务 string exchangeName = "ex_taobao_spider_samesimilar_item"; BusinessMQ.SendMsgToExchange(user, exchangeName, string.Format("{0},{1},{2}", itemOnline.item_id, itemOnline.item_title, itemOnline.nick)); //更新宝贝的信息 logger.InfoFormat("用户:{0},宝贝:{1},获取类目热词开始", user.fUserName, itemOnline.item_id); List <string> lstCategoryWord = CommonHandler.GetCatTopKeyword(itemOnline.cid); logger.InfoFormat("用户:{0},宝贝:{1},获取类目热词完成,数量:{2}", user.fUserName, itemOnline.item_id, lstCategoryWord.Count); logger.InfoFormat("用户:{0},宝贝:{1},获取关键词开始", user.fUserName, itemOnline.item_id); DateTime dtStartFind = DateTime.Now; //标题分词在类目中出现的词,按重复字符数*长度排序,还要按照找词统计来排序 List <string> lstMainWord = new List <string>(); //蜘蛛抓取的关键词 List <string> lstSpiderFindWord = new List <string>(); //核心词排序字典 Dictionary <string, int> dicMainWord = new Dictionary <string, int>(); //是否找到了第一核心词 Boolean isFindFirstMainWord = false; //是否通过蜘蛛找到了同款和相似宝贝的关键词 Boolean isFindKeywordBySpider = false; //将宝贝标题的分词按长度排序,在类目名称中的关键词作为核心词 List <string> lstTitleWord = CommonHandler.SplitWordFromWs(itemOnline.item_title).Split(',').OrderByDescending(o => o.Length).ToList(); foreach (var item in lstTitleWord) {//标题分词中,被类目名称包含的为核心词 if (item.Length > 1 && itemOnline.categroy_name.Contains(item) && !lstMainWord.Contains(item)) { lstMainWord.Add(item); isFindFirstMainWord = true; } } foreach (var item in lstTitleWord) {//标题分词中,和类目名称有交集的,为核心词 int sameCharCount = item.ToCharArray().Intersect(itemOnline.categroy_name.ToCharArray()).Count(); if (item.Length > 1 && sameCharCount > 0 && !dicMainWord.ContainsKey(item)) { dicMainWord.Add(item, sameCharCount * item.Length); } } if (dicMainWord.Count > 0) {//核心词汇总,交集中重复字符越多,排序值最大,放最前 lstMainWord = lstMainWord.Union(dicMainWord.OrderByDescending(o => o.Value).Select(o => o.Key).ToList()).ToList(); isFindFirstMainWord = true; dicMainWord = new Dictionary <string, int>(); } while ((!isFindKeywordBySpider) && (dtStartFind.AddSeconds(30) >= DateTime.Now)) {//类目找不到词或找到不只一个词,30秒内没找到放弃 string strFindKeywordResult = CommonHandler.GetItemFindKeywordCache(itemOnline.item_id); if (string.IsNullOrEmpty(strFindKeywordResult)) {//暂时没有找到 System.Threading.Thread.Sleep(2000); continue; } isFindKeywordBySpider = true; lstSpiderFindWord = strFindKeywordResult.Split(',').ToList(); if (isFindFirstMainWord) { //使用找词结果排序 foreach (var item in lstMainWord) { int intWordIndex = lstSpiderFindWord.FindIndex(o => o == item); dicMainWord.Add(item, intWordIndex == -1 ? 9 : intWordIndex); //不存在找词结果中的词,排最后 } //排序值最小,放最前 lstMainWord = dicMainWord.OrderBy(o => o.Value).Select(o => o.Key).ToList(); } else { lstMainWord = lstSpiderFindWord.Take(2).ToList(); } } //核心词 string mainWord = string.Join(",", lstMainWord); if (lstMainWord.Count == 0) { if (itemOnline.categroy_name != "其他" && itemOnline.categroy_name != "其它") { mainWord = string.Join(",", itemOnline.categroy_name.Split('/')); } else {//类目名称不能作为核心词时,使用属性词作为核心词 foreach (var itemProp in itemOnline.LstPropsName) { string str = Strings.GetChineseString(itemProp); if (str != null && str.Length >= 2) { lstMainWord.Add(str); } } mainWord = string.Join(",", lstMainWord); } } logger.InfoFormat("用户:{0},宝贝:{1},获取关键词完成,核心词:{2},数量:{3}", user.fUserName, itemOnline.item_id, mainWord, lstSpiderFindWord.Count); resultFindKeyword = CommonHandler.CombineWord(itemOnline, lstMainWord, lstSpiderFindWord.Union(lstTitleWord).Union(lstCategoryWord).ToList()); int totalCount = resultFindKeyword.Count; if (totalCount < 500) {//数量不足500个,从词霸热词中获取 } if (resultFindKeyword.Count < 20 && itemOnline.categroy_name != "其他" && itemOnline.categroy_name != "其它") {//无法分词,核心词可能有误,直接使用类目名称来组词 lstMainWord.Clear(); lstMainWord = itemOnline.categroy_name.Split('/').ToList(); resultFindKeyword = CommonHandler.CombineWord(itemOnline, lstMainWord, lstSpiderFindWord.Union(lstTitleWord).Union(lstCategoryWord).ToList()); } if (resultFindKeyword.Count < 20) {//找词失败,发送告警邮件 exchangeName = "ex_taobao_task_email"; EntityMail mail = new EntityMail() { mail_to = "*****@*****.**", mail_subject = "找词失败", create_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; mail.mail_body = string.Format("{0},{1},{2}", itemOnline.item_id, itemOnline.item_title, itemOnline.nick); BusinessMQ.SendMsgToExchange(user, exchangeName, DynamicJsonParser.FromObject(mail)); } //序号 resultFindKeyword.Each((o, index) => { o.id = index + 1; }); //设置缓存 CommonHandler.SetUserItemFindKeywordCache(user.fSubUserName, itemOnline.item_id, resultFindKeyword); logger.InfoFormat("用户:{0},宝贝:{1},设置关键词缓存完成,数量:{2}", user.fUserName, itemOnline.item_id, resultFindKeyword.Count); return(resultFindKeyword); }
public EntityCampaignReport[] GetAllCampaignRptOnline(string strDateStart, string strDateEnd) { //获取计划信息 EntityUser user = HttpContext.Current.Session["user"] as EntityUser; if (user == null) { return(null); } List <EntityCampaignReport> lstResultCampaignRpt = new List <EntityCampaignReport>(); try { //定义计划报表 List <EntityCampaignReport> lstCampaignRptOnline = new List <EntityCampaignReport>(); //获取用户所有的推广计划信息 List <Campaign> lstCampaignInfoOnline = null; string cacheKey_CampaignInfo = string.Format("top_campaigninfo_nick_{0}", user.fSubUserName); string cacheValue_CampaignInfo = wsProxyFindWord.GetValue(cacheKey_CampaignInfo); if (cacheValue_CampaignInfo == null) { lstCampaignInfoOnline = bllCampaign.GetCampaignOnline(user); if (lstCampaignInfoOnline != null) { wsProxyFindWord.SetValueTimeOut(cacheKey_CampaignInfo, DynamicJsonParser.FromObject(lstCampaignInfoOnline), 15 * 60); //缓存15分钟 } } else { lstCampaignInfoOnline = DynamicJsonParser.ToObject <List <Campaign> >(cacheValue_CampaignInfo); } string cacheKey_CampaignRpt = string.Format("top_campaignrpt_nick_{0}", user.fSubUserName); string cacheValue_CampaignRpt = wsProxyFindWord.GetValue(cacheKey_CampaignRpt); if (cacheValue_CampaignRpt == null) { //获取每个计划的报表 foreach (var campaignId in lstCampaignInfoOnline.Select(o => o.CampaignId)) { var lstRptResult = bllCampaign.DownLoadCampaignReport(user, campaignId, 90); //最多获取90天的报表数据 lstCampaignRptOnline.AddRange(lstRptResult); } DateTime dtNow = DateTime.Now; if (lstCampaignRptOnline != null && lstCampaignRptOnline.Count > 0 && DateTime.Now.Hour >= 8 && lstCampaignRptOnline.Where(o => o.impressions > 0 && o.date == dtNow.AddDays(-1).ToString("yyyy-MM-dd")).Count() > 0) { //8点后,如果昨日有计划的展现数据大于0则缓存 TimeSpan ts = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day).AddDays(1) - DateTime.Now; wsProxyFindWord.SetValueTimeOut(cacheKey_CampaignRpt, DynamicJsonParser.FromObject(lstCampaignRptOnline), (Int32)ts.TotalSeconds); //缓存到24:00 } } else { lstCampaignRptOnline = DynamicJsonParser.ToObject <List <EntityCampaignReport> >(cacheValue_CampaignRpt); } DateTime dtStart = Convert.ToDateTime(strDateStart); DateTime dtEnd = Convert.ToDateTime(strDateEnd); lstResultCampaignRpt = lstCampaignRptOnline.Where(o => Convert.ToDateTime(o.date) >= dtStart && Convert.ToDateTime(o.date) <= dtEnd).ToList(); foreach (var item in lstResultCampaignRpt) { Campaign c = lstCampaignInfoOnline.Find(o => o.CampaignId == item.campaign_id); if (c != null) { item.campaign_name = c.Title; item.campaign_status = c.OnlineStatus; } } } catch (Exception se) { logger.Error(string.Format("获取计划报表出错,参数:{0},{1},{2}", user.fSubUserName, strDateStart, strDateEnd), se); } return(lstResultCampaignRpt.ToArray()); }
/// <summary> /// 组词,返回词指数 /// </summary> /// <param name="itemTitle">宝贝标题</param> /// <param name="lstMainWord">核心词</param> /// <param name="lstOtherWord">属性词或类目热词</param> public static List <EntityWordData> CombineWord(EntityItem itemOnline, List <string> lstMainWord, List <string> lstOtherWord) { //关键词字典:键关键词,值权重 Dictionary <string, int> dicResult = new Dictionary <string, int>(); //属性词+核心词 foreach (var itemMainWord in lstMainWord) { foreach (var itemOtherWord in lstOtherWord) { if (itemOtherWord != itemMainWord) { if (!dicResult.ContainsKey(itemOtherWord + itemMainWord)) { dicResult.Add(itemOtherWord + itemMainWord, 10); } } } //核心词 if (!dicResult.ContainsKey(itemMainWord)) { dicResult.Add(itemMainWord, 8); } } //核心词,属性词+核心词,淘宝拓展 string strKeywordTopExtend = string.Join(",", dicResult.Select(o => o.Key)); string strExtendWords = GetRelatedwordsByKeywordCache(strKeywordTopExtend, 1); if (!string.IsNullOrEmpty(strExtendWords)) { string[] arrRelWord = strExtendWords.Split(','); foreach (var itemRelWord in arrRelWord) { if (!dicResult.ContainsKey(itemRelWord)) { dicResult.Add(itemRelWord, 7); } } } //TODO淘宝拓词后,没有核心词的词可以和核心词组词 //TODO标题词的分词,可以用属性词+属性词+核心词组 int wordCount = dicResult.Count; logger.InfoFormat("组词总数量:{0}", wordCount); List <EntityWordData> lstKeywordWithIndex = GetkeywordIndexFromWs(itemOnline.item_title, string.Join("", lstMainWord), dicResult.Select(o => o.Key).Distinct().ToList()); string parentCatId = string.Empty; if (string.IsNullOrEmpty(itemOnline.catpathid)) {//获取宝贝类目所属的顶级类目,用于判断是否需要进行性别区分 try { string strResponse = wsKeywordForecastProxy.GetCatsFullInfoOnline(null, "1", itemOnline.cid.ToString()); if (!string.IsNullOrEmpty(strResponse)) { List <dynamic> lstCatFullInfo = DynamicJsonParser.ToObject <List <dynamic> >(strResponse); if (lstCatFullInfo != null && lstCatFullInfo.Count > 0) { string strCatPathId = lstCatFullInfo[0]["catpathid"].ToString(); parentCatId = strCatPathId.Trim().Replace(" ", ",").Split(',')[0]; } } } catch (Exception se) { logger.Error(string.Format("获取顶级类目错误,宝贝id:{0},类目id:{1}", itemOnline.item_id, itemOnline.cid), se); } } else { parentCatId = itemOnline.catpathid.Replace(" ", ",").Split(',')[0]; } if (lstKeywordWithIndex != null && lstKeywordWithIndex.Count > 0) { return(FilterSpecialWord(lstKeywordWithIndex, itemOnline.item_title, parentCatId)); } else { return(new List <EntityWordData>()); } }