Exemple #1
0
        /// <summary>
        /// 创建NetPay
        /// </summary>
        /// <param name="netpayEntity">网上支付实体</param>
        /// <param name="refundEntity">退款实体</param>
        /// <param name="isForceCheck">是否强制核收,如果是强制核收,refundEntity必须要有值</param>
        /// <returns>创建好的netpay实体</returns>
        public virtual NetPayInfo Create(NetPayInfo netpayEntity, SOIncomeRefundInfo refundEntity, bool isForceCheck)
        {
            SOBaseInfo soBaseInfo = ExternalDomainBroker.GetSOBaseInfo(netpayEntity.SOSysNo.Value);

            //创建前预检查
            PreCheckForCreate(netpayEntity, refundEntity, soBaseInfo, isForceCheck);

            TransactionOptions options = new TransactionOptions();

            options.IsolationLevel = IsolationLevel.ReadCommitted;
            options.Timeout        = TimeSpan.FromMinutes(2);
            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, options))
            {
                //Step 1:写入退款信息
                bool isOverpay = netpayEntity.PayAmount > soBaseInfo.ReceivableAmount;
                if (isForceCheck && isOverpay)
                {
                    refundEntity.CompanyCode = soBaseInfo.CompanyCode;
                    CreateRefundInfoForForceCheck(netpayEntity, refundEntity);
                }

                //Step 2:写入网上支付信息
                netpayEntity.Status        = NetPayStatus.Origin;
                netpayEntity.ExternalKey   = m_NetpayDA.GetExternalKeyBySOSysNo(netpayEntity.SOSysNo.Value);
                netpayEntity.MasterSoSysNo = soBaseInfo.SOSplitMaster;
                netpayEntity.CompanyCode   = soBaseInfo.CompanyCode;
                if (string.IsNullOrEmpty(netpayEntity.Note))
                {
                    netpayEntity.Note = "add by newegg employees.";
                }
                netpayEntity = m_NetpayDA.Create(netpayEntity);

                //如果生成netpay记录的订单有母单,则更新netpay的母单信息
                if (soBaseInfo.SOSplitMaster.HasValue && soBaseInfo.SOSplitMaster.Value > 0)
                {
                    var masterSO = ExternalDomainBroker.GetSOBaseInfo(soBaseInfo.SOSplitMaster.Value);
                    m_NetpayDA.UpdateMasterSOAmt(masterSO);
                }

                //发送创建netpay消息
                EventPublisher.Publish(new CreateNetpayMessage()
                {
                    NetpaySysNo      = netpayEntity.SysNo.Value,
                    CurrentUserSysNo = ServiceContext.Current.UserSysNo
                });

                ts.Complete();
            }

            //记录业务Log
            ObjectFactory <ICommonBizInteract> .Instance.CreateOperationLog(
                GetMessageString("NetPay_Log_Create", ServiceContext.Current.UserSysNo, netpayEntity.SysNo)
                , ECCentral.BizEntity.Common.BizLogType.Finance_NetPay_AddVerified
                , netpayEntity.SysNo.Value
                , netpayEntity.CompanyCode);

            return(netpayEntity);
        }
        /// <summary>
        /// 团购Job调用,用于创建AO单
        /// </summary>
        /// <param name="soSysNo">订单系统编号</param>
        /// <param name="refundPayType">退款类型</param>
        /// <param name="note">退款备注</param>
        /// <param name="refundReason">退款原因系统编号,编号来自OverseaServiceManagement.dbo.refundReason</param>
        public virtual void CreateAOForJob(int soSysNo, RefundPayType refundPayType, string note, int? refundReason)
        {
            //0.验证
            SOBaseInfo soInfo = ExternalDomainBroker.GetSOBaseInfo(soSysNo);
            if (soInfo == null)
            {
                ThrowBizException("SOIncomeRefund_SONotFound", soSysNo);
            }
            if (soInfo.Status != SOStatus.Origin && soInfo.Status != SOStatus.WaitingOutStock)
            {   //不为Origin,WaitingOutStock 状态
                ThrowBizException("SOIncomeRefund_CreateAOForGroupJob_SOStatusInvalid", soSysNo);
            }

            var validSOIncome = ObjectFactory<SOIncomeProcessor>.Instance.GetValid(soSysNo, SOIncomeOrderType.SO);
            if (validSOIncome == null)
            {
                ThrowBizException("SOIncomeRefund_CreateAOForGroupJob_ValidSOIncomeNotFound", soSysNo);
            }

            //1.Set data
            //CRL18174:团购订单退款调整,团购订单退款需视不同的支付方式,采用不同的退款类型
            //如果团购订单的退款类型为空,则默认为“退入余额帐户”方式
            //如果退款方式为“网关直接退款",则需要填写“银行名称”
            string bankName = refundPayType == RefundPayType.NetWorkRefund ? ExternalDomainBroker.GetPayType(soInfo.PayTypeSysNo.Value).PayTypeName : "";

            SOIncomeRefundInfo soIncomeRefund = new SOIncomeRefundInfo
            {
                OrderSysNo = soSysNo,
                SOSysNo = soSysNo,
                OrderType = RefundOrderType.AO,
                Status = RefundStatus.Origin,
                Note = note,
                RefundPayType = refundPayType,
                RefundReason = refundReason,
                BankName = bankName
            };
            soIncomeRefund.CompanyCode = soInfo.CompanyCode;
            //AO退 除了礼品卡的全部金额,包括积分、余额、现金
            decimal giftCardPayAmt = validSOIncome.GiftCardPayAmt ?? 0m;
            soIncomeRefund.RefundCashAmt = validSOIncome.OrderAmt - giftCardPayAmt;
            soIncomeRefund.RefundGiftCard = giftCardPayAmt;
            soIncomeRefund.RefundPoint = 0;

            //Negative SOIncome
            validSOIncome.CompanyCode = soInfo.CompanyCode;
            validSOIncome.OrderType = SOIncomeOrderType.AO;
            validSOIncome.OrderAmt = -validSOIncome.OrderAmt;
            validSOIncome.PointPay = -validSOIncome.PointPay;
            validSOIncome.GiftCardPayAmt = -validSOIncome.GiftCardPayAmt;
            validSOIncome.IncomeAmt = -validSOIncome.IncomeAmt;

            PreCheckForCreateAOForJob(soIncomeRefund);

            ObjectFactory<SOIncomeProcessor>.Instance.Create(validSOIncome);

            ObjectFactory<ISOIncomeRefundDA>.Instance.Create(soIncomeRefund);
        }
Exemple #3
0
        /// <summary>
        /// 第三方平台订单审核RMA物流拒收
        /// </summary>
        /// <param name="entity"></param>
        protected override void AuditAutoRMAForThirdSO(BizEntity.Invoice.SOIncomeRefundInfo entity)
        {
            base.AuditAutoRMAForThirdSO(entity);

            //中蛋逻辑:如果是淘宝订单,则将状态更新为已审核状态。
            var soBaseInfo = ExternalDomainBroker.GetSOBaseInfo(entity.SOSysNo.Value);

            if (soBaseInfo != null && soBaseInfo.SpecialSOType == ECCentral.BizEntity.SO.SpecialSOType.TaoBao)
            {
                entity.Status = RefundStatus.Audit;
            }
        }
Exemple #4
0
        /// <summary>
        /// 创建电汇邮局付款记录信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public virtual PostPayInfo Create(PostPayInfo postpayEntity, SOIncomeRefundInfo refundEntity, bool isForceCheck)
        {
            var soBaseInfo = ExternalDomainBroker.GetSOBaseInfo(postpayEntity.SOSysNo.Value);

            PreCheckForCreate(postpayEntity, refundEntity, soBaseInfo, isForceCheck);

            SOIncomeInfo soIncomeInfo;

            TransactionOptions option = new TransactionOptions();

            option.IsolationLevel = IsolationLevel.ReadCommitted;
            option.Timeout        = TransactionManager.DefaultTimeout;
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, option))
            {
                //Step1:添加收款数据
                soIncomeInfo = CreateSOIncomeInfo(postpayEntity, soBaseInfo);

                bool isOverpay = postpayEntity.PayAmount > soBaseInfo.ReceivableAmount;
                if (isOverpay && isForceCheck)
                {
                    //Step2:创建退款数据
                    refundEntity.CompanyCode   = soBaseInfo.CompanyCode;
                    refundEntity.SOIncomeSysNo = soIncomeInfo.SysNo;
                    CreateRefundInfoForForceCheck(postpayEntity, refundEntity);
                }

                //Step3:添加PostPay
                postpayEntity.Status      = PostPayStatus.Yes;
                postpayEntity.Note        = "Insert--Record--Valid";
                postpayEntity.CompanyCode = soBaseInfo.CompanyCode;
                postpayEntity             = m_PostPayDA.Create(postpayEntity);

                var postIncomeConfirm = ObjectFactory <PostIncomeProcessor> .Instance.GetConfirmedListBySOSysNo(postpayEntity.SOSysNo.ToString());

                if (postIncomeConfirm != null && postIncomeConfirm.Count > 0)
                {
                    ObjectFactory <PostIncomeProcessor> .Instance.UpdatePostIncomeConfirmStatus(postIncomeConfirm[0].SysNo.Value, PostIncomeConfirmStatus.Audit);
                }
                scope.Complete();
            }
            //记录操作日志
            ObjectFactory <ICommonBizInteract> .Instance.CreateOperationLog(
                GetMessageString("PostPay_Log_Create", ServiceContext.Current.UserSysNo, postpayEntity.SysNo)
                , BizLogType.Finance_AdvancePay_Check
                , postpayEntity.SysNo.Value
                , postpayEntity.CompanyCode);

            return(postpayEntity);
        }
Exemple #5
0
        protected override void PreCheckForUpdate(SOIncomeRefundInfo entity)
        {
            base.PreCheckForUpdate(entity);

            //如果是“现金退款”,则调用SO服务验证订单的支付类型是不是可以选择“现金退款”
            if (entity.RefundPayType == RefundPayType.CashRefund)
            {
                //只有订单为货到"付款(OZZO奥硕物流)","现金支付","POS机刷卡","宅急送(货到付款)"才可以选择现金退款
                SOBaseInfo soBaseInfo = ExternalDomainBroker.GetSOBaseInfo(entity.SOSysNo.Value);
                if (!CheckPayTypeCanCashRefund(soBaseInfo.PayTypeSysNo.Value))
                {
                    ThrowBizException("SOIncomeRefund_CashRefundNotAllowed");
                }
            }
        }
        protected override void PreCheckForCancelConfirm(BizEntity.Invoice.SOIncomeInfo entity)
        {
            base.PreCheckForCancelConfirm(entity);

            if (entity.OrderType == SOIncomeOrderType.RO)
            {
                var refund     = ExternalDomainBroker.GetRefundBySysNo(entity.OrderSysNo.Value);
                var soBaseInfo = ExternalDomainBroker.GetSOBaseInfo(refund.SOSysNo.Value);

                string taobaoAcc = AppSettingManager.GetSetting("Invoice", "TaobaoAccount");
                if (soBaseInfo.SpecialSOType == ECCentral.BizEntity.SO.SpecialSOType.TaoBao && entity.ConfirmUserSysNo == Convert.ToInt32(taobaoAcc))
                {
                    //throw new BizException("淘宝订单的收款单不能取消确认");
                    ThrowBizException("SOIncome_TaobaoCanntCancelConfirm");
                }
            }
        }
Exemple #7
0
        /// <summary>
        /// 获取已确认订单总的应收金额
        /// </summary>
        /// <param name="confirmedSOSysNo"></param>
        /// <returns></returns>
        private decimal GetTotalAmt(int confirmedSOSysNo)
        {
            decimal totalAmt = 0M;
            var     list     = m_PostPayDA.GetListByConfirmedSOSysNo(confirmedSOSysNo);

            if (list != null && list.Count > 0)
            {
                list.ForEach(p =>
                {
                    var so = ExternalDomainBroker.GetSOBaseInfo(p.SOSysNo.Value);
                    if (so != null)
                    {
                        totalAmt += so.ReceivableAmount;
                    }
                });
            }
            return(totalAmt);
        }
        /// <summary>
        /// 处理电汇邮局收款单
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public virtual void Handle(PostIncomeInfo entity, string confirmedSOSysNoStr)
        {
            PreCheckForHandle(entity, confirmedSOSysNoStr);

            var postIncomeInfo = LoadBySysNo(entity.SysNo.Value);

            if (postIncomeInfo.ConfirmStatus.Value != PostIncomeStatus.Confirmed)
            {
                ThrowBizException("PostIncome_Handle_ConfirmStatusNotMatch");
            }

            //保证下面对ConfirmedSOSysNoList操作时不为NULL
            if (string.IsNullOrEmpty(confirmedSOSysNoStr))
            {
                confirmedSOSysNoStr = string.Empty;
            }
            string[] confirmedSOSysNoList = confirmedSOSysNoStr.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var confirmedSOSysNo in confirmedSOSysNoList)
            {
                //验证订单号是否有效
                var so = ExternalDomainBroker.GetSOBaseInfo(Convert.ToInt32(confirmedSOSysNo));
                if (!ObjectFactory <PostPayProcessor> .Instance.IsBankOrPostPayType(so.PayTypeSysNo.Value))
                {
                    ThrowBizException("PostIncome_NotMatchSOPayTypeSysNo", confirmedSOSysNo);
                }
            }

            List <int> abandonList       = new List <int>();
            var        postIncomeConfirm = postIncomeInfo.ConfirmInfoList;

            postIncomeConfirm.ForEach(p =>
            {
                int idx = confirmedSOSysNoStr.IndexOf(p.ConfirmedSoSysNo.ToString());
                if (idx < 0)
                {
                    if (p.Status == PostIncomeConfirmStatus.Audit)
                    {
                        ThrowBizException("PostIncome_StatusNotMatchAudit", p.ConfirmedSoSysNo);
                    }
                    if (p.Status == PostIncomeConfirmStatus.Related)
                    {
                        abandonList.Add(p.SysNo.Value);
                    }
                }
            });

            List <int>    updateList = new List <int>();
            List <string> errorList  = new List <string>();

            postIncomeConfirm = GetConfirmedListBySOSysNo(string.Join(",", confirmedSOSysNoList));
            postIncomeConfirm.ForEach(p =>
            {
                if (p.Status == PostIncomeConfirmStatus.Audit || (p.Status == PostIncomeConfirmStatus.Related && p.PostIncomeSysNo != entity.SysNo))
                {
                    errorList.Add(p.ConfirmedSoSysNo.ToString());
                }
                else
                {
                    updateList.Add(p.SysNo.Value);
                }
            });

            if (errorList.Count > 0)
            {
                ThrowBizException("PostIncome_StatusNotMatchRelated", string.Join(".", errorList.ToArray()));
            }

            List <PostIncomeConfirmInfo> insertEntityList = new List <PostIncomeConfirmInfo>();

            string[] confirmedSoList = confirmedSOSysNoList;
            foreach (string confirmedSo in confirmedSoList)
            {
                int  soNo  = Convert.ToInt32(confirmedSo);
                bool exist = postIncomeConfirm.Exists(p => p.ConfirmedSoSysNo == soNo);
                if (!exist)
                {
                    insertEntityList.Add(new PostIncomeConfirmInfo()
                    {
                        PostIncomeSysNo  = entity.SysNo,
                        ConfirmedSoSysNo = soNo
                    });
                }
            }

            TransactionOptions options = new TransactionOptions();

            options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            options.Timeout        = TransactionManager.DefaultTimeout;
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
            {
                abandonList.ForEach(p =>
                {
                    UpdatePostIncomeConfirmStatus(p, PostIncomeConfirmStatus.Cancel);//作废CS确认的订单
                });

                updateList.ForEach(p =>
                {
                    UpdatePostIncomeConfirmStatus(p, PostIncomeConfirmStatus.Related);//更新CS确认的订单
                });

                insertEntityList.ForEach(p =>
                {
                    CreatePostIncomeConfirm(p);//添加CS确认的订单
                });

                m_PostIncomeDA.Handle(entity);

                scope.Complete();
            }

            //记录操作日志
            ObjectFactory <ICommonBizInteract> .Instance.CreateOperationLog(
                GetMessageString("PostIncome_Log_Handle", ServiceContext.Current.UserSysNo, postIncomeInfo.SysNo)
                , BizLogType.Invoice_PostIncome_Handle
                , postIncomeInfo.SysNo.Value
                , postIncomeInfo.CompanyCode);
        }
Exemple #9
0
        /// <summary>
        /// 审核网上支付
        /// </summary>
        /// <param name="netpaySysNo">netpay系统编号</param>
        public virtual void Audit(int netpaySysNo)
        {
            NetPayInfo netpayInfo = LoadBySysNo(netpaySysNo);

            if (netpayInfo == null)
            {
                ThrowBizException("NetPay_NeyPayRecordNotExist", netpaySysNo);
            }

            //if (netpayInfo.InputUserSysNo != AuditInfo.AuditUserSysNo)
            //{
            //    ThrowBizException("NetPay_InputAndAuditUserCannotSame", netpaySysNo);
            //}

            SOBaseInfo soBaseInfo = ExternalDomainBroker.GetSOBaseInfo(netpayInfo.SOSysNo.Value);

            SOInfo soInfo = ExternalDomainBroker.GetSOInfo(netpayInfo.SOSysNo.Value);

            if (soBaseInfo == null)
            {
                ThrowBizException("NetPay_SORecordNotExist", netpayInfo.SOSysNo);
            }

            //审核前检查
            PreCheckForAudit(netpayInfo, soBaseInfo);

            SOIncomeInfo soIncomeInfo;

            TransactionOptions options = new TransactionOptions();

            options.IsolationLevel = IsolationLevel.ReadCommitted;
            options.Timeout        = TimeSpan.FromMinutes(2);

            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, options))
            {
                //1.创建销售收款
                //如果有主单,则更新主单的收款单金额
                soIncomeInfo = CreateSOIncomeInfo(netpayInfo, soBaseInfo);
                if (soBaseInfo.SOSplitMaster.HasValue && soBaseInfo.SOSplitMaster.Value > 0)
                {
                    var masterSO = ExternalDomainBroker.GetSOBaseInfo(soBaseInfo.SOSplitMaster.Value);
                    ObjectFactory <SOIncomeProcessor> .Instance.UpdateMasterSOAmt(masterSO);
                }

                //2.审核网上支付,将网上支付记录的状态修改为审核通过
                m_NetpayDA.UpdateApproveInfo(netpaySysNo, NetPayStatus.Approved);

                //3.审核财务多付退款记录
                var refundList = ObjectFactory <SOIncomeRefundProcessor> .Instance.GetListByCriteria(new SOIncomeRefundInfo()
                {
                    OrderSysNo = soIncomeInfo.OrderSysNo.Value,
                    OrderType  = RefundOrderType.OverPayment,
                    Status     = RefundStatus.Origin
                });

                SOIncomeRefundInfo overpayRefund = null;
                if (refundList != null && refundList.Count > 0)
                {
                    overpayRefund = refundList[0];
                }
                if (overpayRefund != null)
                {
                    //如果是现金退款,则退款信息自动审核通过
                    if (overpayRefund.RefundPayType == RefundPayType.CashRefund)
                    {
                        overpayRefund.Status = RefundStatus.Audit;
                        ObjectFactory <SOIncomeRefundProcessor> .Instance.Update(overpayRefund);
                    }
                    //创建财务负收款单
                    overpayRefund.PayAmount = netpayInfo.PayAmount;
                    ObjectFactory <SOIncomeProcessor> .Instance.CreateNegative(overpayRefund);
                }

                //发送netpay审核完成Message

                ts.Complete();
            }
            //待办事项通知,异常不处理,不影响正常业务
            try
            {
                EventPublisher.Publish <InvoiceNetpayAuditedMessage>(new InvoiceNetpayAuditedMessage()
                {
                    SoSysNo        = netpayInfo.SOSysNo.Value,
                    MerchantSysNo  = soInfo.Merchant.SysNo.GetValueOrDefault(),
                    SOType         = (int)soInfo.BaseInfo.SOType,
                    ReferenceSysNo = soInfo.BaseInfo.ReferenceSysNo ?? 0,
                    AuditUserName  = ServiceContext.Current.UserDisplayName,
                    AuditUserSysNo = ServiceContext.Current.UserSysNo,
                    NetpaySysNo    = netpayInfo.SysNo.Value,
                    SplitType      = (int)soInfo.BaseInfo.SplitType
                });
            }
            catch (Exception ex)
            {
                string ere = ex.Message;
            }
            //记录操作日志,用户审核了网上收款单
            ObjectFactory <ICommonBizInteract> .Instance.CreateOperationLog(
                GetMessageString("NetPay_Log_Audit", ServiceContext.Current.UserSysNo, netpaySysNo)
                , ECCentral.BizEntity.Common.BizLogType.Finance_NetPay_Verify
                , soIncomeInfo.SysNo.Value
                , soIncomeInfo.CompanyCode);

            //4、审核移仓单
            VerifyShiftRequest(netpayInfo);
            //库存模式同步送货单给ERP,此处仅限在线支付。货到的在订单审核时会发送
            if (soBaseInfo.PayWhenReceived == false)
            {
                SyncSHD(netpayInfo.SOSysNo.Value);
            }
        }
Exemple #10
0
        public virtual void AuditNetPay4GroupBuy(int netPaySysNo)
        {
            //BizLogger.WriteLog<NetPayEntity>(inputNetPay, "[团购]核对网上支付",
            //    string.Format("Begin:[团购]用户\"{0}\"开始审核", inputNetPay.ApproveUserSysNo.Value, inputNetPay.SOSysNo), inputNetPay.SOSysNo.ToString(), (int)LogType.Finance_NetPay_Verify_GroupBuy);
            int userSysNo  = ServiceContext.Current.UserSysNo;
            var netPayInfo = LoadBySysNo(netPaySysNo);
            var so         = ExternalDomainBroker.GetSOBaseInfo(netPayInfo.SOSysNo.Value);

            #region PreCheck

            if (so.Status == SOStatus.Abandon)
            {
                ThrowBizException("NetPay_Audit_SOAlreadyAbandon", so.SysNo);
            }
            if (netPayInfo.Status != NetPayStatus.Origin)
            {
                ThrowBizException("NetPay_StatusNotAllowCheck");
            }

            //验证订单的付款方式是不是“网上支付”
            //if (!CommonService.IsNetPayType(so.PayTypeSysNo, so.SysNo))
            //{
            //    throw new BusinessException(MessageResource.NetPay_SOPayTypeIsNotNetCode, MessageResource.NetPay_SOPayTypeIsNotNetValue);
            //}

            if (netPayInfo.PayAmount < so.ReceivableAmount)
            {
                ThrowBizException("NetPay_PayAmoutNotEnoughNotAllowCheck");
            }
            #endregion

            #region Prepare data
            //SOIncomeInfo soIncome = new SOIncomeInfo();
            //soIncome.CompanyCode = netPayInfo.CompanyCode;
            //soIncome.IncomeStyle = SOIncomeOrderStyle.Advanced;
            //soIncome.OrderType = SOIncomeOrderType.SO;
            //soIncome.OrderSysNo = netPayInfo.SOSysNo;
            //soIncome.OrderAmt = so.SOTotalAmount;
            //soIncome.IncomeAmt = netPayInfo.PayAmount;
            //soIncome.PrepayAmt = Math.Max(0.00M, so.PrepayAmount??0M);//???
            ////soIncome.IncomeUserSysNo = userSysNo;
            //soIncome.Status = SOIncomeStatus.Origin;
            ////soIncome.MasterSoSysNo = so.;
            //soIncome.PointPay = so.PointPay;
            //soIncome.GiftCardPayAmt = so.GiftCardPay;
            //soIncome.PayAmount = netPayInfo.PayAmount;

            //是否需要生成多付退款单
            SOIncomeRefundInfo refund = null;
            if (netPayInfo.PayAmount > so.ReceivableAmount)
            {
                //构造退款信息
                refund             = new SOIncomeRefundInfo();
                refund.CompanyCode = netPayInfo.CompanyCode;
                //netPayInfo.ReturnAmt = netPayInfo.PayAmount - so.ReceivableAmount;
                refund.RefundCashAmt = netPayInfo.PayAmount - so.ReceivableAmount;

                //Jack:目前没有这个信息
                //if (netPayInfo.ToleranceAmt.HasValue)
                //{
                //    refund.ToleranceAmt = Math.Abs(netPay.ToleranceAmt.Value);
                //}

                //CRL18174:团购订单退款调整,团购订单退款需视不同的支付方式,采用不同的退款类型
                //todo:需要Check 如果团购订单的退款类型为空,则默认为“退入余额帐户”方式
                refund.RefundPayType = RefundPayType.PrepayRefund;

                refund.RefundPoint = 0;
                //todo:jack需要确认一下
                refund.CreateUserSysNo = userSysNo;
                refund.RefundReason    = 5;     //客户多付款
                refund.HaveAutoRMA     = false; //非物流拒收
                refund.Note            = "团购成团后的多付款退款";
                refund.Status          = RefundStatus.Origin;
                refund.OrderType       = RefundOrderType.OverPayment;
                refund.SOSysNo         = netPayInfo.SOSysNo;
                refund.OrderSysNo      = netPayInfo.SOSysNo;
            }

            #endregion

            //#region PreCheck
            //m_soIncomeBL.PreCheckForCreate(soIncome);
            //if (refund != null)
            //{
            //    m_soIncomeRefundBL.PreCheckCreate(refund);
            //}
            //#endregion PreCheck

            #region Action
            SOIncomeInfo       soIncomeInfo = null;
            TransactionOptions options      = new TransactionOptions
            {
                IsolationLevel = IsolationLevel.ReadCommitted,
                Timeout        = TimeSpan.FromMinutes(2)
            };
            try
            {
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, options))
                {
                    //Step 1:向SOIncome写入一条收款记录
                    soIncomeInfo = CreateSOIncomeInfo(netPayInfo, so);

                    //Step 2:写退款信息
                    if (refund != null)
                    {
                        refund.SOIncomeSysNo = soIncomeInfo.SysNo;
                        refund.Status        = RefundStatus.Origin;
                        ObjectFactory <SOIncomeRefundProcessor> .Instance.Create(refund);
                    }
                    //Step 3:更新NetPay记录
                    m_NetpayDA.UpdateApproveInfo(netPaySysNo, NetPayStatus.Approved);

                    ts.Complete();
                }
            }
            catch
            {
                //Do not skip out
                //Log
            }

            #endregion

            //记录业务Log
            //BizLogger.WriteLog<NetPayEntity>(netPay, LogCategories.核对网上支付.ToString(),
            //    string.Format("End:[团购]用户\"{0}\"审核了编号为\"{1}\"网上支付单", netPay.OperationUserUniqueName, netPay.SysNo), netPay.SysNo.ToString(), (int)LogType.Finance_NetPay_Verify);
            ObjectFactory <ICommonBizInteract> .Instance.CreateOperationLog(
                GetMessageString("NetPay_Log_Audit", ServiceContext.Current.UserSysNo, netPaySysNo)
                , ECCentral.BizEntity.Common.BizLogType.Finance_NetPay_Verify
                , soIncomeInfo.SysNo.Value
                , soIncomeInfo.CompanyCode);
        }
Exemple #11
0
        /// <summary>
        /// 创建netpay预检查
        /// </summary>
        /// <param name="netpayEntity"></param>
        protected virtual void PreCheckForCreate(NetPayInfo netpayEntity, SOIncomeRefundInfo refundEntity, SOBaseInfo soBaseInfo, bool isForceCheck)
        {
            //1.输入的订单的支付方式要与订单中的支付方式一致
            if (netpayEntity.PayTypeSysNo != soBaseInfo.PayTypeSysNo)
            {
                ThrowBizException("NetPay_PayTypeNotSame");
            }

            //2.需要提供验证订单的付款方式是不是“网上支付”
            if (!IsNetPayType(soBaseInfo.PayTypeSysNo.Value, soBaseInfo.SysNo.Value))
            {
                ThrowBizException("NetPay_SOPayTypeIsNotNet");
            }

            //3.检查订单是否已经存在有效的网上支付信息
            if (GetValidBySOSysNo(netpayEntity.SOSysNo.Value) != null)
            {
                ThrowBizException("NetPay_AlreadyExistValidRecord");
            }

            #region 检查旧NetPay余额是否够创建新的NetPay

            SOBaseInfo originalSO = ExternalDomainBroker.GetSOBaseInfo(netpayEntity.RelatedSoSysNo.Value);
            if (originalSO == null)
            {
                ThrowBizException("NetPay_PreCheckForCreate_SONotExist", netpayEntity.RelatedSoSysNo);
            }
            if (netpayEntity.SOSysNo != netpayEntity.RelatedSoSysNo.Value)
            {
                if ((int)originalSO.Status > 0)//原订单没有被作废
                {
                    ThrowBizException("NetPay_RelatedSONotAbandon");
                }

                if (GetValidBySOSysNo(netpayEntity.RelatedSoSysNo.Value) != null)
                {
                    ThrowBizException("NetPay_RelatedSONetPayExist");
                }
            }

            //验证规则:原订单核收金额合计加当前核收金额大于原订单金额,请修改该输入的订单金额
            //2012-06-13 freegod:人工输入的不再检查。
            decimal?          totalReceivableAmt  = netpayEntity.PayAmount;
            SOBaseInfo        tempSo              = null;
            List <NetPayInfo> relatedSoNetPayList = m_NetpayDA.GetListByRelatedSoSysNo(netpayEntity.RelatedSoSysNo.Value);
            if (relatedSoNetPayList != null && relatedSoNetPayList.Count > 0)
            {
                relatedSoNetPayList.ForEach(relatedNetPay =>
                {
                    tempSo              = ExternalDomainBroker.GetSOBaseInfo(relatedNetPay.SOSysNo.Value);
                    totalReceivableAmt += tempSo.ReceivableAmount;
                });
            }

            //获取最后一笔作废的NetPay记录
            NetPayInfo lastAboundNetPay = m_NetpayDA.GetLastAboundedByRelatedSoSysNo(netpayEntity.RelatedSoSysNo.Value);
            if (lastAboundNetPay != null)
            {
                decimal avalAmount = lastAboundNetPay.PayAmount.Value;

                //关联原订单的金额合计总和大于原订单的金额,请修改该输入的订单金额
                if (totalReceivableAmt > avalAmount)
                {
                    ThrowBizException("NetPay_RelatedSOAmtNotEnough"
                                      , (totalReceivableAmt.Value - netpayEntity.PayAmount.Value).ToString(InvoiceConst.StringFormat.CurrencyFormat),
                                      netpayEntity.PayAmount.Value.ToString(InvoiceConst.StringFormat.CurrencyFormat), avalAmount.ToString(InvoiceConst.StringFormat.CurrencyFormat));
                }
            }

            #endregion 检查旧NetPay余额是否够创建新的NetPay

            #region 强制核收数据检查

            if (netpayEntity.PayAmount < soBaseInfo.ReceivableAmount)
            {
                ThrowBizException("NetPay_PayAmoutNotEnoughNotAllowCheck");
            }
            if (isForceCheck && netpayEntity.PayAmount == soBaseInfo.ReceivableAmount)
            {
                ThrowBizException("NetPay_NotAllowForceCheck");
            }
            if (!isForceCheck && netpayEntity.PayAmount > soBaseInfo.ReceivableAmount)
            {
                ThrowBizException("NetPay_MustChooseForceCheck");
            }
            if (isForceCheck && (refundEntity.RefundCashAmt ?? 0) <= 0M)
            {
                ThrowBizException("NetPay_ForceCheckReturnAmt");
            }
            if (isForceCheck && Math.Abs(refundEntity.ToleranceAmt ?? 0) > 0.1M)
            {
                ThrowBizException("NetPay_ForceCheckToleranceAmt");
            }

            #endregion 强制核收数据检查
        }
Exemple #12
0
        public virtual int RefundPrepayCard(RefundPrepayCardInfo info)
        {
            SOIncomeRefundInfo entity = m_SOIncomeRefundDA.GetSOIncomeRefundByID(info.SOIncomeBankInfoSysNo.Value, info.CompanyCode);
            string             tNumber = string.Empty;
            decimal            refundAmt = 0M, payAmt = 0M;
            int    soSysNo = entity.SOSysNo.Value;
            string message = string.Empty;
            int    result  = 0;

            #region 业务验证
            if (entity == null)
            {
                ThrowBizException("SOIncomeRefund_NoRefundAudit", info.SOIncomeBankInfoSysNo.Value);
            }
            if (entity.Status != RefundStatus.Audit)
            {
                ThrowBizException("SOIncomeRefund_RefundStatusError", entity.OrderSysNo);
            }
            NetPayInfo netPay = null;
            SOBaseInfo so  = ExternalDomainBroker.GetSOBaseInfo(entity.SOSysNo.Value);
            //如果是子单,则需要查询母单对应的NetPay信息
            if (so.SOSplitMaster.HasValue)
            {
                soSysNo = so.SOSplitMaster.Value;
                netPay  = m_NetPayDA.GetValidBySOSysNo(soSysNo);
                if (netPay == null)
                {
                    ThrowBizException("SOIncomeRefund_NoMasterNetPay", entity.SOSysNo, soSysNo);
                }
                if (string.IsNullOrEmpty(netPay.ExternalKey))
                {
                    ThrowBizException("SOIncomeRefund_NoMasterExternalKey", entity.SOSysNo, soSysNo);
                }
                if (netPay.ExternalKey.Trim().Length == 0)
                {
                    ThrowBizException("SOIncomeRefund_MasterExternalKeyLengthError", entity.SOSysNo, soSysNo);
                }
            }

            //获取子单的NetPay信息
            netPay = m_NetPayDA.GetValidBySOSysNo(entity.SOSysNo.Value);
            if (netPay == null)
            {
                ThrowBizException("SOIncomeRefund_NoNetPay", entity.SOSysNo.Value);
            }
            //如果不是子单,则需要验证支付流水号
            if (!so.SOSplitMaster.HasValue)
            {
                if (string.IsNullOrEmpty(netPay.ExternalKey))
                {
                    ThrowBizException("SOIncomeRefund_NoExternalKey", entity.SOSysNo.Value);
                }
                if (netPay.ExternalKey.Trim().Length == 0)
                {
                    ThrowBizException("SOIncomeRefund_ExternalKeyLengthError", entity.SOSysNo.Value);
                }
            }

            tNumber = netPay.ExternalKey.Trim();

            List <SOIncomeInfo> list = m_SOIncomeDA.GetListByCriteria(null, entity.OrderSysNo, (SOIncomeOrderType)entity.OrderType, new List <SOIncomeStatus>());
            if (list == null || list.Count == 0)
            {
                ThrowBizException("SOIncomeRefund_NoIncomeInfo", entity.OrderSysNo);
            }

            SOIncomeInfo soIncome = list.Find(e => e.Status != SOIncomeStatus.Abandon);
            if (soIncome == null)
            {
                ThrowBizException("SOIncomeRefund_NoIncomeInfo", entity.OrderSysNo);
            }
            if (soIncome.Status == SOIncomeStatus.Confirmed)
            {
                ThrowBizException("SOIncomeRefund_HasConfirmed", entity.OrderSysNo);
            }
            #endregion

            refundAmt = entity.HaveAutoRMA.Value ? soIncome.IncomeAmt.Value : entity.RefundCashAmt.Value;
            payAmt    = netPay.PayAmount.Value;

            //如果存在多笔退款,则payamt应该取最后一次退款时的payamt
            if (m_SOIncomeRefundDA.GetRefundOrder(entity.SOSysNo.Value, entity.CompanyCode) > 1)
            {
                payAmt = m_SOIncomeRefundDA.GetPayAmountBeHis(entity.SOSysNo.Value, entity.CompanyCode);
            }

            payAmt = payAmt - refundAmt;

            #region 写请求日志
            RefundPointInfo log = new RefundPointInfo
            {
                RefundStatus    = RefundPointStatus.Origin,
                OrderType       = entity.OrderType,
                ReferenceID     = string.Format("{0}.{1}", entity.SysNo.Value, soIncome.SysNo.Value),
                PayAmt          = payAmt,
                InUser          = ExternalDomainBroker.GetUserInfoBySysNo(ServiceContext.Current.UserSysNo).UserDisplayName,
                EditDate        = DateTime.Now,
                CurrencySysNo   = 1,
                SOSysNo         = entity.SOSysNo,
                OrderAmt        = so.SOTotalAmount,
                ExternalKey     = netPay.ExternalKey,
                CompanyCode     = entity.CompanyCode,
                PayTypeSysNo    = so.PayTypeSysNo.Value,
                CreateUserSysNo = info.UserSysNo,
                OrderSysNo      = entity.OrderSysNo
            };

            int logSysNo = m_RefundPointDA.Insert(log);
            log.SysNo    = logSysNo;
            log.EditDate = DateTime.Now;
            log.EditUser = ExternalDomainBroker.GetUserInfoBySysNo(ServiceContext.Current.UserSysNo).UserDisplayName;
            #endregion

            #region 请求ThirdPartService,代理访问神州运通退款服务

            try
            {
                //退款状态:1.退款成功 2.退款失败(会直接抛出异常,不作特殊处理)3.神州运通需要进行人工处理
                result = ExternalDomainBroker.RefundPrepayCard(refundAmt, soSysNo, tNumber, log.ReferenceID);
                //退款成功
                if (result == 1)
                {
                    log.RefundStatus    = RefundPointStatus.Success;
                    log.ResponseContent = string.Empty;
                }
                //神州运运通需要进行人工处理,处理完成后调用Newegg的OPenAPI进行状态回写
                else if (result == 3)
                {
                    log.RefundStatus = RefundPointStatus.Processing;
                    message          = log.ResponseContent = "神州运通需要进行人工处理";
                }

                m_RefundPointDA.Update(log);

                if (result == 1)
                {
                    //更新收款单
                    m_RefundPointDA.UpdateSOIncome(log);
                }
            }
            catch (Exception ex)
            {
                result = -1;
                ExceptionHelper.HandleException(ex);
                log.RefundStatus    = RefundPointStatus.Failure;
                log.ResponseContent = string.Format("{0}|{1}", ex.Message, ex.StackTrace);
                //string errorInfo = string.Format("订单{0}远程异常:{1}", entity.OrderSysNo, ex.Message);
                string errorInfo = GetMessageString("SOIncomeRefund_OrderRemoteError", entity.OrderSysNo, ex.Message);
                throw new BizException(errorInfo);
            }

            #endregion

            return(result);
        }