/// <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); }
/// <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; } }
/// <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); }
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"); } } }
/// <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); }
/// <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); } }
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); }
/// <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 强制核收数据检查 }
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); }