| @ -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); | |||
| } | |||
| } | |||
| } | |||