/// <summary> /// 修改订单状态为 已通关发往顾客 /// </summary> /// <param name="sosysno"></param> /// <returns></returns> public bool UpdateSOStatusToCustomsPass(int sosysno) { SOAction action = ObjectFactory <SOAction> .NewInstance(new string[] { SOType.General.ToString(), SOAction.SOCommand.OutStock.ToString() }); action.CurrentSO = GetSOBySOSysNo(sosysno); action.Parameter = new object[] { null, SOStatus.CustomsPass }; action.Do(); return(true); }
public virtual void Split() { SubSOList = new List <SOInfo>(); // 1. 效验是否满足基本拆分条件 Precheck(); //拆当前订单 SplitCurrentSO(); // 子订单分摊计算 CalculateSubSO(SubSOList); #region 保存订单信息到数据库 // 保存订单信息到数据库 TransactionOptions options = new TransactionOptions(); options.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options)) { #region 保存主订单信息 SOStatusChangeInfo statusChangeInfo = new SOStatusChangeInfo { ChangeTime = DateTime.Now, OldStatus = CurrentSO.BaseInfo.Status.Value, OperatorSysNo = ServiceContext.Current.UserSysNo, OperatorType = SOOperatorType.User, Status = SOStatus.Split, SOSysNo = CurrentSO.SysNo }; //更新主单状态 if (!SODA.UpdateSOStatusToSplit(statusChangeInfo)) { BizExceptionHelper.Throw("SO_Split_SOStatus_NotOriginal"); } //更新主单标记为已拆分 CurrentSO.BaseInfo.Status = SOStatus.Split; #endregion //插入子单数据到数据库 foreach (SOInfo subSOInfo in SubSOList) { SaveSubSO(subSOInfo); } #region 调整订单相关日志 //调整礼品卡使用日志 List <SOBaseInfo> subSOBaseInfoList = SubSOList.Select <SOInfo, SOBaseInfo>(subSOInfo => subSOInfo.BaseInfo).ToList(); if (CurrentSO.SOGiftCardList.Count > 0) { Dictionary <int, List <ECCentral.BizEntity.IM.GiftCardRedeemLog> > subSOGiftCardDictionary = new Dictionary <int, List <ECCentral.BizEntity.IM.GiftCardRedeemLog> >(); SubSOList.ForEach(subSOInfo => { subSOGiftCardDictionary.Add(subSOInfo.SysNo.Value, subSOInfo.SOGiftCardList); }); ExternalDomainBroker.SplitSOGiftCard(CurrentSO.BaseInfo, subSOGiftCardDictionary); } //调整积分 //调整余额支付 //作废主单积分日志 if (CurrentSO.BaseInfo.PointPay > 0) { ExternalDomainBroker.SplitSOPoint(CurrentSO.BaseInfo, subSOBaseInfoList); } //作废主单余额日志 if (CurrentSO.BaseInfo.PrepayAmount > 0) { ExternalDomainBroker.AdjustPrePay(new BizEntity.Customer.CustomerPrepayLog { AdjustAmount = CurrentSO.BaseInfo.PrepayAmount, PrepayType = ECCentral.BizEntity.Customer.PrepayType.SOPay, SOSysNo = SOSysNo, Note = "拆分订单,作废主订单余额支付", CustomerSysNo = CurrentSO.BaseInfo.CustomerSysNo }); SubSOList.ForEach(subSOInfo => { if (subSOInfo.BaseInfo.PrepayAmount.Value != 0M) { ExternalDomainBroker.AdjustPrePay(new BizEntity.Customer.CustomerPrepayLog { AdjustAmount = -subSOInfo.BaseInfo.PrepayAmount, PrepayType = ECCentral.BizEntity.Customer.PrepayType.SOPay, SOSysNo = SOSysNo, Note = "拆分订单,子订单使用余额支付", CustomerSysNo = subSOInfo.BaseInfo.CustomerSysNo }); } }); } //如果是款到发货订单,拆分NetPay if (!CurrentSO.BaseInfo.PayWhenReceived.Value) { ExternalDomainBroker.SplitSOIncome(CurrentSO.BaseInfo, subSOBaseInfoList); } #endregion scope.Complete(); } #endregion //给客户发拆分邮件 ObjectFactory <SOSendMessageProcessor> .Instance.SendSplitSOEmail(CurrentSO, SubSOList); if (IsAutoSplit) { foreach (SOInfo subSO in SubSOList) { SOAction soAction = SOActionFactory.Create(new SOCommandInfo { Command = SOCommand.Audit, SOInfo = subSO }); if (soAction is SOAudit) { (soAction as SOAudit).SendMessage(); } } } //记录增票更改日志记录 if (CurrentSO.InvoiceInfo.IsVAT.Value) { WriteSOChangeVATLog(SubSOList); } //记日志 WriteLog(); }
/// <summary> /// /// </summary> /// <param name="soInfo"></param> /// <param name="soType"></param> /// <param name="command"></param> /// <returns></returns> public static SOAction Create(SOAction.SOCommandInfo command) { //订单出库目前只处理SellerPortal发来请求 if (command == null || command.SOInfo == null || !command.SOInfo.BaseInfo.SOType.HasValue) { BizExceptionHelper.Throw("SO_SOIsNotExist"); } SOType soType = SOType.General; soType = command.SOInfo.BaseInfo.SOType.Value; //默认都使用 普通订单 的行为方法,如果某些订单类型有特定的行为方法,请在下 switch 代码中设置。 string filterSOType = SOType.General.ToString(); switch (command.Command) { case SOAction.SOCommand.Create: switch (soType) { case SOType.PhysicalCard: case SOType.ElectronicCard: case SOType.Gift: filterSOType = soType.ToString(); break; } break; case SOAction.SOCommand.Update: switch (soType) { case SOType.PhysicalCard: case SOType.ElectronicCard: case SOType.Gift: case SOType.GroupBuy: filterSOType = soType.ToString(); break; } break; case SOAction.SOCommand.Audit: switch (soType) { case SOType.PhysicalCard: case SOType.ElectronicCard: case SOType.Gift: case SOType.GroupBuy: filterSOType = command.SOInfo.BaseInfo.SOType.Value.ToString(); break; } break; case SOAction.SOCommand.Abandon: switch (soType) { case SOType.ElectronicCard: case SOType.PhysicalCard: filterSOType = command.SOInfo.BaseInfo.SOType.Value.ToString(); break; case SOType.General: if (command.SOInfo.BaseInfo.SpecialSOType != SpecialSOType.Normal) { filterSOType = ThirdPartSOFilter; } break; } break; case SOAction.SOCommand.Job: switch (soType) { case SOType.GroupBuy: filterSOType = soType.ToString(); break; } break; } SOAction action = ObjectFactory <SOAction> .NewInstance(new string[] { filterSOType, command.Command.ToString() }); action.CurrentSO = command.SOInfo; action.Parameter = command.Parameter; return(action); }