//
        public ReceiptBillPageViewModel(INavigationService navigationService,
                                        IProductService productService,
                                        ITerminalService terminalService,
                                        IUserService userService,
                                        IWareHousesService wareHousesService,
                                        IAccountingService accountingService,
                                        IReceiptCashService receiptCashService,
                                        IDialogService dialogService

                                        ) : base(navigationService, productService, terminalService, userService, wareHousesService, accountingService, dialogService)
        {
            Title = "收款单";

            _receiptCashService = receiptCashService;

            InitBill();

            //验证
            var valid_IsVieweBill    = this.ValidationRule(x => x.Bill.AuditedStatus, _isBool, "已审核单据不能操作");
            var valid_TerminalId     = this.ValidationRule(x => x.Bill.TerminalId, _isZero, "客户未指定");
            var valid_BusinessUserId = this.ValidationRule(x => x.Bill.BusinessUserId, _isZero, "业务员未指定");
            var valid_ProductCount   = this.ValidationRule(x => x.Bill.Items.Count, _isZero, "无收款单据信息");
            var valid_SelectesCount  = this.ValidationRule(x => x.Bill.CashReceiptBillAccountings.Count, _isZero, "请选择支付方式");

            //更改时间
            this.WhenAnyValue(x => x.Filter.EndTime).Subscribe(x =>
            {
                if (x.HasValue)
                {
                    ClearIcon = "fas-times-circle";
                }
                else
                {
                    ClearIcon = "fas-clock";
                    ((ICommand)Load)?.Execute(null);
                }
            }).DisposeWith(DeactivateWith);

            //绑定数据
            this.Load = BillItemsLoader.Load(async() =>
            {
                if (Bill.Id == 0)
                {
                    var inits = await _receiptCashService.GetInitDataAsync(calToken: new System.Threading.CancellationToken());
                    if (inits != null)
                    {
                        Bill.CashReceiptBillAccountings = inits.CashReceiptBillAccountings;
                        if (this.PaymentMethods.Selectes.Count == 0)
                        {
                            var defaultPaymentMethods = inits.CashReceiptBillAccountings.Select(a =>
                            {
                                return(new AccountingModel()
                                {
                                    Name = a.Name,
                                    AccountingOptionId = a.AccountingOptionId,
                                    CollectionAmount = 0,
                                    AccountCodeTypeId = a.AccountCodeTypeId,
                                    Number = a.AccountCodeTypeId
                                });
                            }).ToList();
                            this.PaymentMethods.Selectes = new ObservableCollection <AccountingModel>(defaultPaymentMethods);;
                        }
                    }

                    var pending = new List <CashReceiptItemModel>();

                    int?terminalId     = Filter.TerminalId;
                    int?businessUserId = Filter.BusinessUserId;

                    string billNumber  = "";
                    string remark      = "";
                    DateTime?startTime = Filter.StartTime;
                    DateTime?endTime   = Filter.EndTime;
                    int pageIndex      = 0;
                    int pageSize       = 20;

                    if (terminalId.HasValue && terminalId.Value != 0)
                    {
                        var result = await _receiptCashService.GetOwecashBillsAsync(Settings.UserId, terminalId, null, billNumber, remark, startTime, endTime, pageIndex, pageSize, calToken: new System.Threading.CancellationToken());

                        if (result != null)
                        {
                            var curBills = result?.Where(s => s?.BillTypeId != (int)BillTypeEnum.FinancialIncomeBill).ToList();
                            if (curBills != null && curBills.Count > 0)
                            {
                                foreach (var bill in curBills)
                                {
                                    pending.Add(new CashReceiptItemModel()
                                    {
                                        CashReceiptBillId = 0,
                                        BillId            = bill.BillId,
                                        BillNumber        = bill.BillNumber,
                                        BillTypeId        = bill.BillTypeId,
                                        BillTypeName      = bill.BillTypeName,
                                        BillLink          = bill.BillLink,
                                        MakeBillDate      = bill.MakeBillDate,

                                        //单据金额
                                        Amount = bill.Amount,
                                        //优惠
                                        DiscountAmount = bill.DiscountAmount,
                                        //已收金额
                                        PaymentedAmount = bill.PaymentedAmount,
                                        //欠款金额
                                        ArrearsAmount = bill.ArrearsAmount,

                                        //本次优惠金额
                                        DiscountAmountOnce = 0,
                                        //本次收款金额
                                        ReceivableAmountOnce = 0,
                                        //收款后尚欠金额 = 欠款金额
                                        AmountOwedAfterReceipt = bill.ArrearsAmount,
                                        //应收金额 = 欠款金额
                                        AmountReceivable = bill.ArrearsAmount,
                                        Remark           = bill.Remark,
                                        //预览单据
                                        RedirectCommand = ReactiveCommand.Create <CashReceiptItemModel>(async e =>
                                        {
                                            //销售单
                                            if (e?.BillTypeId == (int)BillTypeEnum.SaleBill)
                                            {
                                                await this.NavigateAsync("SaleBillPage", ("BillId", e.BillId.ToString()));
                                            }
                                            //退货单
                                            else if (e?.BillTypeId == (int)BillTypeEnum.ReturnBill)
                                            {
                                                await this.NavigateAsync("ReturnBillPage", ("BillId", e.BillId.ToString()));
                                            }
                                            //预收款单
                                            else if (e?.BillTypeId == (int)BillTypeEnum.AdvanceReceiptBill)
                                            {
                                                await this.NavigateAsync("AdvanceReceiptBillPage", ("BillId", e.BillId.ToString()));
                                            }
                                            //费用支出
                                            else if (e?.BillTypeId == (int)BillTypeEnum.CostExpenditureBill)
                                            {
                                                await this.NavigateAsync("CostExpenditureBillPage", ("BillId", e.BillId.ToString()));
                                            }
                                            //其它收入
                                            else if (e?.BillTypeId == (int)BillTypeEnum.FinancialIncomeBill)
                                            {
                                                //移动端不支持(财务其它收入)收款
                                            }
                                        })
                                    });
                                }
Beispiel #2
0
        public ReceivablesPageViewModel(INavigationService navigationService,
                                        IReceiptCashService receiptCashService,
                                        IDialogService dialogService,
                                        IProductService productService,
                                        IUserService userService,
                                        ITerminalService terminalService,
                                        IWareHousesService wareHousesService,
                                        IAccountingService accountingService

                                        ) : base(navigationService, productService, terminalService, userService, wareHousesService, accountingService, dialogService)
        {
            Title = "应收款";

            _receiptCashService = receiptCashService;

            //绑定数据
            this.Load = AmountReceivableGroupsLoader.Load(async() =>
            {
                var pending = new List <AmountReceivableGroupModel>();

                try
                {
                    //这里只取选择客户
                    int?terminalId     = Filter.TerminalId;
                    int businessUserId = Filter.BusinessUserId;
                    if (businessUserId == 0)
                    {
                        businessUserId = Settings.UserId;
                    }
                    DateTime?startTime = Filter.StartTime ?? null;
                    DateTime?endTime   = Filter.EndTime ?? null;

                    string billNumber = "";
                    string remark     = "";

                    var result = await _receiptCashService.GetOwecashBillsAsync(
                        businessUserId,
                        terminalId,
                        null,
                        billNumber,
                        remark,
                        startTime,
                        endTime,
                        0,
                        PageSize,
                        this.ForceRefresh,
                        new System.Threading.CancellationToken());

                    if (result != null)
                    {
                        foreach (IGrouping <int, BillSummaryModel> group in result.GroupBy(c => c.CustomerId))
                        {
                            var code = result.FirstOrDefault(c => c.CustomerId == group.Key)?.CustomerPointCode;
                            var name = result.FirstOrDefault(c => c.CustomerId == group.Key)?.CustomerName;
                            if (!string.IsNullOrEmpty(name))
                            {
                                pending.Add(new AmountReceivableGroupModel()
                                {
                                    CustomerId        = group.Key,
                                    CustomerName      = result.FirstOrDefault(c => c.CustomerId == group.Key)?.CustomerName,
                                    CustomerPointCode = code,
                                    Amount            = result.Where(c => c.CustomerId == group.Key)?.Sum(s => s.ArrearsAmount) ?? 0
                                });
                            }
                        }
                    }

                    if (pending.Any())
                    {
                        TotalAmount = pending.Sum(p => p.Amount);
                        BillItems   = new ObservableRangeCollection <AmountReceivableGroupModel>(pending);
                    }
                }
                catch (Exception ex)
                {
                    Crashes.TrackError(ex);
                }

                return(pending);
            });


            //以增量方式加载数据
            this.ItemTresholdReachedCommand = ReactiveCommand.Create(async() =>
            {
                int pageIdex = 0;
                if (BillItems.Count != 0)
                {
                    pageIdex = BillItems.Count / (PageSize == 0 ? 1 : PageSize);
                }

                if (PageCounter < pageIdex)
                {
                    PageCounter = pageIdex;
                    using (var dig = UserDialogs.Instance.Loading("加载中..."))
                    {
                        try
                        {
                            int?terminalId     = Filter.TerminalId;
                            int businessUserId = Filter.BusinessUserId;
                            if (businessUserId == 0)
                            {
                                businessUserId = Settings.UserId;
                            }
                            DateTime?startTime = Filter.StartTime ?? null;
                            DateTime?endTime   = Filter.EndTime ?? null;

                            string billNumber = "";
                            string remark     = "";

                            var items = await _receiptCashService.GetOwecashBillsAsync(
                                businessUserId,
                                terminalId,
                                null,
                                billNumber,
                                remark,
                                startTime,
                                endTime,
                                pageIdex,
                                PageSize,
                                this.ForceRefresh,
                                new System.Threading.CancellationToken());

                            if (items != null)
                            {
                                var pending = new List <AmountReceivableGroupModel>();
                                foreach (IGrouping <int, BillSummaryModel> group in items.GroupBy(c => c.CustomerId))
                                {
                                    var code = items.FirstOrDefault(c => c.CustomerId == group.Key)?.CustomerPointCode;
                                    var name = items.FirstOrDefault(c => c.CustomerId == group.Key)?.CustomerName;
                                    if (!string.IsNullOrEmpty(name))
                                    {
                                        pending.Add(new AmountReceivableGroupModel()
                                        {
                                            CustomerId        = group.Key,
                                            CustomerName      = items.FirstOrDefault(c => c.CustomerId == group.Key)?.CustomerName,
                                            CustomerPointCode = code,
                                            Amount            = items.Where(c => c.CustomerId == group.Key)?.Sum(s => s.ArrearsAmount) ?? 0
                                        });
                                    }
                                }

                                foreach (var p in pending)
                                {
                                    if (BillItems.Where(s => s.CustomerId == p.CustomerId).Count() == 0)
                                    {
                                        BillItems.Add(p);
                                    }
                                }

                                if (pending.Count() == 0 || pending.Count() == BillItems.Count)
                                {
                                    ItemTreshold = -1;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Crashes.TrackError(ex);
                            ItemTreshold = -1;
                        }
                    }
                }
            }, this.WhenAny(x => x.BillItems, x => x.GetValue().Count > 0));


            //选择转向收款单
            this.WhenAnyValue(x => x.Selecter).Throttle(TimeSpan.FromMilliseconds(500))
            .Skip(1)
            .Where(x => x != null)
            .SubOnMainThread(async x =>
            {
                await this.NavigateAsync("ReceiptBillPage", ("Terminaler",
                                                             new TerminalModel()
                {
                    Id = Selecter.CustomerId,
                    Name = Selecter.CustomerName
                }));
                Selecter = null;
            }).DisposeWith(DeactivateWith);

            this.BindBusyCommand(Load);
        }