Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using Microsoft.SharePoint;
- using System.Collections.Generic;
- using System.Linq;
- using System.Collections.Specialized;
- using Microsoft.SharePoint.Utilities;
- using System.Web.Script.Serialization;
- using System.IO;
- using System.Text;
- using System.Linq.Expressions;
- using System.Diagnostics;
- using CamlexNET;
- using SalesToTableWebPart.RequstsResponses;
- using SaleDocsLib;
- using Microsoft.Office.Server.Diagnostics;
- using System.Threading;
- using System.Globalization;
- using Microsoft.SharePoint.WebControls;
- namespace SalesToTableWebPart.ViewWebPart
- {
- public partial class ViewWebPartUserControl : UserControl, ICallbackEventHandler
- {
- public string jSON;
- string ICallbackEventHandler.GetCallbackResult()
- {
- return jSON;
- }
- /// <summary>
- /// Используется для записи запроса, вызвавшего ошибку, в логах
- /// </summary>
- static string eventArg;
- void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
- {
- try
- {
- eventArg = eventArgument;
- jSON = "";
- var rows = new List<string>();
- rows.AddRange(eventArgument.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries));
- string action = rows[0];
- rows.RemoveAt(0);
- switch (action)
- {
- case "GetObjects": jSON = GetAdsObjects(rows[0]); break;
- default: jSON = new JSONResponce() { Exception = "Не распознанная команда" }.ToString(); break;
- }
- }
- catch (Exception exc)
- {
- jSON = ExceptionMessage(exc, "");
- }
- }
- /// <summary>
- /// По фильтру выбирает объекты рекламы и устанавливает значения для пейджинга
- /// </summary>
- /// <param name="row">json фильтра</param>
- /// <returns></returns>
- public string GetAdsObjects(string row)
- {
- string result = "";
- AdsFilter filter = new JavaScriptSerializer().Deserialize<AdsFilter>(row);
- SPListItemCollection resCol;
- List<AdsObj> resAdsObjs = GetAdsObjectsItems(filter, 8, out resCol).OrderBy(x => x.Art).ToList();
- GetObjectsResponse resp = new GetObjectsResponse
- {
- Objects = resAdsObjs,
- StartMonth = filter.From.Month,
- FinishMonth = filter.To.Month,
- NextPageInfo = "",
- PrevPageInfo = ""
- };
- //collect paging info
- if (resAdsObjs.Any())
- {
- if (filter.CustId == -1)
- {
- SPListItemCollection checkPrevNextItems;
- var prevPageInfo = string.Format("Paged=True&PagedPrev=True&p_ID={0}&p_Title={1}",
- resAdsObjs[0].ID, Server.UrlEncode(resAdsObjs[0].Art));
- filter.PageInfo = prevPageInfo;
- List<AdsObj> checkPrevAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
- if (checkPrevAdsObjs != null && checkPrevAdsObjs.Any())
- if (checkPrevAdsObjs[0].ID != resAdsObjs[0].ID)
- resp.PrevPageInfo = prevPageInfo;
- AdsObj lastResAdsObj = resAdsObjs[resAdsObjs.Count - 1];
- var nextPageInfo = string.Format("Paged=True&p_ID={0}&p_Title={1}", lastResAdsObj.ID, Server.UrlEncode(lastResAdsObj.Art));
- filter.PageInfo = nextPageInfo;
- List<AdsObj> checkNextAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
- if (checkNextAdsObjs != null && checkNextAdsObjs.Any())
- if (checkNextAdsObjs[0].ID != lastResAdsObj.ID)
- resp.NextPageInfo = nextPageInfo;
- }
- else
- {
- if (resCol != null)
- {
- SPListItemCollection checkPrevNextItems;
- if (!string.IsNullOrEmpty(filter.PageInfo))
- {
- var id = filter.PageInfo.Split('&').First(x => x.Contains("p_ID")).Split('=')[1];
- var prevPageInfo = string.Format("Paged=True&PagedPrev=True&p_ID={0}", id);
- filter.PageInfo = prevPageInfo;
- List<AdsObj> checkPrevAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
- if (checkPrevAdsObjs.Any())
- if (checkPrevAdsObjs[0].ID != resAdsObjs[0].ID)
- resp.PrevPageInfo = prevPageInfo;
- }
- //if (checkPrevNextItems.ListItemCollectionPosition != null)// || tmp.ListItemCollectionPosition != null)
- var nextPageInfo = string.Format("Paged=True&p_ID={0}", resCol[resCol.Count - 1].ID);
- filter.PageInfo = nextPageInfo;
- List<AdsObj> checkNextAdsObjs = GetAdsObjectsItems(filter, 1, out checkPrevNextItems);
- if (checkNextAdsObjs.Any())
- //if (checkNextAdsObjs[0].ID != resAdsObjs[resAdsObjs.Count - 1].ID)
- resp.NextPageInfo = nextPageInfo;
- }
- }
- }
- result = new JavaScriptSerializer().Serialize(resp);
- return result;
- }
- /// <summary>
- /// Выбирает нужное число объектов рекламы. Первым запросом выбирается указанное в параметре count кол-во элементов, после чего они фильтруются по проданности и метод вызывается рекурсивно с изменённым параметром count до выбора нужного кол-ва обхектов или пока не проверит все элементы списка
- /// </summary>
- /// <param name="filter"></param>
- /// <param name="count"></param>
- /// <param name="mainCol"></param>
- /// <returns></returns>
- public List<AdsObj> GetAdsObjectsItems(AdsFilter filter, int count, out SPListItemCollection mainCol)
- {
- List<AdsObj> resAdsObjs;
- mainCol = null;
- if (filter.CustId == -1)
- resAdsObjs = GetAdsObjs(filter, count, out mainCol);
- else
- {
- //Берем все сделки покупателя
- List<SPListItem> deals = GetDealsItems(filter.CustId, filter.AllowedStates);
- if (deals.Count == 0) return new List<AdsObj>();
- //Берем все позиции покупателя
- SPListItemCollection details = GetDetails(filter.From, filter.To, deals);
- if (details.Count == 0) return new List<AdsObj>();
- var adsObjExpr = new List<Expression<Func<SPListItem, bool>>>(details.Count);
- foreach (SPListItem detailItem in details)
- //Если сделка бронь, то проверяем не истекла ли она
- {
- bool isReserve = (bool)deals.First(x => x.ID == new SPFieldLookupValue((string)detailItem[C.DetailsF.Order]).LookupId)
- [C.DealsF.IsReserve];
- if (!isReserve || isReserve && (DateTime)detailItem[C.DetailsF.ResPerDate] >= DateTime.Today)
- {
- var adsObjId = new SPFieldLookupValue((string)detailItem[C.DetailsF.Art]).LookupId;
- adsObjExpr.Add(x => (int)x["ID"] == adsObjId);
- }
- }
- if (adsObjExpr.Count == 0) return new List<AdsObj>();
- //Берем все объекты
- SPQuery adsObjQuery = new SPQuery();
- if (!string.IsNullOrEmpty(filter.AdsObjName))
- {
- adsObjExpr = new List<Expression<Func<SPListItem, bool>>>
- {
- CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(adsObjExpr),
- x=>((string)x[SPBuiltInFieldId.Title]).Contains(filter.AdsObjName)
- };
- adsObjQuery.Query = Camlex.Query().WhereAll(adsObjExpr).ToString();
- }
- else
- adsObjQuery.Query = Camlex.Query().WhereAny(adsObjExpr).ToString();
- var adsObjItems = GetList(C.L.AdsObjListName).GetItems(adsObjQuery);
- if (adsObjItems.Count == 0) return new List<AdsObj>();
- CurObjectDetails = details.Cast<SPListItem>().ToList();
- resAdsObjs =
- (from SPListItem curItem in adsObjItems
- select new AdsObj(curItem, filter.From, filter.To)).ToList();
- }
- return resAdsObjs;
- }
- private List<AdsObj> GetAdsObjs(AdsFilter filter, int count, out SPListItemCollection col)
- {
- List<AdsObj> resAdsObjs = null;
- col = GetAdsObjectsItems(filter.Types, filter.PageInfo, filter.OwnerId, filter.AdsObjName, count);
- if (col.Count > 0)
- {
- CurObjectDetails = PrepareCurObjectDetails(col, filter.IsSale);
- resAdsObjs = (from SPListItem curItem in col select new AdsObj(curItem, filter.From, filter.To)).ToList();
- }
- if (resAdsObjs != null && resAdsObjs.Count < count && col.ListItemCollectionPosition != null)
- {
- filter.PageInfo = !string.IsNullOrEmpty(filter.PageInfo) && filter.PageInfo.Contains("PagedPrev=")
- ? string.Format("Paged=True&PagedPrev=True&p_ID={0}&p_Title={1}",
- col[0].ID,
- col[0].Title.Replace(" ", "%20").Replace("_", "%5f"))
- : col.ListItemCollectionPosition.PagingInfo;
- resAdsObjs =
- resAdsObjs.Concat(GetAdsObjectsItems(filter, count - resAdsObjs.Count, out col)).ToList();
- }
- return resAdsObjs;
- }
- /// <summary>
- /// Выбирает все позиции указанных сделок с фильтром по датам
- /// </summary>
- /// <param name="from"></param>
- /// <param name="to"></param>
- /// <param name="deals"></param>
- /// <returns></returns>
- private SPListItemCollection GetDetails(DateTime from, DateTime to, List<SPListItem> deals)
- {
- SPList detailList = GetList(C.L.DetailsListName);
- var detailExpr = new List<Expression<Func<SPListItem, bool>>>();
- foreach (SPListItem dealItem in deals)
- if (dealItem.ModerationInformation.Status == SPModerationStatusType.Approved)
- {
- int dealId = dealItem.ID;
- detailExpr.Add(x => x[detailList.Fields[C.DetailsF.Order].Id] == (DataTypes.LookupId)dealId.ToString());
- }
- detailExpr = new List<Expression<Func<SPListItem, bool>>>
- {
- FromToDatesExpr(detailList.Fields[C.DetailsF.DateFrom].Id, detailList.Fields[C.DetailsF.To].Id, from, to),
- CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(detailExpr)
- };
- var detailsQuery = new SPQuery
- {
- Query = Camlex.Query().WhereAll(detailExpr).ToString(),
- ViewFields = CAML.ViewFields(new[]
- {
- detailList.Fields[C.DetailsF.Art].Id,
- detailList.Fields[C.DetailsF.Order].Id,
- detailList.Fields[C.DetailsF.DateFrom].Id,
- detailList.Fields[C.DetailsF.DateTo].Id
- })
- };
- return detailList.GetItems(detailsQuery);
- }
- /// <summary>
- /// Выбирает объекты рекламы, фильтруя по вводимым параметрам
- /// </summary>
- /// <param name="typesFilter"></param>
- /// <param name="pageInfo"></param>
- /// <param name="ownerId"></param>
- /// <param name="adsObjName"></param>
- /// <param name="count"></param>
- /// <returns></returns>
- private SPListItemCollection GetAdsObjectsItems(string[] typesFilter, string pageInfo, int ownerId, string adsObjName, int count)
- {
- SPList adsObjList = GetList(C.L.AdsObjListName);
- var allExpr = new List<Expression<Func<SPListItem, bool>>>(2);
- if (typesFilter.Length != 4)
- {
- var typesExpr = new List<Expression<Func<SPListItem, bool>>>(3);
- for (int i = 0; i < typesFilter.Length; i++)
- {
- var ind = i;
- typesExpr.Add(x => (string)x[adsObjList.Fields[C.AdsObjsF.Type].Id] == typesFilter[ind]);
- }
- var exprTypesFilter = CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(typesExpr);
- allExpr.Add(exprTypesFilter);
- }
- if (ownerId != -1)
- allExpr.Add(x => x[adsObjList.Fields[C.AdsObjsF.Owner].Id] == (DataTypes.LookupId)ownerId.ToString());
- if (!string.IsNullOrEmpty(adsObjName))
- allExpr.Add(x => ((string)x[SPBuiltInFieldId.Title]).Contains(adsObjName));
- var camlexQuery = allExpr.Any() ? Camlex.Query().WhereAll(allExpr) : Camlex.Query();
- SPQuery query = new SPQuery
- {
- Query = camlexQuery.OrderBy(z => z[SPBuiltInFieldId.Title]).ToString(),
- ViewFields = CAML.ViewFields(new[] { "Title", C.AdsObjsF.Mount, C.AdsObjsF.Address, C.AdsObjsF.Cost, C.AdsObjsF.Type }, adsObjList)
- };
- if (!string.IsNullOrEmpty((pageInfo)))
- query.ListItemCollectionPosition = new SPListItemCollectionPosition(pageInfo);
- query.RowLimit = (uint)count;
- var result = adsObjList.GetItems(query);
- return result;
- }
- /// <summary>
- /// Возвращает Expression с пересекающимися датами
- /// </summary>
- /// <param name="fromGuid">id поля начала периода элемента</param>
- /// <param name="toGuid">id поля конца периода элемента</param>
- /// <param name="fromDate">дата начала фильтрующего периода</param>
- /// <param name="toDate">дата конца фильтрующего периода</param>
- /// <returns>Expression с пересекающимися датами</returns>
- public static Expression<Func<SPListItem, bool>> FromToDatesExpr(Guid fromGuid, Guid toGuid, DateTime fromDate, DateTime toDate)
- {
- var allExpr = new List<Expression<Func<SPListItem, bool>>>(4){
- x => (DateTime)x[fromGuid] <= fromDate && (DateTime)x[toGuid] >= fromDate,
- x => (DateTime)x[fromGuid] <= toDate && (DateTime)x[toGuid] >= toDate,
- x => (DateTime)x[fromGuid] >= fromDate && (DateTime)x[fromGuid] <= toDate,
- x => ((DateTime)x[toGuid] >= fromDate && (DateTime)x[toGuid] <= toDate)
- };
- var result = CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(allExpr);
- return result;
- }
- /// <summary>
- /// Возвращает все детали продаж объекта,
- /// </summary>
- /// <param name="artItems">Коллекция объектов, позиуии которых выбираются</param>
- /// <param name="isSale">Определяет брать позиции закупок у собственников или продаж конечным клиентам</param>
- /// <returns></returns>
- private static List<SPListItem> PrepareCurObjectDetails(SPListItemCollection artItems, bool isSale)
- {
- var detailsList = GetList(C.L.DetailsListName);
- var dealsList = GetList(C.L.DealsListName);
- var detailsExpr = new List<Expression<Func<SPListItem, bool>>>();
- for (int i = 0; i < artItems.Count; i++)
- {
- var ind = i;
- detailsExpr.Add(x => x[detailsList.Fields[C.L.Art].Id] == (DataTypes.LookupId)artItems[ind].ID.ToString());
- }
- SPQuery query = new SPQuery
- {
- ViewFields = CAML.ViewFields(new[] {C.DetailsF.DateFrom, C.DetailsF.DateTo, C.DetailsF.Art, C.DetailsF.Order,
- C.DetailsF.ResPerDate,C.DetailsF.CostOfSale,C.DetailsF.CostOfPeriod,C.DetailsF.PriceCost,C.DetailsF.ResDate}, detailsList),
- Query = Camlex.Query().WhereAny(detailsExpr).ToString()
- };
- var detailsItems = detailsList.GetItems(query).Cast<SPListItem>().Where(x => x[C.DetailsF.Order] != null).ToList();
- //сгенерить запрос для взять все сделки, содержащие эти позиции и с фильтром по продажа/закупка
- var dealsExpr = new List<Expression<Func<SPListItem, bool>>>();
- foreach (var dealID in (from item in detailsItems select new SPFieldLookupValue((string)item[C.DetailsF.Order]).LookupId).Distinct())
- {
- int dealId = dealID;
- dealsExpr.Add(x => (int)x["ID"] == dealId);
- }
- var custTypeFieldId = dealsList.Fields[C.DealsF.CustType].Id;
- dealsExpr = new List<Expression<Func<SPListItem, bool>>>(2)
- {
- CamlexNET.Impl.Helpers.ExpressionsHelper.CombineOr(dealsExpr),
- isSale?
- (Expression<Func<SPListItem, bool>>)(x=>x[custTypeFieldId] !=(DataTypes.LookupValue)C.CustomerF.TypeRetailer):
- (Expression<Func<SPListItem, bool>>)(x=>x[custTypeFieldId] == (DataTypes.LookupValue)C.CustomerF.TypeRetailer)
- };
- SPQuery dealQuery = new SPQuery
- {
- Query = Camlex.Query().WhereAll(dealsExpr).ToString(),
- ViewFields = C.DetailsF.Order
- };
- SPListItemCollection dealsItems = dealsList.GetItems(dealQuery);
- var dealIds = (from item in dealsItems.Cast<SPListItem>() select item.ID).ToList();
- //Оставить только позиции, пренадлежащие оным сделкам.)
- detailsItems = detailsItems.Where(x => dealIds.Contains(new SPFieldLookupValue((string)x[C.DetailsF.Order]).LookupId)).ToList();
- return detailsItems.ToList();
- }
- }
- public class GetObjectsResponse
- {
- public int StartMonth { get; set; }
- public int FinishMonth { get; set; }
- public IEnumerable<AdsObj> Objects = new List<AdsObj>();
- public string PrevPageInfo { get; set; }
- public string NextPageInfo { get; set; }
- }
- public enum AdsStates
- {
- All = -1,
- Free = 0,
- Reserved = 2,
- Saled = 1
- }
- public class AdsFilter
- {
- public DateTime From { get; set; }
- public DateTime To { get; set; }
- public List<AdsStates> AllowedStates { get; set; }
- public string[] Types { get; set; }
- public int CustId { get; set; }
- public int OwnerId { get; set; }
- public string PageInfo { get; set; }
- public string DetailsPageInfo { get; set; }
- public bool IsSale { get; set; }
- public string AdsObjName { get; set; }
- }
- public class JSONResponce
- {
- public string Alert { get; set; }
- public string Noti { get; set; }
- public string Action { get; set; }
- public string Link { get; set; }
- public string Exception { get; set; }
- public string DealDetailsJson { get; set; }
- public bool IsApprover { get; set; }
- public int SellId { get; set; }
- public override string ToString()
- {
- return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(this);
- }
- public string Json()
- {
- return ToString();
- }
- }
- /// <summary>
- /// Constants
- /// </summary>
- public class C
- {
- /// <summary>
- /// Lists
- /// </summary>
- public class L
- {
- /// <summary>
- /// Продажи объектов
- /// </summary>
- public const string DealsListName = "Продажи объектов";
- /// <summary>
- /// Названия листа деталей продаж объектов
- /// </summary>
- public const string DetailsListName = "Детали продаж объектов";
- public const string AdsObjListName = "Объекты рекламы";
- public const string MountsListName = "Монтаж объектов";
- public const string SalersListName = "Юрлица Топмедиа";
- public const string UridFaceListName = "Юрлица Топмедиа";
- public const string CustomersListName = "Покупатели";
- public const string CapsListName = "Заглушки";
- //public const string OwnersListName = "Собственники объектов рекламы";
- }
- public static class DealsF
- {
- public const string SalerIsOutdoorOwner = "Продавец:Собственник наружки";
- public const string Saler = "Продавец";
- public const string CustType = "Покупатель:Тип покупателя";
- public const string Customer = "Покупатель";
- public const string KomPred = "Коммерческое предложение";
- public const string IsReserve = "Бронь";
- public const string Realization = "Реализация";
- public const string DealType = "Тип сделки";
- public const string IsTrash = "В корзине";
- public const string Discount = "Скидка";
- }
- public static class DetailsF
- {
- public const string Art = "Артикул";
- /// <summary>
- /// Дата
- /// </summary>
- public const string DateFrom = "Дата";
- /// <summary>
- /// Срок
- /// </summary>
- public const string DateTo = "Срок";
- public const string Order = "Заказ";
- /// <summary>
- /// Бронь до
- /// </summary>
- public const string ResPerDate = "Бронь до";
- public const string CostOfSale = "Цена";
- public const string CostOfPeriod = "Цена за период";
- public const string PriceCost = "По прайсу";
- /// <summary>
- /// Дата, когда бронь была поставленна
- /// </summary>
- public const string ResDate = "Бронированно";
- }
- public static class SalersF
- {
- public const string OutdoorOwner = "Собственник наружки";
- }
- public static class CustomerF
- {
- public const string Type = "Тип покупателя";
- public const string TypeRetailer = "Закупщик";
- public const string TypeWhole = "Оптовик";
- public const string TypeSimple = "Розница";
- public const string UrLico = "Юр лицо топмедиа";
- }
- public static class AdsObjsF
- {
- public const string MountSelfPrice = "Себестоимость монтажа";
- public const string Mount = "Монтаж";
- public const string Owner = "Собственник объекта";
- public const string Type = "Тип объекта";
- public const string TypePeretyag = "перетяжка";
- public const string TypeSheet = "щит 3х6";
- public const string TypeBrand = "брандмауэр";
- public const string TypeSuper = "суперсайт";
- public const string Cost = "Цена";
- public const string SelfPrice = "Себестоимость";
- public const string Address = "Адрес размещения";
- }
- public static class MountF
- {
- public const string Position = "Позиция";
- public const string Detail = Position;
- public const string Cost = "Цена";
- public const string Date = "Дата монтажа";
- }
- public static string FromMailAdress = "Outdoor <sharepoint@upsales.ru>";
- public const string WithOutApprove = "Отдел наружной рекламы. Без соглосования";
- /// <summary>
- /// Название группы, которой можно утверждать заказы
- /// </summary>
- public const string TopManGroupName = "Руководство отдела наружной рекламы";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement