| @ -0,0 +1,183 @@ | |||||
| using BWP.B3Frameworks.BO.NamedValueTemplate; | |||||
| using BWP.B3Frameworks.Utils; | |||||
| using BWP.B3Sale.BL; | |||||
| using BWP.B3Sale.BO; | |||||
| using BWP.Web.Actions; | |||||
| using BWP.Web.Pages.B3Sale.Bills.Order_; | |||||
| using Forks.EnterpriseServices.BusinessInterfaces; | |||||
| using Forks.EnterpriseServices.DomainObjects2; | |||||
| using Forks.EnterpriseServices.DomainObjects2.DQuery; | |||||
| using Forks.EnterpriseServices.SqlDoms; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Linq; | |||||
| using System.Text; | |||||
| using TSingSoft.WebControls2; | |||||
| using TSingSoft.WebPluginFramework; | |||||
| namespace BWP.Web.Pages.B3QingDaoWanFu.Overlays | |||||
| { | |||||
| class OrderEdit_Ext : OrderEdit | |||||
| { | |||||
| protected override void AddActions(TSingSoft.WebControls2.ButtonGroup buttonGroup) | |||||
| { | |||||
| base.AddActions(buttonGroup); | |||||
| if (!IsNew) | |||||
| buttonGroup.Actions.Add(new SimpleServerAction("订单合并", () => CanSave, CombineOrder) | |||||
| { | |||||
| OnClientClick = "if(typeof(CheckDmoChanged) == 'function' && CheckDmoChanged()){ alert('您所要合并的单据还没有保存,请先保存单据后再操作'); return false;}" | |||||
| }); | |||||
| } | |||||
| void CombineOrder() | |||||
| { | |||||
| if (Dmo.LoadTime == null) | |||||
| throw new Exception("订单发货时间不能为空"); | |||||
| if (Dmo.Customer_ID == null) | |||||
| throw new Exception("购货客户不能为空"); | |||||
| using (var context = new TransactionContext()) | |||||
| { | |||||
| EnsuState(context.Session); | |||||
| var existInfo = GetExistOrderAndSaleOutStore(context.Session); | |||||
| if (existInfo == null) | |||||
| { | |||||
| AspUtil.Alert(this, "无订单可合并!"); | |||||
| } | |||||
| else | |||||
| { | |||||
| var ok = CombineOrder(context.Session, existInfo.Item1, existInfo.Item2.HasValue); | |||||
| if (!ok) | |||||
| return; | |||||
| if (existInfo.Item2.HasValue) | |||||
| CombineSaleOutStore(context.Session, existInfo.Item2.Value); | |||||
| context.Commit(); | |||||
| NDmoSave(existInfo.Item1); | |||||
| } | |||||
| } | |||||
| } | |||||
| void EnsuState(IDmoSession session) | |||||
| { | |||||
| var rowVersion = InnerBLUtil.GetDmoPropertyByID<int>(session, typeof(Order), "RowVersion", Dmo.ID); | |||||
| if (rowVersion != Dmo.RowVersion) | |||||
| throw new Exception("当前单据已被更改,请重新打开"); | |||||
| } | |||||
| Tuple<long, long?> GetExistOrderAndSaleOutStore(IDmoSession session) | |||||
| { | |||||
| var main = new JoinAlias("mOrder", typeof(Order)); | |||||
| var saleOut = new JoinAlias(typeof(SaleOutStore)); | |||||
| var query = new DQueryDom(main); | |||||
| query.From.AddJoin(JoinType.Left, new DQDmoSource(saleOut), DQCondition.EQ(main, "ID", saleOut, "Order_ID")); | |||||
| query.Columns.Add(DQSelectColumn.Field("ID")); | |||||
| query.Columns.Add(DQSelectColumn.Field("ID", saleOut)); | |||||
| query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Customer_ID", Dmo.Customer_ID), DQCondition.EQ(DQExpression.Snippet("CAST([mOrder].[LoadTime] AS DATE)"), DQExpression.Value(Dmo.LoadTime.Value.Date)), DQCondition.InEQ("BillState", 单据状态.已作废))); | |||||
| query.Where.Conditions.Add(DQCondition.Or(DQCondition.IsNull(DQExpression.Field(saleOut, "BillState")), DQCondition.EQ(saleOut, "BillState", 单据状态.未审核))); | |||||
| if (!IsNew) | |||||
| query.Where.Conditions.Add(DQCondition.InEQ("ID", Dmo.ID)); | |||||
| return query.EExecuteScalar<long, long?>(session); | |||||
| } | |||||
| bool CombineOrder(IDmoSession session, long id, bool existSaleOut) | |||||
| { | |||||
| var bl = BIFactory.Create<IOrderBL>(session); | |||||
| var comb = bl.Load(id); | |||||
| if (comb.Details.Any(x => Dmo.Details.Any(y => x.SaleGoods_ID == y.SaleGoods_ID && x.Price != y.Price))) | |||||
| return false; | |||||
| foreach (var detail in Dmo.Details) | |||||
| { | |||||
| var first = comb.Details.FirstOrDefault(x => x.SaleGoods_ID == detail.SaleGoods_ID); | |||||
| if (first == null) | |||||
| { | |||||
| first = new Order_Detail(); | |||||
| DmoUtil.CopyDmoFields(detail, first, "ID", "Order_ID"); | |||||
| comb.Details.Add(first); | |||||
| } | |||||
| else | |||||
| { | |||||
| first.SecondNumber = (first.SecondNumber ?? 0).Value + (detail.SecondNumber ?? 0).Value; | |||||
| first.UnitNum = (first.UnitNum ?? 0).Value + (detail.UnitNum ?? 0).Value; | |||||
| first.Number = (first.Number ?? 0).Value + (detail.Number ?? 0).Value; | |||||
| first.Money = (first.Money ?? 0).Value + (detail.Money ?? 0).Value; | |||||
| } | |||||
| if (existSaleOut) | |||||
| { | |||||
| first.AlreadyOutStoreUnitNum = (first.AlreadyOutStoreUnitNum ?? 0).Value + (detail.UnitNum ?? 0).Value; | |||||
| first.AlreadyOutStoreNum = (first.AlreadyOutStoreNum ?? 0).Value + (detail.Number ?? 0).Value; | |||||
| first.AlreadyOutStoreSecondNumber = (first.AlreadyOutStoreSecondNumber ?? 0).Value + (detail.SecondNumber ?? 0).Value; | |||||
| } | |||||
| } | |||||
| if (existSaleOut) | |||||
| { | |||||
| comb.AlreadyOutStoreUnitNum = comb.Details.Sum(x => (x.AlreadyOutStoreUnitNum ?? 0).Value); | |||||
| comb.AlreadyOutStoreNum = comb.Details.Sum(x => (x.AlreadyOutStoreNum ?? 0).Value); | |||||
| comb.AlreadyOutStoreSecondNumber = comb.Details.Sum(x => (x.AlreadyOutStoreSecondNumber ?? 0).Value); | |||||
| } | |||||
| Dmo.OldOrderID = id; | |||||
| UpdateOldOrderID(session); | |||||
| SaleForecastBL.CreateOrderContext = null; | |||||
| bl.Nullify(Dmo); | |||||
| bl.Update(comb); | |||||
| return true; | |||||
| } | |||||
| void UpdateOldOrderID(IDmoSession session) | |||||
| { | |||||
| var update = new DQUpdateDom(typeof(Order)); | |||||
| update.Columns.Add(new DQUpdateColumn("OldOrderID", Dmo.OldOrderID)); | |||||
| update.Where.Conditions.Add(DQCondition.EQ("ID", Dmo.ID)); | |||||
| session.ExecuteNonQuery(update); | |||||
| } | |||||
| void CombineSaleOutStore(IDmoSession session, long id) | |||||
| { | |||||
| var bl = BIFactory.Create<ISaleOutStoreBL>(session); | |||||
| var saleOut = bl.Load(id); | |||||
| foreach (var orderDetail in Dmo.Details) | |||||
| { | |||||
| var first = saleOut.Details.FirstOrDefault(x => x.SaleGoods_ID == orderDetail.SaleGoods_ID); | |||||
| if (first == null) | |||||
| { | |||||
| first = new SaleOutStore_Detail(); | |||||
| DmoUtil.CopyDmoFields(orderDetail, first, "ID"); | |||||
| first.Order_DetailID = orderDetail.ID; | |||||
| first.Order_Detail_Number = orderDetail.Number; | |||||
| first.Order_Detail_SecondNumber = orderDetail.SecondNumber; | |||||
| first.Order_Detail_UnitNum = orderDetail.UnitNum; | |||||
| first.HiddenUnitNum = orderDetail.UnitNum; | |||||
| first.HiddenNumber = orderDetail.Number; | |||||
| first.HiddenSecondNumber = orderDetail.SecondNumber; | |||||
| first.IsOutsourcing = orderDetail.IsOutsourcing; | |||||
| } | |||||
| else | |||||
| { | |||||
| first.SecondNumber = (first.SecondNumber ?? 0).Value + (orderDetail.SecondNumber ?? 0).Value; | |||||
| first.UnitNum = (first.UnitNum ?? 0).Value + (orderDetail.UnitNum ?? 0).Value; | |||||
| first.Number = (first.Number ?? 0).Value + (orderDetail.Number ?? 0).Value; | |||||
| first.Money = (first.Money ?? 0).Value + (orderDetail.Money ?? 0).Value; | |||||
| } | |||||
| } | |||||
| bl.Update(saleOut); | |||||
| } | |||||
| void NDmoSave(long id) | |||||
| { | |||||
| var blMessage = BIFactory.GetLastMessage(); | |||||
| var url = Request.RawUrl; | |||||
| if (IsNew) | |||||
| { | |||||
| url = AspUtil.RemoveUrlParam(url, "ReferToID"); | |||||
| url = AspUtil.AddParamToUrl(url, "ID", id.ToString()); | |||||
| } | |||||
| var message = "合并成功!"; | |||||
| if (!string.IsNullOrEmpty(blMessage)) | |||||
| { | |||||
| message += "\r\n" + blMessage; | |||||
| } | |||||
| AspUtil.RedirectAndAlert(this, url, message); | |||||
| } | |||||
| } | |||||
| } | |||||