示例#1
0
        /// <summary>
        /// Формирования объекта отображения информации об отправках (по накладной за отчётный месяц)
        /// </summary>
        /// <param name="operationCategory">filter on category</param>
        /// <param name="chooseDate">Work period</param>
        /// <param name="page">Current page</param>
        /// <param name="pageSize">Count item on page</param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        public IEnumerable <ShippingDTO> ShippingsViews(EnumOperationType operationCategory, DateTime chooseDate, int page, int pageSize, out short recordCount)
        {
            //exit when empty result (decrease count server query)
            if (this._engage.GetCountRows <krt_Guild18>(x => x.reportPeriod == chooseDate) == 0)
            {
                recordCount = 0;
                return(new List <ShippingDTO>());
            }
            //linq to object(etsng) copy in memory (because EF don't support two dbcontext work together, resolve through expression tree maybe)
            var wrkData = this._engage.GetTable <krt_Guild18, int>(x => x.reportPeriod == chooseDate).ToList();

            //dispatch
            var kg18Src = wrkData.GroupBy(x => new { x.reportPeriod, x.idDeliviryNote, x.warehouse })
                          .OrderBy(x => x.Key.idDeliviryNote).ToList();

            /*linqkit*/
            //v_otpr
            var votprPredicate = PredicateBuilder.New <v_otpr>(false).DefaultExpression.And(x => ((x.oper == (short)operationCategory) || operationCategory == EnumOperationType.All) && x.state == 32 && (new[] { "3494", "349402" }.Contains(x.cod_kl_otpr) || new[] { "3494", "349402" }.Contains(x.cod_klient_pol)));

            votprPredicate = kg18Src.Select(x => x.Key.idDeliviryNote).Aggregate(votprPredicate, (current, value) => current.Or(e => e.id == value && ((e.oper == (short)operationCategory) || operationCategory == EnumOperationType.All))).Expand();
            var voSrc = this._engage.GetTable <v_otpr, int>(votprPredicate).ToList();

            recordCount = (short)voSrc.Count();
            //v_o_v
            //var vovPredicate = PredicateBuilder.New<v_o_v>(false).DefaultExpression;
            var vovPredicate = voSrc.Select(x => x.id).Aggregate(PredicateBuilder.New <v_o_v>(false).DefaultExpression, (current, value) => current.Or(v => v.id_otpr == value)).Expand();
            var vovSrc       = this._engage.GetTable <v_o_v, int>(vovPredicate).ToList();
            //etsng
            //var etsngPredicate = PredicateBuilder.New<etsng>(false);
            var etsngPredicate = voSrc.Select(x => x.cod_tvk_etsng).Aggregate(PredicateBuilder.New <Etsng>(false).DefaultExpression, (current, value) => current.Or(v => v.Etsng1 == value)).Expand();
            var etsngSrc       = this._engage.GetTable <Etsng, int>(etsngPredicate).ToList();

            var result = (from kg in kg18Src join vo in voSrc on kg.Key.idDeliviryNote equals vo.id into g1
                          from item in g1.DefaultIfEmpty() where (item != null && item.oper == (short)operationCategory) || operationCategory == EnumOperationType.All
                          join e in etsngSrc on item == null ? "" : item.cod_tvk_etsng equals e.Etsng1 into g2
                          from item2 in g2.DefaultIfEmpty()
                          select new ShippingDTO()
            {
                VOtpr = item,
                Vovs = vovSrc.Where(x => (x != null) && x.id_otpr == (item == null ? 0 : item.id)),
                VPams = this._engage.GetTable <v_pam, int>(PredicateBuilder.New <v_pam>().DefaultExpression.And(x => x.state == 32 && new[] { "3494", "349402" }.Contains(x.kodkl))
                                                           .And(PredicateExtensions.InnerContainsPredicate <v_pam, int>("id_ved",
                                                                                                                        wrkData.Where(x => x.reportPeriod == chooseDate && x.idDeliviryNote == (item != null ? item.id : 0) && x.type_doc == 2).Select(y => y.idSrcDocument != null ? (int)y.idSrcDocument : 0))).Expand())
                        .ToList(),
                VAkts = this._engage.GetTable <v_akt, int>(PredicateBuilder.New <v_akt>().DefaultExpression.And(x => new[] { "3494", "349402" }.Contains(x.kodkl) && x.state == 32)
                                                           .And(PredicateExtensions.InnerContainsPredicate <v_akt, int>("Id",
                                                                                                                        wrkData.Where(x => x.reportPeriod == chooseDate && x.idDeliviryNote == (item != null ? item.id : 0) && x.type_doc == 3).Select(y => y.idSrcDocument != null ? (int)y.idSrcDocument : 0))).Expand())
                        .ToList(),
                VKarts = this._engage.GetTable <v_kart, int>(PredicateBuilder.New <v_kart>().DefaultExpression.And(x => new[] { "3494", "349402" }.Contains(x.cod_pl))
                                                             .And(PredicateExtensions.InnerContainsPredicate <v_kart, int>("Id",
                                                                                                                           wrkData.Where(z => z.reportPeriod == chooseDate && z.idDeliviryNote == (item != null ? item.id : (int?)null)).Select(y => y.idCard != null ? (int)y.idCard : 0))).Expand())
                         .ToList(),
                KNaftan = this._engage.GetTable <krt_Naftan, int>(PredicateExtensions.InnerContainsPredicate <krt_Naftan, long>("keykrt",
                                                                                                                                wrkData.Where(z => z.reportPeriod == chooseDate && z.idDeliviryNote == (item != null ? item.id : (int?)null)).Select(y => y.idScroll != null ? (long)y.idScroll : 0)))
                          .ToList(),
                Etsng = item2,
                Guild18 = new krt_Guild18 {
                    reportPeriod = kg.Key.reportPeriod,
                    idDeliviryNote = kg.Key.idDeliviryNote,
                    warehouse = kg.Key.warehouse
                }
            }).Skip(pageSize * (page - 1)).Take(pageSize).OrderByDescending(x => x.VOtpr != null ? x.VOtpr.n_otpr : x.Guild18.idDeliviryNote.ToString()).ToList();

            return(result);
        }
示例#2
0
        /// <summary>
        /// Получение данных со стороны  БД САПОД (используется для предварительного просмотра текущей документации по накладным)
        /// </summary>
        /// <param name="reportPeriod"></param>
        /// <param name="preview"></param>
        /// <param name="shiftPage"></param>
        /// <returns></returns>
        public bool PackDocuments(DateTime reportPeriod, IList <ShippingInfoLineDTO> preview, byte shiftPage = 3)
        {
            var startDate = reportPeriod.AddDays(-shiftPage);
            var endDate   = reportPeriod.AddMonths(1).AddDays(shiftPage);

            try {
                //type_doc 1 => one transaction (one request per one dbcontext)
                List <krt_Guild18> result = (from item in preview join vn in this._engage.GetTable <v_nach, int>(PredicateBuilder.New <v_nach>().DefaultExpression
                                                                                                                 .And(x => x.type_doc == 1 && new[] { "3494", "349402" }.Contains(x.cod_kl))
                                                                                                                 .And(PredicateExtensions.InnerContainsPredicate <v_nach, int?>("id_otpr", preview.Select(x => (int?)x.Shipping.id))).Expand())
                                             on item.Shipping.id equals vn.id_otpr
                                             select new krt_Guild18()
                {
                    reportPeriod = reportPeriod,
                    warehouse = item.Warehouse,
                    idDeliviryNote = item.Shipping.id,
                    type_doc = 1, idSrcDocument = item.Shipping.id,
                    code = Convert.ToInt32(vn.cod_sbor.Split(new[] { '.', ',' })[0]),
                    sum = (decimal)(vn.summa + vn.nds),
                    rateVAT = Math.Round((decimal)(vn.nds / vn.summa), 2),
                    codeType = new[] { 166, 173, 300, 301, 344 }.Contains(Convert.ToInt32(vn.cod_sbor.Split(new[] { '.', ',' })[0])),
                    idCard = vn.id_kart,
                    idScroll = this._engage.GetGroup <krt_Naftan_orc_sapod, long>(x => x.keykrt, x => x.id_kart == vn.id_kart).Select(y => y.First().keykrt).FirstOrDefault()
                }).ToList();

                foreach (var dispatch in preview)
                {
                    var shNumbers = dispatch.WagonsNumbers.Select(x => x.n_vag).ToList();
                    //type_doc 2 =>one transaction (one request per one dbcontext) (type 2 and type_doc 4 (065))
                    //in memory because not all method support entity to sql => more easy do it in memory
                    using (this._engage.Uow = new UnitOfWork()) {
                        result.AddRange((from vpv in this._engage.Uow.GetRepository <v_pam_vag>().GetAll(x => shNumbers.Contains(x.nomvag), false)
                                         join vp in this._engage.Uow.GetRepository <v_pam>().GetAll(x => x.state == 32 && new[] { "3494", "349402" }.Contains(x.kodkl) && x.dved > startDate && x.dved < endDate, false) on vpv.id_ved equals vp.id_ved
                                         join vn in this._engage.Uow.GetRepository <v_nach>().GetAll(x => x.type_doc == 2 && new[] { "3494", "349402" }.Contains(x.cod_kl), false)
                                         on vp.id_kart equals vn.id_kart
                                         select new { vp.id_ved, vn.cod_sbor, vn.summa, vn.nds, vn.id_kart }).Distinct().ToList()
                                        .Select(x => new krt_Guild18 {
                            reportPeriod   = reportPeriod,
                            warehouse      = dispatch.Warehouse,
                            idDeliviryNote = dispatch.Shipping.id,
                            type_doc       = 2, idSrcDocument = x.id_ved,
                            code           = Convert.ToInt32(x.cod_sbor.Split(new[] { '.', ',' })[0]),
                            sum            = (decimal)(x.summa + x.nds),
                            idCard         = x.id_kart, rateVAT = Math.Round((decimal)(x.nds / x.summa), 2),
                            codeType       = new[] { "166", "173", "300", "301", "344" }.Contains(x.cod_sbor.Split(new[] { '.', ',' })[0]),
                            idScroll       = this._engage.GetGroup <krt_Naftan_orc_sapod, long>(y => y.keykrt, z => z.id_kart == x.id_kart).Select(y => y.First().keykrt).FirstOrDefault()
                        }));
                    }
                    //065
                    using (this._engage.Uow = new UnitOfWork()) {
                        result.AddRange((from vpv in this._engage.Uow.GetRepository <v_pam_vag>().GetAll(x => shNumbers.Contains(x.nomvag), false) join vn in this._engage.Uow.GetRepository <v_nach>()
                                         .GetAll(x => x.type_doc == 4 && x.cod_sbor == "065" && new[] { "3494", "349402" }.Contains(x.cod_kl) && x.date_raskr > startDate && x.date_raskr < endDate, false) on
                                         new { p1 = vpv.d_pod, p2 = vpv.d_ub } equals new { p1 = vn.date_raskr, p2 = vn.date_raskr }
                                         select new { vpv.id_ved, vn.cod_sbor, vn.summa, vn.nds, vn.id_kart }).Distinct().ToList()
                                        .Select(x =>
                                                new krt_Guild18 {
                            reportPeriod   = reportPeriod,
                            warehouse      = dispatch.Warehouse,
                            idDeliviryNote = dispatch.Shipping.id,
                            type_doc       = 4, idSrcDocument = x.id_kart,
                            code           = Convert.ToInt32(x.cod_sbor.Split(new[] { '.', ',' })[0]),
                            sum            = (decimal)(x.summa + x.nds),
                            idCard         = x.id_kart, rateVAT = Math.Round((decimal)(x.nds / x.summa), 2),
                            codeType       = new[] { "166", "173", "300", "301", "344" }.Contains(x.cod_sbor.Split(new[] { '.', ',' })[0]),
                            idScroll       = this._engage.GetGroup <krt_Naftan_orc_sapod, long>(y => y.keykrt, z => z.id_kart == x.id_kart).Select(y => y.First().keykrt).FirstOrDefault()
                        }));
                    }
                    ////type_doc 3 =>one transaction (one request per one dbcontext)
                    using (this._engage.Uow = new UnitOfWork()) {
                        result.AddRange((from vav in this._engage.Uow.GetRepository <v_akt_vag>().GetAll(x => shNumbers.Contains(x.nomvag), false)
                                         join va in this._engage.Uow.GetRepository <v_akt>().GetAll(x => x.state == 32 && new[] { "3494", "349402" }.Contains(x.kodkl) && x.dakt > startDate && x.dakt < endDate, false) on vav.id_akt equals va.id
                                         join vn in this._engage.Uow.GetRepository <v_nach>().GetAll(x => x.type_doc == 3 && new[] { "3494", "349402" }.Contains(x.cod_kl), false)
                                         on va.id_kart equals vn.id_kart
                                         select new { va.id, vn.cod_sbor, vn.summa, vn.nds, vn.id_kart }).Distinct().ToList()
                                        .Select(x =>
                                                new krt_Guild18 {
                            reportPeriod   = reportPeriod,
                            warehouse      = dispatch.Warehouse,
                            idDeliviryNote = dispatch.Shipping.id,
                            type_doc       = 3, idSrcDocument = x.id,
                            code           = Convert.ToInt32(x.cod_sbor.Split(new[] { '.', ',' })[0]),
                            sum            = (decimal)(x.summa + x.nds),
                            idCard         = x.id_kart,
                            rateVAT        = Math.Round((decimal)(x.nds / x.summa), 2),
                            codeType       = new[] { "166", "173", "300", "301", "344" }.Contains(x.cod_sbor.Split(new[] { '.', ',' })[0]),
                            idScroll       = this._engage.GetGroup <krt_Naftan_orc_sapod, long>(y => y.keykrt, z => z.id_kart == x.id_kart).Select(y => y.First().keykrt).FirstOrDefault()
                        }));
                    }
                    //luggage (type_doc 0 or 4)
                    result.AddRange(this._engage.GetTable <krt_Naftan_orc_sapod, long>(x => new[] { 611, 629, 125 }.Contains(x.vidsbr) && x.dt.Month == reportPeriod.Month && x.dt.Year == reportPeriod.Year).ToList()
                                    .Select(x => new krt_Guild18 {
                        reportPeriod  = reportPeriod,
                        type_doc      = x.tdoc,
                        idSrcDocument = (int)x.id_kart, code = x.vidsbr,
                        sum           = x.sm, rateVAT = Math.Round((decimal)(x.nds / x.sm_no_nds), 2),
                        codeType      = new[] { 166, 173, 300, 301, 344 }.Contains(x.vidsbr),
                        idCard        = (int)x.id_kart, idScroll = x.keykrt
                    }));
                }
            } catch (Exception) {
                return(false);
            }
            return(true);
        }