Example #1
0
        public ResultModel Confirm(UserModel user, int payApplyId)
        {
            ResultModel result = new ResultModel();

            try
            {
                PayApplyDAL payApplyDAL = new PayApplyDAL();
                ApplyDAL applyDAL = new ApplyDAL();
                PaymentDAL paymentDAL = new PaymentDAL();
                StockPayApplyDAL payApplyStockDAL = new StockPayApplyDAL();
                ContractPayApplyDAL payApplyContractDAL = new ContractPayApplyDAL();
                PaymentStockDetailDAL paymentStockDetailDAL = new PaymentStockDetailDAL();

                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
                {
                    //验证付款申请
                    result = payApplyDAL.Get(user, payApplyId);
                    if (result.ResultStatus != 0)
                        return result;

                    PayApply payApply = result.ReturnValue as PayApply;
                    if (payApply == null || payApply.PayApplyId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "付款申请不存在";
                        return result;
                    }

                    //验证主申请
                    result = applyDAL.Get(user, payApply.ApplyId);
                    if (result.ResultStatus != 0)
                        return result;

                    Apply apply = result.ReturnValue as Apply;
                    if (apply == null || apply.ApplyId <= 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "主申请不存在";
                        return result;
                    }

                    //验证当前付款申请下是否有已录入至已生效状态下的关联付款
                    //如果存在,则不能进行执行完成确认
                    result = paymentDAL.GetCountByPayApplyId(user, payApply.PayApplyId);
                    if (result.ResultStatus != 0)
                        return result;

                    if (result == null || result.AffectCount > 0)
                    {
                        result.ResultStatus = -1;
                        result.Message = "付款申请存在未完成的关联付款,不能进行执行完成确认";
                        return result;
                    }

                    //验证当前付款申请的申请金额与已执行完成的关联付款的付款金额是否相等
                    //如果不相等则不能进行执行完成确认
                    result = paymentDAL.Load(user, payApply.PayApplyId);
                    if (result.ResultStatus != 0)
                        return result;

                    List<Payment> payments = result.ReturnValue as List<Payment>;
                    if (payments == null)
                    {
                        result.ResultStatus = -1;
                        result.Message = "获取关联付款失败";
                        return result;
                    }

                    decimal sumPayBala = payments.Sum(temp => temp.PayBala);
                    if (sumPayBala != payApply.ApplyBala)
                    {
                        result.ResultStatus = -1;
                        result.Message = "付款申请金额与付款执行金额不相等,不能进行付款申请执行完成确认";
                        return result;
                    }

                    //验证库存付款申请明细的申请金额与付款执行的付款金额是否相等
                    //如果不相等则不能进行执行完成确认
                    if (payApply.PayApplySource == (int)FundsStyleEnum.ContractPayApply)
                    {
                        //获取付款申请下合约申请明细
                        result = payApplyContractDAL.GetByPayApplyId(user, payApply.PayApplyId);
                        if (result.ResultStatus != 0)
                            return result;
                        ContractPayApply payApplyContract = result.ReturnValue as ContractPayApply;
                        if (payApplyContract == null || payApplyContract.RefId <= 0)
                        {
                            result.ResultStatus = -1;
                            result.Message = "获取明细失败";
                            return result;
                        }

                        //完成明细
                        //result = payApplyContractDAL.Confirm(user, payApplyContract);
                        //if (result.ResultStatus != 0)
                        //    return result;
                    }
                    else if (payApply.PayApplySource == (int)FundsStyleEnum.StockPayApply)
                    {
                        //获取付款申请下库存申请明细

                        result = payApplyStockDAL.Load(user, payApply.PayApplyId);
                        if (result.ResultStatus != 0)
                            return result;

                        List<StockPayApply> payApplyStocks = result.ReturnValue as List<StockPayApply>;
                        if (payApplyStocks == null)
                        {
                            result.ResultStatus = -1;
                            result.Message = "获取付款申请库存明细失败";
                            return result;
                        }

                        foreach (StockPayApply payApplyStock in payApplyStocks)
                        {
                            //获取付款申请库存明细关联的付款库存明细
                            result = paymentStockDetailDAL.LoadByStockPayApplyId(user, payApplyStock.RefId);
                            if (result.ResultStatus != 0)
                                return result;

                            List<PaymentStockDetail> details = result.ReturnValue as List<PaymentStockDetail>;

                            decimal sumStockPayBala = details.Sum(temp => temp.PayBala);

                            if (sumStockPayBala != payApplyStock.ApplyBala)
                            {
                                result.ResultStatus = -1;
                                result.Message = "付款申请存在未付完的金额,不能进行执行确认完成";
                                return result;
                            }

                            //明细完成
                            result = payApplyStockDAL.Confirm(user, payApplyStock);
                            if (result.ResultStatus != 0)
                                return result;
                        }
                    }

                    //付款申请完成确认
                    //因付款执行不进行部分关闭,因此不存在部分完成状态
                    result = applyDAL.Confirm(user, apply);
                    if (result.ResultStatus != 0)
                        return result;

                    scope.Complete();
                }
            }
            catch (Exception ex)
            {
                result.ResultStatus = -1;
                result.Message = ex.Message;
            }

            return result;
        }