private bool IsRuleMatch(ResponsibleUserInfo responsibleUser, TrackingInfo trackingInfo) { var soIncomeBL = ObjectFactory <SOIncomeProcessor> .Instance; if (trackingInfo.OrderType == SOIncomeOrderType.SO) { //订单不存在直接抛出异常,这个是数据错误。 var soInfo = ExternalDomainBroker.GetSOInfo(trackingInfo.OrderSysNo.Value); if (responsibleUser.CustomerSysNo == soInfo.BaseInfo.CustomerSysNo || responsibleUser.ShipTypeSysNo == soInfo.ShippingInfo.ShipTypeSysNo || responsibleUser.PayTypeSysNo == soInfo.BaseInfo.PayTypeSysNo) { return(true); } //比较收款类型,SO单只有货到付款和款到发货两种。 if (!responsibleUser.CustomerSysNo.HasValue && !responsibleUser.ShipTypeSysNo.HasValue && !responsibleUser.PayTypeSysNo.HasValue && (int)responsibleUser.IncomeStyle.Value == (int)trackingInfo.IncomeStyle.Value ) { return(true); } } else { if (!responsibleUser.CustomerSysNo.HasValue && !responsibleUser.ShipTypeSysNo.HasValue && !responsibleUser.PayTypeSysNo.HasValue && responsibleUser.IncomeStyle == ResponseUserOrderStyle.RefundException) { return(true); } } return(false); }
/// <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); } }
protected virtual string GetResponsibleUserName(TrackingInfo entity) { if (!entity.OrderSysNo.HasValue) { throw new ArgumentNullException("entity.OrderSysNo"); } if (!entity.OrderType.HasValue) { throw new ArgumentNullException("entity.OrderType"); } var allResponseUsers = GetAllResponsibleUsers(entity.CompanyCode); //fixbug:Dictionary键重复问题 //原来的IPP在配置责任人的时候有bug,不能判断勾选了“特殊责任人”,但是实际条件又不满足“特殊责任人”的情况,导致生成重复的责任人数据(配送方式、支付方式、客户编号相同的数据)。 //ECCentral不会产生这样的数据,但为了兼容之前的数据,作出下面的调整。 var vipDict = allResponseUsers.Where(x => x.CustomerSysNo.HasValue) .GroupBy(g => g.CustomerSysNo).ToDictionary(x => x.Key, x => x.FirstOrDefault()); var shipTypeDict = allResponseUsers.Where(x => x.ShipTypeSysNo.HasValue) .GroupBy(g => g.ShipTypeSysNo).ToDictionary(x => x.Key, x => x.FirstOrDefault()); var payTypeDict = allResponseUsers.Where(x => x.PayTypeSysNo.HasValue) .GroupBy(g => g.PayTypeSysNo).ToDictionary(x => x.Key, x => x.FirstOrDefault()); var incomeStyleDict = allResponseUsers.Where(x => x.IncomeStyle.HasValue && !x.PayTypeSysNo.HasValue && !x.ShipTypeSysNo.HasValue && !x.CustomerSysNo.HasValue && !x.SourceType.HasValue).ToDictionary(x => x.IncomeStyle); if (entity.OrderType == SOIncomeOrderType.SO) { var soInfo = ExternalDomainBroker.GetSOInfo(entity.OrderSysNo.Value); if (soInfo == null) { ThrowBizException("TrackingInfo_NotExistSORecord", entity.OrderSysNo); } var soIncomeInfo = ObjectFactory <SOIncomeProcessor> .Instance.GetListByCriteria(null, soInfo.SysNo, SOIncomeOrderType.SO, null) .Select(s => s).FirstOrDefault(); var netpayInfo = ObjectFactory <NetPayProcessor> .Instance.GetListByCriteria( new NetPayInfo() { SOSysNo = soInfo.SysNo, }).Where(w => w.Status > NetPayStatus.Abandon).Select(s => s).FirstOrDefault(); //责任人来源方式 ResponsibleSource?souceType = null; if (soIncomeInfo.IncomeStyle == SOIncomeOrderStyle.Advanced) { if (netpayInfo.Source == NetPaySource.Bank) { souceType = ResponsibleSource.NetPay; } else { souceType = ResponsibleSource.Manual; } } //款到发货 if (soIncomeInfo.IncomeStyle == SOIncomeOrderStyle.Advanced) { #region CRL10309 By Kilin 根据来源方式(网关、手动)匹配责任人 //根据来源方式匹配 ResponsibleUserInfo responsibleUser = allResponseUsers .Where(w => w.IncomeStyle == ResponseUserOrderStyle.Advanced && w.SourceType.HasValue && souceType.HasValue && w.SourceType == souceType.Value) .Select(s => s) .FirstOrDefault(); if (responsibleUser != null) { return(responsibleUser.ResponsibleUserName); } //如果是 银行电汇 if (soInfo.BaseInfo.PayTypeSysNo.HasValue) { if (payTypeDict.ContainsKey(soInfo.BaseInfo.PayTypeSysNo.Value)) { return(payTypeDict[soInfo.BaseInfo.PayTypeSysNo.Value].ResponsibleUserName); } } //最后一步取支付方式和来源方式都为空的数据 responsibleUser = allResponseUsers .Where(w => w.IncomeStyle == ResponseUserOrderStyle.Advanced && !w.PayTypeSysNo.HasValue && !w.SourceType.HasValue) .Select(s => s) .FirstOrDefault(); if (responsibleUser != null) { return(responsibleUser.ResponsibleUserName); } #endregion CRL10309 By Kilin 根据来源方式(网关、手动)匹配责任人 } //货到付款 else if (soIncomeInfo.IncomeStyle == SOIncomeOrderStyle.Normal) { //优先按照客户编号匹配责任人 if (vipDict.ContainsKey(soInfo.BaseInfo.CustomerSysNo.Value)) { return(vipDict[soInfo.BaseInfo.CustomerSysNo.Value].ResponsibleUserName); } //其次是按照配送方式匹配责任人 if (shipTypeDict.ContainsKey(soInfo.ShippingInfo.ShipTypeSysNo.Value)) { return(shipTypeDict[soInfo.ShippingInfo.ShipTypeSysNo.Value].ResponsibleUserName); } } ResponseUserOrderStyle incomeStyle = ResponseUserOrderStyle.Normal; if (!soInfo.BaseInfo.PayWhenReceived.Value) { incomeStyle = ResponseUserOrderStyle.Advanced; } //最后按照是否货到付款确定责任人 if (incomeStyleDict.ContainsKey(incomeStyle)) { return(incomeStyleDict[incomeStyle].ResponsibleUserName); } } else { if (incomeStyleDict.ContainsKey(ResponseUserOrderStyle.RefundException)) { return(incomeStyleDict[ResponseUserOrderStyle.RefundException].ResponsibleUserName); } } return(string.Empty); }
/// <summary> /// CS审核退款单 /// </summary> public virtual void CSAudit(SOIncomeRefundInfo info) { var entity = LoadBySysNo(info.SysNo.Value); PreCheckForCSAudit(entity, info); var soEntity = ExternalDomainBroker.GetSOInfo(entity.SOSysNo.Value); //判断订单是否是【增票订单】 if (soEntity == null) { //ThrowBizException("没有找到对应的订单"); ThrowBizException("SOIncomeRefund_OrderNotFound"); } //add by norton 2012-11-7 { if (!soEntity.InvoiceInfo.IsVAT.Value) { //不是【增票订单】,状态直接改为【已审核】 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, options)) { var flag = m_SOIncomeRefundDA.UpdateStatus(entity.SysNo.Value, ServiceContext.Current.UserSysNo, RefundStatus.Audit, DateTime.Now); if (flag) { PassAudit(entity); } //发送cs审核退款审核Message EventPublisher.Publish(new RefundCSAuditMessage() { RefundSysNo = entity.SysNo.Value, CurrentUserSysNo = ServiceContext.Current.UserSysNo }); ts.Complete(); } //记录操作日志 ObjectFactory<ICommonBizInteract>.Instance.CreateOperationLog( GetMessageString("SOIncomeRefund_Log_CSAudit", ServiceContext.Current.UserSysNo, entity.SysNo) , BizLogType.AuditRefund_Update , entity.SysNo.Value , entity.CompanyCode); } else { //是【增票订单】,状态改为【待财务审核】 using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, options)) { m_SOIncomeRefundDA.UpdateStatus(entity.SysNo.Value, ServiceContext.Current.UserSysNo, RefundStatus.WaitingFinAudit, DateTime.Now); //发送cs审核退款审核Message EventPublisher.Publish(new RefundCSAuditMessage() { RefundSysNo = entity.SysNo.Value, CurrentUserSysNo = ServiceContext.Current.UserSysNo }); ts.Complete(); } ObjectFactory<ICommonBizInteract>.Instance.CreateOperationLog( GetMessageString("SOIncomeRefund_Log_CSAuditIsVAT", ServiceContext.Current.UserSysNo, entity.SysNo) , BizLogType.AuditRefund_Update , entity.SysNo.Value , entity.CompanyCode); } } }