public async Task <bool> FindPrepareInfos(FindPrepareInfosInput input)
        {
            var query = this._sapMOrderProcessDispatchPrepareStepRepository.GetAll()
                        .Include(s => s.PrepareInfo)
                        .WhereIf(!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType == SapMOrderProcessDispatchPrepareStepTransTypes.ALL, p => (p.PrepareInfo.Tooling_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus) || p.PrepareInfo.NC_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus)))
                        .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.TL), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL && p.PrepareInfo.Tooling_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus)))
                        .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.NC), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC && p.PrepareInfo.NC_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus)));

            //var query = this._sapMOrderProcessDispatchPrepareRepository.GetAll()
            //   .Include(s => s.PrepareSteps).Where(p => p.Tooling_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus) || p.NC_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus));

            //var list = this._sapMOrderProcessDispatchPrepareStepRepository.GetAll()
            //    .Include(s => s.PrepareInfo)
            //    .WhereIf(!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType != "all", p => p.StepTransactionType == input.PrepareType.ToUpper())
            //    .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.TL), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL && p.PrepareInfo.Tooling_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus)))
            //     .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.NC), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC && p.PrepareInfo.NC_IsPreparedFinished == Convert.ToInt16(input.PrepareStatus)));

            var count = await query.CountAsync();

            // var prepareSteps = await query.OrderBy(p => p.PrepareInfo.)
            //var prepareSteps = await query
            //    .OrderBy(p => p.)
            //    .ThenByDescending(b => b.HandOverBill.BillCodePrefix)
            //    .ThenByDescending(b => b.HandOverBill.BillCodeSerialNumber)
            //    .PageBy(input).ToListAsync();
            return(await Task.FromResult(false));
        }
        public async Task <IPagedResult <PrepareInfoWithStatusOutput> > FindPrepareInfos_NC(FindPrepareInfosInput input)
        {
            short prepareStatus = Convert.ToInt16(input.PrepareStatus);
            var   query         = this._sapMOrderProcessDispatchPrepareStepRepository.GetAll()
                                  .Include(s => s.PrepareInfo)
                                  //.WhereIf(!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType == SapMOrderProcessDispatchPrepareStepTransTypes.ALL, p => ((p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL && p.PrepareInfo.Tooling_IsPreparedFinished == prepareStatus)
                                  //|| (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC && p.PrepareInfo.NC_IsPreparedFinished == prepareStatus)))
                                  .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.TL), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL && p.PrepareInfo.Tooling_IsPreparedFinished == prepareStatus))
                                  .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.NC), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC && p.PrepareInfo.NC_IsPreparedFinished == prepareStatus));
            //var query = this._sapMOrderProcessDispatchPrepareStepRepository.GetAll()
            //    .Include(s => s.PrepareInfo)
            //    .WhereIf((!string.IsNullOrWhiteSpace(input.PrepareType) && input.PrepareType.Trim().ToUpper() == SapMOrderProcessDispatchPrepareStepTransTypes.NC), p => (p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC && p.PrepareInfo.NC_IsPreparedFinished.Value == prepareStatus));


            var count = await query.CountAsync();

            var prepareInfos = await query
                               .Select(p => new
            {
                Id = p.Id,
                DispatchWorKTicketID = p.PrepareInfo.DispatchWorKTicketID,
                StepTransactionType  = p.StepTransactionType,
                StepName             = p.StepName,
                IsPreparedFinished   = p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL ? p.PrepareInfo.Tooling_IsPreparedFinished : (
                    p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC ? p.PrepareInfo.NC_IsPreparedFinished : (short)0),
                StepRequiredDate = p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL ? p.PrepareInfo.Tooling_RequiredDate : (
                    p.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.NC ? p.PrepareInfo.NC_RequiredDate : default(DateTime)),
                CreationTime = p.CreationTime
            }).OrderBy(p => p.StepRequiredDate).PageBy(input).ToListAsync();


            var preparegroup = prepareInfos.GroupBy(p => new SapMOrderProcessDispatchPrepareKey
            {
                DispatchWorKTicketID = p.DispatchWorKTicketID,
                StepStatus           = p.IsPreparedFinished.HasValue ? p.IsPreparedFinished : (short)0,
                StepType             = p.StepTransactionType
            }).Select(p => new
            {
                PrepareInfoKey       = p.Key,
                PrepareStartedValue  = p.Where(ps => ps.StepName == ps.StepTransactionType + " Started").OrderByDescending(ps => ps.CreationTime).FirstOrDefault(),
                PrepareFinishedValue = p.Where(ps => ps.StepName == ps.StepTransactionType + " Finished").OrderByDescending(ps => ps.CreationTime).FirstOrDefault()
                                       //PrepareStepValue = p.Where(ps => ps.StepTransactionType == SapMOrderProcessDispatchPrepareStepTransTypes.TL && ps.IsStepSuccess).OrderByDescending(ps => ps.CreationTime).ToList()
            });

            //var ids = prepareInfos.Select(p => p.PrepareInfo.DispatchWorKTicketID.ToString()).Distinct().ToList();
            var ids    = preparegroup.Select(p => p.PrepareInfoKey.DispatchWorKTicketID.ToString()).Distinct().ToList();
            var orders = await _dmesWorkTicketRepository.FindDispatchedOrdersByDispatchWorkID(new DmesFindDispatchedOrderByTicketInput()
            {
                DispatchWorkIDs = ids
            });

            List <PrepareInfoWithStatusOutput> result = new List <PrepareInfoWithStatusOutput>();

            foreach (var info in preparegroup)
            {
                DmesOrderOutput orderBean = orders.SingleOrDefault(o => o.DispatchWorKTicketID == info.PrepareInfoKey.DispatchWorKTicketID);

                DateTime stepStarted  = (info.PrepareStartedValue == null || info.PrepareStartedValue.Id <= 0) ? default(DateTime) : info.PrepareStartedValue.CreationTime;
                DateTime stepFinished = (info.PrepareFinishedValue == null || info.PrepareFinishedValue.Id <= 0) ? default(DateTime) : info.PrepareFinishedValue.CreationTime;
                PrepareInfoWithStatusOutput Outbean = new PrepareInfoWithStatusOutput()
                {
                    OrderNumber         = orderBean.OrderNumber,
                    RoutingNumber       = orderBean.RoutingNumber,
                    MaterialNumber      = orderBean.MaterialNumber,
                    MaterialDescription = orderBean.MaterialDescription,
                    ActualWorkID        = orderBean.ActualWorkID,
                    ActualWorkName      = orderBean.ActualWorkName,


                    DispatchWorKTicketID = info.PrepareInfoKey.DispatchWorKTicketID,
                    StepTransactionType  = info.PrepareInfoKey.StepType,
                    StepStatus           = info.PrepareInfoKey.StepStatus,
                    StepStatusStr        = Enum.GetName(typeof(SapMOrderProcessDispatchPrepareStepStatus), info.PrepareInfoKey.StepStatus),

                    StepStartedDate  = stepStarted == default(DateTime) ? "" : stepStarted.ToString("yyyy-MM-dd HH:mm:ss"),
                    StepRequiredDate = stepStarted == default(DateTime) ? "" : stepStarted.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"),

                    StepFinishedDate = stepFinished == DateTime.MinValue ? "" : stepFinished.ToString("yyyy-MM-dd HH:mm:ss"),

                    StepDelayed = stepFinished > stepStarted.AddDays(1) ? "超期" : ((stepFinished == DateTime.MinValue && stepStarted.AddDays(1) <= DateTime.Now) ? "超期" : "")
                };

                result.Add(Outbean);
            }

            return(new PagedResultDto <PrepareInfoWithStatusOutput>(count, result));
        }