public override Task <UploadReply> Upload(UploadRequest request, ServerCallContext context)
        {
            UploadReply result = new UploadReply();

            try
            {
                Stream       imageStream   = new MemoryStream(request.File.ToByteArray());
                Image        originalImage = Image.FromStream(imageStream);
                List <Image> images        = ImageFactory.CreateNewSizeImages(originalImage);

                SaveModel saveModel = new SaveModel()
                {
                    Directory     = request.Directory,
                    FileName      = request.FileName,
                    Images        = images,
                    OriginalImage = originalImage
                };

                var saveList = imageCollectionSaver.Save(saveModel);

                result.UploadPath = "upload/" + request.Directory + request.FileName;
            }
            catch (Exception ex)
            {
                result = new UploadReply()
                {
                    ErrorMessage = ex.Message, HasError = true
                };
            }

            return(Task.FromResult(result));
        }
        /// <summary>
        /// 双向流式上传数据包
        /// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        public async IAsyncEnumerable <UploadReply> Upload(IAsyncEnumerable <UploadRequest> stream)
        {
            await foreach (var request in stream)
            {
                Console.WriteLine(request);

                await Task.Delay(TimeSpan.FromSeconds(1));

                var reply = new UploadReply
                {
                    Index = request.Index,
                    //模拟保存失败
                    ArchiveSuccess = (DateTime.Now.Second % 3 < 2),
                };

                yield return(reply);
            }

            Console.WriteLine($"客户端关闭连接");
        }
        public Task <List <UploadReply> > UploadOpeningBills(List <UploadBillDetail> bills, long facilityId, long societyId, DateTime generatedDate)
        {
            var taskResult = Task.Run(async() =>
            {
                using (var context = new DbContext())
                {
                    var result = new List <UploadReply>();

                    foreach (var bill in bills)
                    {
                        var reply = new UploadReply();
                        reply.Id  = bill.SrNo;

                        var sb = new StringBuilder();

                        if (string.IsNullOrEmpty(bill.FlatName))
                        {
                            sb.Append(",FlatName");
                        }

                        if (bill.Amount == 0)
                        {
                            sb.Append(",Amount");
                        }

                        if (sb.Length > 0)
                        {
                            reply.IsSuccess = false;
                            reply.Message   = sb.ToString().Trim(',');
                            result.Add(reply);
                            continue;
                        }

                        var flat = context
                                   .Flats
                                   .FirstOrDefault(f => f.Name.Equals(bill.FlatName, StringComparison.InvariantCultureIgnoreCase) && f.Floor.FacilityId == facilityId);

                        if (flat == null)
                        {
                            reply.IsSuccess = false;
                            reply.Message   = "Flat not found";
                            result.Add(reply);
                            continue;
                        }

                        var flatowner = await _flatOwnerRepository.CurrentOwner(flat.Id);
                        if (flatowner == null)
                        {
                            reply.IsSuccess = false;
                            reply.Message   = "Flat owner not found";
                            result.Add(reply);
                            continue;
                        }
                        //---------------------------------------------------------------------------------//

                        var billinglines = new List <BillingLine>();

                        var opening        = new BillingLine();
                        opening.Definition = "Opening";
                        opening.Amount     = bill.Amount;
                        opening.BaseAmount = bill.Amount;
                        opening.OnArea     = null;

                        billinglines.Add(opening);


                        //get pending amount
                        decimal pendingAmount = await GetPendingAmountForFlat(flat.Id);

                        if (pendingAmount != 0)
                        {
                            var arrears        = new BillingLine();
                            arrears.Definition = "Arrears";
                            arrears.Amount     = pendingAmount;
                            arrears.BaseAmount = pendingAmount;
                            arrears.OnArea     = null;

                            billinglines.Add(arrears);
                        }


                        //---------------------------------------------------------------------------------//

                        var max = context.Bills.Count(b => b.SocietyId == societyId) > 0 ?
                                  context.Bills.Where(b => b.SocietyId == societyId).Max(b => b.ReceiptNo) :
                                  0;

                        var item           = new Bill();
                        item.Name          = flatowner.Name;
                        item.ReceiptNo     = max + 1;
                        item.Date          = generatedDate;
                        item.Amount        = billinglines.Sum(b => b.Amount);
                        item.Month         = generatedDate.Month;
                        item.Year          = generatedDate.Year;
                        item.FlatId        = flat.Id;
                        item.SocietyId     = societyId;
                        item.BillingLines  = billinglines;
                        item.Pending       = pendingAmount;
                        item.MonthlyAmount = item.Amount - item.Pending;
                        item.BillType      = (byte)EnBillType.Opening;
                        item.Note          = bill.Note;

                        //add bill
                        context.Bills.Add(item);
                        context.SaveChanges();

                        reply.IsSuccess = true;
                        reply.Message   = "Done";
                        result.Add(reply);
                    }
                    return(result);
                }
            });

            return(taskResult);
        }