using System; using System.Collections.Generic; using System.Linq; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using B3_DongFangWanQi.BO; using BWP.B3Frameworks; using BWP.B3Frameworks.BO; using BWP.B3Frameworks.BO.MoneyTemplate; using BWP.B3Frameworks.BO.NamedValueTemplate; using BWP.B3Frameworks.Utils; using BWP.B3Sale.BL; using BWP.B3Sale.BO; using BWP.B3Sale.Utils; using BWP.B3UnitedInfos.BO; using BWP.Web.Utils; using Forks.EnterpriseServices; using Forks.EnterpriseServices.BusinessInterfaces; using Forks.EnterpriseServices.DataForm; using Forks.EnterpriseServices.DomainObjects2; using Forks.EnterpriseServices.DomainObjects2.DQuery; using Forks.EnterpriseServices.SqlDoms; using Forks.Utils; using Forks.Utils.Collections; using TSingSoft.WebControls2; using TSingSoft.WebPluginFramework; using TSingSoft.WebPluginFramework.Controls; using TSingSoft.WebPluginFramework.Pages; using BWP.B3UnitedInfos.BL; using B3_DongFangWanQi.BL; namespace BWP.Web.Pages.B3_DongFangWanQi.Tools { class SaleOrderUpdateEdit : AppBasePage { long? GoodsProperty_ID { get { if (string.IsNullOrEmpty(Request.QueryString["GoodsProperty_ID"])) return null; return long.Parse(Request.QueryString["GoodsProperty_ID"]); } } string Goods_Name { get { return Request.QueryString["Goods_Name"]; } } long? Customer_ID { get { if (string.IsNullOrEmpty(Request.QueryString["Customer_ID"])) return null; return long.Parse(Request.QueryString["Customer_ID"]); } } string AccountingUnit_Name { get { return Request.QueryString["AccountingUnit_Name"]; } } long? AccountingUnit_ID { get { if (string.IsNullOrEmpty(Request.QueryString["AccountingUnit_ID"])) return null; return long.Parse(Request.QueryString["AccountingUnit_ID"]); } } long? SelectAccountingUnit_ID { get { if (string.IsNullOrEmpty(Request.QueryString["SelectAccountingUnit_ID"])) return null; return long.Parse(Request.QueryString["SelectAccountingUnit_ID"]); } } long? SelectStore_ID { get { if (string.IsNullOrEmpty(Request.QueryString["SelectStore_ID"])) return null; return long.Parse(Request.QueryString["SelectStore_ID"]); } } long? SelectCustomer_ID { get { if (string.IsNullOrEmpty(Request.QueryString["SelectCustomer_ID"])) return null; return long.Parse(Request.QueryString["SelectCustomer_ID"]); } } string SelectGoodsProperty_Name { get { if (string.IsNullOrEmpty(Request.QueryString["SelectGoodsProperty_Name"])) return null; return Request.QueryString["SelectGoodsProperty_Name"]; } } long? SelectGoodsProperty_ID { get { if (string.IsNullOrEmpty(Request.QueryString["SelectGoodsProperty_ID"])) return null; return long.Parse(Request.QueryString["SelectGoodsProperty_ID"]); } } string SelectGoodsPropertyCatalog_Name { get { if (string.IsNullOrEmpty(Request.QueryString["SelectGoodsPropertyCatalog_Name"])) return null; return Request.QueryString["SelectGoodsPropertyCatalog_Name"]; } } long? SelectGoodsPropertyCatalog_ID { get { if (string.IsNullOrEmpty(Request.QueryString["SelectGoodsPropertyCatalog_ID"])) return null; return long.Parse(Request.QueryString["SelectGoodsPropertyCatalog_ID"]); } } List Details { get { if (ViewState["Details"] == null) ViewState["Details"] = new List(); return (List)ViewState["Details"]; } set { ViewState["Details"] = value; } } DateTime? MinTime { get { var str = Request.QueryString["MinDate"]; if (string.IsNullOrEmpty(str)) return null; return DateTime.Parse(str); } } DateTime? MaxTime { get { var str = Request.QueryString["MaxDate"]; if (string.IsNullOrEmpty(str)) return null; return DateTime.Parse(str); } } private DFEditGrid _goodsGrid; private QueryContainer _queryContainer; readonly static DFInfo DFInfo = DFInfo.Get(typeof(Order)); private Label _l1, _l2, _tzNumber, txtRealStoreNumber; private DFContainer _dfContainer; protected override void InitForm(HtmlForm form) { _queryContainer = QueryContainer.FromResource(typeof(SaleOrderUpdateList).FullName + ".xml", GetType().Assembly); QueryCreator.TimeRange(DFInfo.Fields["OrderDate"], _queryContainer, "MinOrderDate", "MaxOrderDate", MinTime, MaxTime); form.Controls.Add(new PageTitle("订单调整")); var vPanel = new VLayoutPanel(); form.Controls.Add(vPanel); _dfContainer = new DFContainer(); _dfContainer.ID = "DFContainer"; form.Controls.Add(_dfContainer); var panel = new HLayoutPanel(); panel.Add(new SimpleLabel("预计牛头数")); _tzNumber = new Label(); _tzNumber.Font.Size = 12; _tzNumber.Font.Bold = true; _tzNumber.Width = 180; var date = Request.QueryString["date"]; if (!string.IsNullOrEmpty(date)) _tzNumber.Text = string.Format("{0}头({1})", Request.QueryString["mainNumber"], date); else { _tzNumber.Text = string.Format("{0}头 ", Request.QueryString["mainNumber"]); } panel.Add(_tzNumber); panel.Add(new SimpleLabel("当前牛头数产值")); var label2 = new Label(); label2.Font.Size = 14; label2.Width = 120; label2.Font.Bold = true; label2.Text = Request.QueryString["currentNumber"].ToString(); panel.Add(label2); panel.Add(new SimpleLabel("合计订货数量")); _l1 = new Label(); _l1.ID = "l1"; _l1.Font.Size = 14; _l1.Width = 120; _l1.Font.Bold = true; panel.Add(_l1); panel.Add(new SimpleLabel("实际库存")); txtRealStoreNumber = new Label(); txtRealStoreNumber.ID = "txtRealStoreNumber"; txtRealStoreNumber.Font.Size = 14; txtRealStoreNumber.Font.Bold = true; txtRealStoreNumber.Width = 120; panel.Add(txtRealStoreNumber); panel.Add(new SimpleLabel("可用与预算合计")); var label = new Label(); label.Font.Size = 14; label.Width = 120; label.Font.Bold = true; label.Text = decimal.Parse(Request.QueryString["number"]).ToString("0.00"); panel.Add(label); panel.Add(new SimpleLabel("预计剩余数量")); _l2 = new Label(); _l2.ID = "l2"; _l2.Font.Size = 14; _l2.Font.Bold = true; _l2.Width = 120; panel.Add(_l2); vPanel.Add(panel); _dfContainer.AddNonDFControl(_l1, "$l1"); _dfContainer.AddNonDFControl(_l2, "$l2"); CreateGrid(vPanel); } private void CreateGrid(VLayoutPanel vPanel) { var editor = new DFCollectionEditor(() => Details); editor.CanDeleteFunc = detail => true; editor.IsEditableFunc = (field, detail) => { if (field.Name == "SecondNumber") { var hasSecondUnit = !string.IsNullOrEmpty(detail.Goods_SecondUnit); return hasSecondUnit; } return true; }; _goodsGrid = new DFEditGrid(editor); _goodsGrid.DFGridSetEnabled = false; _goodsGrid.Width = Unit.Percentage(100); _goodsGrid.ShowLineNo = true; _goodsGrid.Columns.Add(new DFEditGridColumn("Order_ID")); _goodsGrid.Columns.Add(new DFEditGridColumn("Customer_Name")); _goodsGrid.Columns.Add(new DFEditGridColumn("Goods_Code")); _goodsGrid.Columns.Add(new DFEditGridColumn("Goods_Name")); _goodsGrid.Columns.Add(new DFEditGridColumn("Goods_Spec")); var col = new DFEditGridColumn("UnitNum"); col.InitEditControl += (sender, e) => { e.Control.Attributes["onchange"] = @"SetSumInfo();this.dfContainer.setValue('ChangeFlag','true'); "; }; _goodsGrid.Columns.EAdd(col).SumMode = SumMode.Sum; _goodsGrid.Columns.Add(new DFEditGridColumn("Unit")); _goodsGrid.Columns.EAdd(new DFEditGridColumn("SecondNumber")).SumMode = SumMode.Sum; _goodsGrid.Columns.Add(new DFEditGridColumn("Goods_SecondUnit")); _goodsGrid.Columns.Add(new DFEditGridColumn("Price")); _goodsGrid.Columns.Add(new DFEditGridColumn("LoadTime")); _goodsGrid.Columns.Add(new DFEditGridColumn("OrderDate")); //_goodsGrid.Columns.Add(new DFEditGridColumn("ChangeFlag")); _goodsGrid.Columns.Add(new DFEditGridColumn("Remark")); _goodsGrid.ValueColumns.Add("SaleGoods_ID"); _goodsGrid.ValueColumns.Add("Goods_UnitConvertDirection"); _goodsGrid.ValueColumns.Add("Goods_MainUnitRatio"); _goodsGrid.ValueColumns.Add("Goods_SecondUnitRatio"); _goodsGrid.ValueColumns.Add("LeftRatio"); _goodsGrid.ValueColumns.Add("Price"); _goodsGrid.ValueColumns.Add("RightRatio"); vPanel.Add(_goodsGrid); //new MainToSecondConvertRowManger(_goodsGrid); _dfContainer.AddNonDFControl(_goodsGrid, "$Grid"); var hl = vPanel.Add(new HLayoutPanel(), new VLayoutOption(HorizontalAlign.Center)); var saveBt = hl.Add(new TSButton("保存")); saveBt.Width = Unit.Pixel(80); saveBt.Click += SaveBtClick; hl.Add(new LiteralControl(" ")); TSButton back; hl.Add(back = new TSButton("返回", delegate { DialogUtil.SetCachedObj(this, ""); })); back.Width = Unit.Pixel(80); } void SaveBtClick(object sender, EventArgs e) { _goodsGrid.GetFromUI(); var groupByOrderID = Details.Where(x => !string.IsNullOrEmpty(x.ChangeFlag)).GroupBy(x => x.Order_ID); var bl = BIFactory.Create(); var gbl = BIFactory.Create(); var soa = BIFactory.Create(); var cannotUpdateID = new List(); var updateIDs = new List(); long GoodsProperty_ID = 0; foreach (var orderDetails in groupByOrderID) { var order = bl.Load(orderDetails.Key); if (order == null) continue; var changed = false; foreach (var cDetail in orderDetails) { var detail = order.Details.FirstOrDefault(x => x.ID == cDetail.ID); if (detail == null) continue; if (detail.UnitNum != cDetail.UnitNum) { detail.UnitNum = cDetail.UnitNum; changed = true; } if (detail.SecondNumber != cDetail.SecondNumber) { detail.SecondNumber = cDetail.SecondNumber; changed = true; } if (detail.Price != cDetail.Price) { detail.Price = cDetail.Price; changed = true; } GoodsProperty_ID = (long)detail.GoodsProperty_ID; } if (changed) { if (order.BillState != 单据状态.未审核) { cannotUpdateID.Add(order.ID); continue; } bl.Update(order); updateIDs.Add(order.ID); } } var AdjustNumber = GetQuery(GoodsProperty_ID); if (AdjustNumber != null) { AdjustNumber.AdjustNumber += 1; soa.Update(AdjustNumber); } else { AdjustNumber = new SaleOrderAdjustNumber() { GoodsProperty_ID = GoodsProperty_ID, AdjustNumber = 1}; soa.Insert(AdjustNumber); } string msg; if (updateIDs.Count > 0) msg = string.Format("保存成功\n已更新销售订单No.{0}\n", string.Join(",", updateIDs)); else { msg = "没有需要更新的产品!\n"; } if (cannotUpdateID.Count > 0) msg = string.Format("销售订单No.{0} 不是未审核状态,不能更新!", string.Join(",", cannotUpdateID)); AspUtil.Alert(this, msg); BindGrid(); } static SaleOrderAdjustNumber GetQuery(long goodsPropertyId) { var dom = new DmoQuery(typeof(SaleOrderAdjustNumber)); dom.Where.Conditions.Add(DQCondition.EQ("GoodsProperty_ID", goodsPropertyId)); var r = dom.EExecuteScalar(); return r; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (!IsPostBack) { BindGrid(); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); var pageIndex = _goodsGrid.CurrentPageIndex; var size = _goodsGrid.PageSize; var index = 0; Money unitNum = 0; var number = decimal.Parse(Request.QueryString["number"]); foreach (var detail in Details) { detail.Money = detail.UnitNum * detail.Price; var begin = size * pageIndex; var end = Math.Min(Details.Count, (pageIndex + 1) * size); if (index < begin || index > end - 1) { unitNum += (detail.UnitNum ?? 0); } index++; } var s = string.Format(@"", unitNum, number.ToString("0.00")); Page.ClientScript.RegisterClientScriptBlock(GetType(), "OtherPageNumber", s, false); var script = @" "; script = script.Replace("{GridID}", _goodsGrid.ClientID); script = script.Replace("{allUnitNumlabel}", _l1.ClientID); script = script.Replace("{allleftlabel}", _l2.ClientID); script = script.Replace("{sumUnitNum}", Details.Sum(x => (x.UnitNum ?? 0).Value).ToString()); script = script.Replace("{sumleft}", (number - Details.Sum(x => (x.UnitNum ?? 0).Value)).ToString("0.00")); Page.ClientScript.RegisterStartupScript(this.GetType(), "Startup", script); } private void BindGrid() { var dom = _queryContainer.Build(); var order = dom.From.RootSource.Alias; var detailAlias = new JoinAlias("detail", typeof(Order_Detail)); var goodsPropertyCatalog = new JoinAlias("_gpc", typeof(GoodsPropertyCatalog)); var goodsProperty = new JoinAlias("_gp", typeof(GoodsProperty)); var goods = new JoinAlias("_g", typeof(SaleGoods)); var customer = new JoinAlias("_c", typeof(Customer)); //var storeDetail = new JoinAlias(typeof(StoreDetailTmp)); //var output = new JoinAlias(typeof(OutputTmp)); var flowdetail = new JoinAlias("flowdetail", typeof(DepartmentWorkFlow_Detail)); dom.From.AddJoin(JoinType.Inner, new DQDmoSource(detailAlias), DQCondition.EQ(order, "ID", detailAlias, "Order_ID")); dom.From.AddJoin(JoinType.Left, new DQDmoSource(goods), DQCondition.EQ(detailAlias, "SaleGoods_ID", goods, "ID")); dom.From.AddJoin(JoinType.Left, new DQDmoSource(goodsProperty), DQCondition.EQ(goodsProperty, "ID", goods, "GoodsProperty_ID")); dom.From.AddJoin(JoinType.Left, new DQDmoSource(goodsPropertyCatalog), DQCondition.EQ(goodsProperty, "GoodsPropertyCatalog_ID", goodsPropertyCatalog, "ID")); dom.From.AddJoin(JoinType.Left, new DQDmoSource(customer), DQCondition.EQ(order, "Customer_ID", customer, "ID")); dom.From.AddJoin(JoinType.Left, new DQDmoSource(flowdetail), DQCondition.EQ(order, "DepartmentWorkFlow_Detail_ID", flowdetail, "ID")); OrganizationUtil.RegisterOrganizationQueryTable(dom); //dom.RegisterQueryTable(typeof(StoreDetailTmp), new[] { "GoodsProperty_ID", "Number", "SecondNumber" }, GetStoreDetailDQueryDom()); //dom.RegisterQueryTable(typeof(OutputTmp), new[] { "GoodsProperty_ID", "Number" }, GetOutputDQueryDom()); //dom.From.AddJoin(JoinType.Left, new DQDmoSource(storeDetail), DQCondition.EQ(goodsProperty, "ID", storeDetail, "GoodsProperty_ID")); //dom.From.AddJoin(JoinType.Left, new DQDmoSource(output), DQCondition.EQ(goodsProperty, "ID", output, "GoodsProperty_ID")); dom.Columns.Add(DQSelectColumn.Field("ID", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("UnitNum", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("SecondNumber", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("Number", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("Price", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("PolicyPrice", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("Unit", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("SaleGoods_ID", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("Money", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("Customer_Name", order)); dom.Columns.Add(DQSelectColumn.Field("Order_ID", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("GoodsBatch_ID", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("GoodsBatch_Name", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("LoadTime", order)); dom.Columns.Add(DQSelectColumn.Field("OrderDate", order)); dom.Columns.Add(DQSelectColumn.Field("Goods_SecondUnit", detailAlias)); dom.Columns.Add(DQSelectColumn.Field("Remark", detailAlias)); //dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(storeDetail, "Number").EAdd(DQExpression.Field(output, "Number")), "Number1")); var condition = (IList)ViewStateUtil.Current.LoadFromPersistenceMedium(uint.Parse(Request.QueryString["cacheid"]), true); foreach (var expression in condition) { dom.Where.Conditions.Add(expression); } if (GoodsProperty_ID != null) { dom.Where.Conditions.Add(DQCondition.EQ(goodsProperty, "ID", GoodsProperty_ID)); } OrganizationUtil.AddOrganizationLimit(dom, typeof(Order)); Details.Clear(); using (var context = new TransactionContext()) { using (var reader = context.Session.ExecuteReader(dom)) { while (reader.Read()) { var detail = new Order_DetailExt { ID = (long)reader[0], UnitNum = (Money?)reader[1], SecondNumber = (Money?)reader[2], Number = (Money?)reader[3], Price = (Money?)reader[4], PolicyPrice = (Money?)reader[5], Unit = (string)reader[6], SaleGoods_ID = (long)reader[7], Money = (Money<金额>?)reader[8], Customer_Name = (string)reader[9], Order_ID = (long)reader[10], GoodsBatch_ID = (long?)reader[11], GoodsBatch_Name = (string)reader[12], LoadTime = (DateTime?)reader[13], OrderDate = (DateTime?)reader[14], Goods_SecondUnit = (string)reader[15], Remark = (string)reader[16] }; Details.Add(detail); } } } foreach (var detail in Details) { Dmo.RefreshDependency(detail, "SaleGoods_ID"); } _goodsGrid.DataBind(); _l1.Text = Math.Round(Details.Sum(x => (decimal?)(x.UnitNum) ?? 0), 2).ToString(); _l2.Text = Math.Round(decimal.Parse(Request.QueryString["number"]) - Details.Sum(x => (decimal?)(x.UnitNum) ?? 0), 2).ToString(); txtRealStoreNumber.Text = GetSumRealStoreNumber(Details); } private string GetSumRealStoreNumber(List details) { var join=new JoinAlias(typeof(StoreDetail)); var query = new DQueryDom(join); query.Columns.Add(DQSelectColumn.Sum("Number")); query.Where.Conditions.Add(DQCondition.InList(DQExpression.Field("Goods_ID"), details.Select(x=>DQExpression.Value(x.SaleGoods_ID)).ToArray())); var dd = query.EExecuteScalar?>(); return dd == null ? "0":dd.ToString(); } [DFClass, Serializable] class Order_DetailExt : Order_Detail { [LogicName("发货时间")] public DateTime? LoadTime { get; set; } [LogicName("订货时间")] public DateTime? OrderDate { get; set; } [LogicName("预计库存")] public Money? Number1 { get; set; } [LogicName(" ")] [NonDmoProperty] [DFExtProperty("Width", "1px")] public string ChangeFlag { get; set; } } class StoreDetailTmp { public long GoodsProperty_ID { get; set; } public long Goods_ID { get; set; } [LogicName("主数量")] public Money? Number { get; set; } [LogicName("辅数量")] public Money? SecondNumber { get; set; } } class OutputTmp { public long GoodsProperty_ID { get; set; } public long Goods_ID { get; set; } [LogicName("主数量")] public Money? Number { get; set; } [LogicName("辅数量")] public Money? SecondNumber { get; set; } } DQueryDom GetStoreDetailDQueryDom() { var storeDetail = new JoinAlias(typeof(StoreDetail)); var store = new JoinAlias(typeof(Store)); var query = new DQueryDom(storeDetail); var goodsProperty = new JoinAlias("_s2", typeof(GoodsProperty)); var goods = new JoinAlias("_s3", typeof(SaleGoods)); query.From.AddJoin(JoinType.Left, new DQDmoSource(goods), DQCondition.EQ(storeDetail, "Goods_ID", goods, "ID")); query.From.AddJoin(JoinType.Left, new DQDmoSource(goodsProperty), DQCondition.EQ(goodsProperty, "ID", goods, "GoodsProperty_ID")); if (GoodsProperty_ID != null) { query.Where.Conditions.Add(DQCondition.EQ(goodsProperty, "ID", GoodsProperty_ID)); } query.From.AddJoin(JoinType.Left, new DQDmoSource(store), DQCondition.EQ(store, "ID", storeDetail, "Store_ID")); query.Columns.Add(DQSelectColumn.Field("ID", goodsProperty)); query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("Number")), "主数量")); query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("SecondNumber")), "主数量")); query.GroupBy.Expressions.Add(DQExpression.Field(goodsProperty, "ID")); query.Where.Conditions.Add(DQCondition.EQ(store, "Domain_ID", DomainContext.Current.ID)); return query; } DQueryDom GetOutputDQueryDom() { var dom = new DQueryDom(new JoinAlias(typeof(OutputForecast))); dom.Columns.Add(DQSelectColumn.Max("ID")); dom.Where.Conditions.Add(DQCondition.EQ("Domain_ID", DomainContext.Current.ID)); dom.EAddCheckedCondition(dom.From.RootSource.Alias); var id = dom.EExecuteScalar() ?? 0; var detail = new JoinAlias(typeof(OutputForecast_Detail)); var bill = new JoinAlias(typeof(OutputForecast)); var goodsProperty = new JoinAlias("_s5", typeof(GoodsProperty)); var query = new DQueryDom(detail); query.From.AddJoin(JoinType.Inner, new DQDmoSource(bill), DQCondition.EQ(bill, "ID", detail, "OutputForecast_ID")); query.From.AddJoin(JoinType.Left, new DQDmoSource(goodsProperty), DQCondition.EQ(goodsProperty, "ID", detail, "GoodsProperty_ID")); if (GoodsProperty_ID != null) { query.Where.Conditions.Add(DQCondition.EQ(goodsProperty, "ID", GoodsProperty_ID)); } query.Columns.Add(DQSelectColumn.Field("GoodsProperty_ID")); query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("Number")), "主数量")); query.GroupBy.Expressions.Add(DQExpression.Field("GoodsProperty_ID")); query.Where.Conditions.Add(DQCondition.EQ(bill, "ID", id)); query.Where.Conditions.Add(DQCondition.GreaterThan(detail, "GoodsProperty_ID", 0)); return query; } } }