diff --git a/B3QingDaoWanFu.Web/B3QingDaoWanFu.Web.csproj b/B3QingDaoWanFu.Web/B3QingDaoWanFu.Web.csproj index de5cc0d..80f4b76 100644 --- a/B3QingDaoWanFu.Web/B3QingDaoWanFu.Web.csproj +++ b/B3QingDaoWanFu.Web/B3QingDaoWanFu.Web.csproj @@ -84,6 +84,10 @@ ..\..\..\tsref\Debug\B3Sale.Web.dll False + + False + ..\..\..\tsref\Debug\B3SaleInterface.dll + False D:\BwpB3Project\tsref\Debug\B3UnitedInfos.dll @@ -183,9 +187,15 @@ ASPXCodeBehind + + ASPXCodeBehind + ASPXCodeBehind + + ASPXCodeBehind + ASPXCodeBehind @@ -201,6 +211,9 @@ ASPXCodeBehind + + ASPXCodeBehind + ASPXCodeBehind diff --git a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Overlays/OrderEdit_Ext.cs b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Overlays/OrderEdit_Ext.cs new file mode 100644 index 0000000..1242d42 --- /dev/null +++ b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Overlays/OrderEdit_Ext.cs @@ -0,0 +1,184 @@ +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(session, typeof(Order), "RowVersion", Dmo.ID); + if (rowVersion != Dmo.RowVersion) + throw new Exception("当前单据已被更改,请重新打开"); + } + + Tuple 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(session); + } + + bool CombineOrder(IDmoSession session, long id, bool existSaleOut) + { + var bl = BIFactory.Create(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(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; + saleOut.Details.Add(first); + } + 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); + } + + } +} diff --git a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Overlays/SaleOutStoreList_Ext.cs b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Overlays/SaleOutStoreList_Ext.cs new file mode 100644 index 0000000..5a0b0cf --- /dev/null +++ b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Overlays/SaleOutStoreList_Ext.cs @@ -0,0 +1,32 @@ +using BWP.B3Sale.BO; +using BWP.Web.Pages.B3Sale.Bills.SaleOutStore_; +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; + +namespace BWP.Web.Pages.B3QingDaoWanFu.Overlays +{ + class SaleOutStoreList_Ext : SaleOutStoreList + { + protected override DQueryDom GetQueryDom() + { + var query = base.GetQueryDom(); + query.OrderBy.Expressions.Clear(); + //if (query.OrderBy.Expressions.Count == 0) + //{ + var root = query.From.RootSource.Alias; + var lineDetail = new JoinAlias("lineDetail", typeof(DeliverGoodsLine_Detail)); + query.From.AddJoin(JoinType.Left, new DQDmoSource(lineDetail), DQCondition.And(DQCondition.EQ(root, "DeliverGoodsLine_ID", lineDetail, "DeliverGoodsLine_ID"), DQCondition.EQ(root, "Customer_ID", lineDetail, "Customer_ID"))); + + query.OrderBy.Expressions.Add(DQOrderByExpression.Create(root, "SequenceNumber")); + query.OrderBy.Expressions.Add(DQOrderByExpression.Create(lineDetail, "SequenceNumber")); + //} + + return query; + } + } +} diff --git a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Reports/SaleSummaryReport_/SaleSummaryReport.cs b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Reports/SaleSummaryReport_/SaleSummaryReport.cs new file mode 100644 index 0000000..aaea987 --- /dev/null +++ b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Reports/SaleSummaryReport_/SaleSummaryReport.cs @@ -0,0 +1,384 @@ +using BWP.B3Frameworks; +using BWP.B3Frameworks.BO; +using BWP.B3Frameworks.BO.MoneyTemplate; +using BWP.B3Frameworks.BO.NamedValueTemplate; +using BWP.B3Sale.BO; +using BWP.Web.Utils; +using Forks.EnterpriseServices.DomainObjects2; +using Forks.EnterpriseServices.DomainObjects2.DQuery; +using Forks.EnterpriseServices.SqlDoms; +using Forks.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Web.UI; +using TSingSoft.WebControls2; +using TSingSoft.WebPluginFramework; + +namespace BWP.Web.Pages.B3QingDaoWanFu.Reports.SaleSummaryReport_ +{ + class SaleSummaryReport : ClickQueryReportPage + { + protected override string AccessRoleName + { + get { return "B3QingDaoWanFu.报表.销售统计表"; } + } + + protected override string Caption + { + get { return "销售统计表"; } + } + + protected override void InitDFGrid(DFGrid mDfGrid) + { + base.InitDFGrid(mDfGrid); + mDfGrid.AllowRowGroup = true; + mDfGrid.AllowColGroup = true; + mDfGrid.AllowSorting = true; + mDfGrid.HeaderPagerLock = true; + } + + DateTime SelectDate + { + get + { + if (ViewState["SelectDate"] == null) + ViewState["SelectDate"] = DateTime.Today; + return (DateTime)ViewState["SelectDate"]; + } + set { ViewState["SelectDate"] = value; } + } + + static FilterTree monthTree, dayTree; + + protected override void CreateQueryPanel(VLayoutPanel vPanel) + { + var tablePanel = vPanel.Add(new TableLayoutPanel(1, 4), new VLayoutOption(System.Web.UI.WebControls.HorizontalAlign.Justify)); + + tablePanel.Add(0, 1, 0, 1, CreateMonth()); + tablePanel.Add(0, 1, 1, 2, CreateDay()); + tablePanel.Add(0, 1, 2, 3, CreateFirstDept()); + tablePanel.Add(0, 1, 3, 4, CreateSecondDept()); + } + + private Control CreateMonth() + { + monthTree = new FilterTree() { DisableCancelSelectButton = true }; + monthTree.HorizontalRepeatColumns = 10; + this.Load += delegate + { + if (!IsPostBack) + { + monthTree.DataSource.Childs.Clear(); + var selected = false; + for (var i = 0; i < 6; i++) + { + var date = DateTime.Today.AddMonths(i - 5); + var v = date.ToString("yyyy-MM"); + var node = new FilterTreeNode(v, v, date); + if (!selected && date.Year == SelectDate.Year && date.Month == SelectDate.Month) + { + node.Selected = true; + selected = true; + } + monthTree.DataSource.Childs.Add(node); + } + } + }; + + monthTree.Select += (sender, e) => + { + var dt = (DateTime)monthTree.GetSelecteItem().Tag; + SelectDate = new DateTime(dt.Year, dt.Month, Math.Min(SelectDate.Day, DateTime.DaysInMonth(dt.Year, dt.Month))); + BuildDayTree(); + }; + monthTree.FilterAction = (query, node) => { }; + mTreeContainer.Add("monthTree", monthTree); + return monthTree; + } + + private Control CreateDay() + { + dayTree = new FilterTree() { DisableCancelSelectButton = true }; + dayTree.HorizontalRepeatColumns = 31; + this.Load += delegate + { + if (!IsPostBack) + BuildDayTree(); + }; + dayTree.Select += (sender, e) => + { + SelectDate = new DateTime(SelectDate.Year, SelectDate.Month, int.Parse(dayTree.GetSelecteItem().Value)); + }; + dayTree.FilterAction = (query, node) => { }; + mTreeContainer.Add("dayTree", dayTree); + return dayTree; + } + + void BuildDayTree() + { + dayTree.DataSource.Childs.Clear(); + var total = DateTime.DaysInMonth(SelectDate.Year, SelectDate.Month); + bool selected = false; + for (var i = 1; i <= total; i++) + { + var node = new FilterTreeNode(i.ToString(), i.ToString()); + if (!selected && SelectDate.Day == i) + { + node.Selected = true; + selected = true; + } + dayTree.DataSource.Childs.Add(node); + } + } + + List> FirstDepts + { + get + { + if (ViewState["FirstDepts"] == null) + ViewState["FirstDepts"] = GetFirstDepts(); + return (List>)ViewState["FirstDepts"]; + } + set { ViewState["FirstDepts"] = value; } + } + + List> GetFirstDepts() + { + var dept = SaleDepartmentInfo; + var query = new DQueryDom(new JoinAlias(typeof(Department))); + query.Columns.Add(DQSelectColumn.Field("ID")); + query.Columns.Add(DQSelectColumn.Field("Name")); + query.Columns.Add(DQSelectColumn.Field("Depth")); + query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Domain_ID", DomainContext.Current.ID), DQCondition.EQ("Stopped", false), DQCondition.EQ("Depth", dept.Item2 + 1))); + query.Where.Conditions.Add(DQCondition.EQ(string.Format("TreeDeep{0}ID", dept.Item2), dept.Item1)); + query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID")); + return query.EExecuteList(); + } + + Tuple SaleDepartmentInfo + { + get + { + if (ViewState["SaleDepartmentInfo"] == null) + { + var dept = WebBLUtil.GetSingleDmo("Name", "销售部", "ID", "Depth"); + if (dept == null) + throw new Exception("没有名称为销售部的部门"); + ViewState["SaleDepartmentInfo"] = new Tuple(dept.ID, dept.Depth); + } + return (Tuple)ViewState["SaleDepartmentInfo"]; + } + } + + List> SecondDepts + { + get + { + if (ViewState["SecondDepts"] == null) + ViewState["SecondDepts"] = GetSecondDepts(); + return (List>)ViewState["SecondDepts"]; + } + set { ViewState["SecondDepts"] = value; } + } + + List> GetSecondDepts() + { + var selectedItem = firstFilterTree.GetSelecteItem(); + if (!selectedItem.Selected || string.IsNullOrEmpty(selectedItem.Value)) + return new List>(); + var info = selectedItem.Tag as Tuple; + var query = new DQueryDom(new JoinAlias(typeof(Department))); + query.Columns.Add(DQSelectColumn.Field("ID")); + query.Columns.Add(DQSelectColumn.Field("Name")); + query.Columns.Add(DQSelectColumn.Field("Depth")); + query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Domain_ID", DomainContext.Current.ID), DQCondition.EQ("Stopped", false), DQCondition.EQ("Depth", info.Item3 + 1))); + query.Where.Conditions.Add(DQCondition.EQ(string.Format("TreeDeep{0}ID", info.Item3), info.Item1)); + query.OrderBy.Expressions.Add(DQOrderByExpression.Create("ID")); + return query.EExecuteList(); + } + + static FilterTree firstFilterTree; + private Control CreateFirstDept() + { + firstFilterTree = new FilterTree() { AllLinkOnFirst = true }; + firstFilterTree.HorizontalRepeatColumns = 10; + this.Load += delegate + { + if (!IsPostBack) + { + firstFilterTree.DataSource.Childs.Clear(); + foreach (var item in FirstDepts) + { + var node = new FilterTreeNode(item.Item2, item.Item1.ToString()); + node.Tag = item; + firstFilterTree.DataSource.Childs.Add(node); + } + } + }; + + mTreeContainer.Add("First", firstFilterTree); + firstFilterTree.Select += (sender, e) => + { + SecondDepts = GetSecondDepts(); + BuildSecond(); + }; + firstFilterTree.FilterAction = (query, node) => + { + if (!string.IsNullOrEmpty(node.Value)) + { + var info = node.Tag as Tuple; + query.Where.Conditions.Add(DQCondition.EQ(JoinAlias.Create("dept"), string.Format("TreeDeep{0}ID", info.Item3), info.Item1)); + } + }; + + return firstFilterTree; + } + + void BuildSecond() + { + secondFilterTree.DataSource.Childs.Clear(); + foreach (var item in SecondDepts) + { + var node = new FilterTreeNode(item.Item2, item.Item1.ToString()); + node.Tag = item; + secondFilterTree.DataSource.Childs.Add(node); + } + } + + static FilterTree secondFilterTree; + private Control CreateSecondDept() + { + secondFilterTree = new FilterTree() { AllLinkOnFirst = true }; + secondFilterTree.HorizontalRepeatColumns = 10; + this.Load += delegate + { + if (!IsPostBack) + BuildSecond(); + }; + + mTreeContainer.Add("Second", secondFilterTree); + secondFilterTree.FilterAction = (query, node) => + { + if (!string.IsNullOrEmpty(node.Value)) + { + var info = node.Tag as Tuple; + query.Where.Conditions.Add(DQCondition.EQ(JoinAlias.Create("dept"), string.Format("TreeDeep{0}ID", info.Item3), info.Item1)); + } + }; + + return secondFilterTree; + } + + readonly string[] goodsBrand = new string[] { "条类", "分割品", "副产品", "冻品" }; + + protected override DQueryDom GetQueryDom() + { + var saleDepth = SaleDepartmentInfo.Item2; + var main = new JoinAlias(typeof(TempClass)); + var dept = new JoinAlias("dept", typeof(Department)); + var _3Dept = new JoinAlias("_3Dept", typeof(Department)); + var customer = new JoinAlias(typeof(Customer)); + var goods = new JoinAlias(typeof(SaleGoods)); + var query = new DQueryDom(main); + TempClass.Register(query, SelectDate); + query.From.AddJoin(JoinType.Left, new DQDmoSource(dept), DQCondition.EQ(main, "Department_ID", dept, "ID")); + query.From.AddJoin(JoinType.Left, new DQDmoSource(_3Dept), DQCondition.EQ(DQExpression.LogicCase(DQCondition.GreaterThanOrEqual(dept, "Depth", saleDepth + 3), DQExpression.Field(dept, string.Format("TreeDeep{0}ID", SaleDepartmentInfo.Item2 + 3)), DQCondition.EQ(dept, "Depth", saleDepth + 2), DQExpression.Field(dept, string.Format("TreeDeep{0}ID", SaleDepartmentInfo.Item2 + 2)), DQExpression.Field(dept, string.Format("TreeDeep{0}ID", SaleDepartmentInfo.Item2 + 1))), DQExpression.Field(_3Dept, "ID"))); + query.From.AddJoin(JoinType.Left, new DQDmoSource(customer), DQCondition.EQ(main, "Customer_ID", customer, "ID")); + query.From.AddJoin(JoinType.Left, new DQDmoSource(goods), DQCondition.EQ(main, "Goods_ID", goods, "ID")); + + query.Columns.Add(DQSelectColumn.Field("Name", _3Dept, "销售部门")); + query.GroupBy.Expressions.Add(DQExpression.Field(_3Dept, "Name")); + query.Columns.Add(DQSelectColumn.Field("ExtensionsCatalog1_Name", customer, "客户分类")); + query.GroupBy.Expressions.Add(DQExpression.Field(customer, "ExtensionsCatalog1_Name")); + query.GroupBy.Expressions.Add(DQExpression.Field(_3Dept, "ID")); + query.OrderBy.Expressions.Add(DQOrderByExpression.Create(_3Dept, "ID")); + foreach (var item in goodsBrand) + { + if (item == "条类") + { + query.Columns.Add(DQSelectColumn.Create(DQExpression.Divide(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ(goods, "Brand", item), DQCondition.EQ("Type", 2)), DQExpression.Field("SecondNumber"), DQExpression.NULL)), DQExpression.Value(7)).ECastType?>(), item + "|上周日均头数")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ(goods, "Brand", item), DQCondition.EQ("Type", 1)), DQExpression.Field("SecondNumber"), DQExpression.NULL)).ECastType?>(), item + "|头数")); + } + + query.Columns.Add(DQSelectColumn.Create(DQExpression.Divide(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ(goods, "Brand", item), DQCondition.EQ("Type", 2)), DQExpression.Field("MainNumber"), DQExpression.NULL)), DQExpression.Value(7)).ECastType?>(), item + "|上周日均重量")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ(goods, "Brand", item), DQCondition.EQ("Type", 1)), DQExpression.Field("MainNumber"), DQExpression.NULL)).ECastType?>(), item + "|重量")); + } + + query.Columns.Add(DQSelectColumn.Create(DQExpression.Divide(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ("Type", 2), DQCondition.InEQ(goods, "Brand", "熟食")), DQExpression.Field("MainNumber"), DQExpression.NULL)), DQExpression.Value(7)).ECastType?>(), "上周日均重量")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ("Type", 1), DQCondition.InEQ(goods, "Brand", "熟食")), DQExpression.Field("MainNumber"), DQExpression.NULL)).ECastType?>(), "当日重量合计")); + + + query.Columns.Add(DQSelectColumn.Create(DQExpression.Divide(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ(goods, "Brand", "熟食"), DQCondition.EQ("Type", 2)), DQExpression.Field("MainNumber"), DQExpression.NULL)), DQExpression.Value(7)).ECastType?>(), "熟食|上周日均重量")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.LogicCase(DQCondition.And(DQCondition.EQ(goods, "Brand", "熟食"), DQCondition.EQ("Type", 1)), DQExpression.Field("MainNumber"), DQExpression.NULL)).ECastType?>(), "熟食|重量")); + + var idx = 0; + foreach (var col in query.Columns) + { + ColumnNames.Add(col.Name); + if (idx > 1) + { + SumColumnNames.Add(col.Name); + GroupSumColumnNamnes.Add(col.Name); + } + idx++; + } + + return query; + } + + class TempClass + { + public long? Department_ID { get; set; } + + public long? Customer_ID { get; set; } + + public long? Goods_ID { get; set; } + + public int Type { get; set; } + + public Money? MainNumber { get; set; } + + public Money? SecondNumber { get; set; } + + public static void Register(DQueryDom root, DateTime date) + { + var q1 = GetSaleOutStore(true, date); + q1.UnionNext.Select = GetSaleOutStore(false, date); + + root.RegisterQueryTable(typeof(TempClass), new string[] { "Department_ID", "Customer_ID", "Goods_ID", "Type", "MainNumber", "SecondNumber" }, q1); + } + + static DQueryDom GetSaleOutStore(bool today, DateTime date) + { + var main = new JoinAlias(today + "M", typeof(SaleOutStore)); + var detail = new JoinAlias(today + "D", typeof(SaleOutStore_Detail)); + //var dept = new JoinAlias("dept", typeof(Department)); + var query = new DQueryDom(main); + query.From.AddJoin(JoinType.Inner, new DQDmoSource(detail), DQCondition.EQ(main, "ID", detail, "SaleOutStore_ID")); + // query.From.AddJoin(JoinType.Left, new DQDmoSource(dept), DQCondition.EQ(main, "Department_ID", dept, "ID")); + query.Columns.Add(DQSelectColumn.Field("Department_ID", main)); + query.Columns.Add(DQSelectColumn.Field("Customer_ID", main)); + query.Columns.Add(DQSelectColumn.Field("SaleGoods_ID", detail)); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Value(today ? 1 : 2), "Type")); + query.Columns.Add(DQSelectColumn.Field("UnitNum", detail)); + query.Columns.Add(DQSelectColumn.Field("SecondNumber", detail)); + var timeRange = GetDateRange(today, date); + query.Where.Conditions.Add(DQCondition.And(DQCondition.EQ("Domain_ID", DomainContext.Current.ID), DQCondition.GreaterThanOrEqual("BillState", 单据状态.已审核), DQCondition.Between("LoadTime", timeRange.Item1, timeRange.Item2))); + return query; + } + + static Tuple GetDateRange(bool today, DateTime date) + { + if (today) + return new Tuple(date, date + new TimeSpan(23, 59, 59)); + var d = (int)date.DayOfWeek; + if (date.DayOfWeek == DayOfWeek.Sunday) + d = 7; + var beforeWeek = date.AddDays(-d); + return new Tuple(beforeWeek.AddDays(-6), beforeWeek); + } + } + } +} diff --git a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/CarLoadingBySendLinePage.cs b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/CarLoadingBySendLinePage.cs index 72ef14c..3920fe1 100644 --- a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/CarLoadingBySendLinePage.cs +++ b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/CarLoadingBySendLinePage.cs @@ -26,7 +26,7 @@ using TSingSoft.WebPluginFramework.Controls; namespace BWP.Web.Pages.B3QingDaoWanFu.Tools { - class CarLoadingBySendLinePage:AppBasePage + class CarLoadingBySendLinePage : AppBasePage { private readonly DFInfo _dFInfo = DFInfo.Get(typeof(SaleOutStore)); @@ -58,7 +58,9 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools var btnSearch = new TSButton("开始查询", (sender, e) => { - _slGrid.Query = GetSendLineQuery(_slQueryContainer.Build(), _slChbHidden.Checked); + var min = (DateTime?)_slQueryContainer.GetInput("MinLoadTime"); + var max = (DateTime?)_slQueryContainer.GetInput("MaxLoadTime"); + _slGrid.Query = GetSendLineQuery(_slQueryContainer.Build(), _slChbHidden.Checked, min, max); _slGrid.DataBind(); }); @@ -99,8 +101,8 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools private void CreateSendLineGridColumns() { _slGrid.Columns.Add(new DFBrowseGridColumn("路线")); - _slGrid.Columns.Add(new DFBrowseGridColumn("辅数量")); -// _slGrid.Columns.Add(new DFBrowseGridColumn("AllUnitNum")); + _slGrid.Columns.Add(new DFBrowseGridColumn("SecondNumber", "辅数量")); + // _slGrid.Columns.Add(new DFBrowseGridColumn("AllUnitNum")); var allUnitNumcol = new DFBrowseGridCustomExtColumn((row, cell, rowIndex) => { var allUnitNum = _slGrid.CurrentData.Data.Rows[rowIndex]["AllUnitNum"]; @@ -139,11 +141,10 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools }; cell.Controls.Add(link); cell.Align = "right"; - }) - { HeaderText = "报价数量" }; + }) { HeaderText = "报价数量" }; _slGrid.Columns.EAdd(allUnitNumcol); - _slGrid.Columns.Add(new DFBrowseGridColumn("已派车数量")); + _slGrid.Columns.Add(new DFBrowseGridColumn("AlreadyNumber", "已派车数量")); var thisTimeLoadNum = new DFBrowseGridCustomExtColumn((row, cell, rowIndex) => { var x = new Label(); @@ -152,8 +153,7 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools x.Text = num.ToString(); cell.Controls.Add(x); cell.Align = "right"; - }) - { HeaderText = "本次派车数量" }; + }) { HeaderText = "本次派车数量" }; _slGrid.Columns.Add(thisTimeLoadNum); var staffColumn = new DFEditGridColumn("业务员ID"); staffColumn.InitEditControl += (sender, e) => @@ -233,8 +233,8 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools _slGrid.DataBind(); AspUtil.Alert(this, msg); - -// _carLoadingGrid.DataBind(); + + // _carLoadingGrid.DataBind(); } else { @@ -247,76 +247,84 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools } - private class AreadyLoadBill - { - public long SaleOutStore_ID { get; set; } - } - public static DQueryDom GetSendLineQuery(DQueryDom dom, bool hidden) + + public static DQueryDom GetSendLineQuery(DQueryDom dom, bool hidden, DateTime? min, DateTime? max) { - var areadyLoadBill = new JoinAlias("AreadyLoadBill", typeof(AreadyLoadBill)); + var main = new JoinAlias(typeof(temp2)); + var query = new DQueryDom(main); + OrganizationUtil.RegisterOrganizationQueryTable(query); + AreadyLoadBill.Register(query, min, max); + temp2.Register(query, dom, hidden); var sendLine = new JoinAlias("SendLine", typeof(DeliverGoodsLine)); - var sendLineDetail = new JoinAlias(typeof(DeliverGoodsLine_Detail)); - dom.From.AddJoin(JoinType.Left, new DQDmoSource(sendLineDetail), DQCondition.EQ(sendLineDetail, "Customer_ID", dom.From.RootSource.Alias, "Customer_ID")); - dom.From.AddJoin(JoinType.Left, new DQDmoSource(sendLine), DQCondition.EQ(sendLineDetail, "DeliverGoodsLine_ID", sendLine, "ID")); - dom.RegisterQueryTable(typeof(AreadyLoadBill), new List { "SaleOutStore_ID" }, GetTemDom()); - dom.From.AddJoin(JoinType.Left, new DQDmoSource(areadyLoadBill), DQCondition.EQ(areadyLoadBill, "SaleOutStore_ID", dom.From.RootSource.Alias, "ID")); - - dom.Columns.Clear(); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "ID"), "路线ID")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Name"), "路线")); - dom.GroupBy.Expressions.Add(DQExpression.Field(sendLine, "ID")); - dom.GroupBy.Expressions.Add(DQExpression.Field(sendLine, "Name")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("AllUnitNum")), "AllUnitNum")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("SecondNumber")), "辅数量")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.LogicCase(DQCondition.GreaterThan(DQExpression.Field(areadyLoadBill, "SaleOutStore_ID"), DQExpression.Snippet("0")), DQExpression.Field("AllUnitNum"), DQExpression.NULL)), "已派车数量")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet?>("null"), "本次派车数量")); - -// dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("null"), "业务员ID")); -// dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("''"), "业务员")); + query.From.AddJoin(JoinType.Left, new DQDmoSource(sendLine), DQCondition.EQ(main, "DeliverGoodsLine_ID", sendLine, "ID")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_ID"), "业务员ID")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_Name"), "业务员")); - dom.GroupBy.Expressions.Add(DQExpression.Field(sendLine, "Employee_ID")); - dom.GroupBy.Expressions.Add(DQExpression.Field(sendLine, "Employee_Name")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_ID"), "送货人员ID")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_Name"), "送货人员")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "ID"), "路线ID")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Name"), "路线")); + query.Columns.Add(DQSelectColumn.Field("AllUnitNum", main)); + query.Columns.Add(DQSelectColumn.Field("SecondNumber", main)); + query.Columns.Add(DQSelectColumn.Field("AlreadyNumber", main)); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet?>("null"), "本次派车数量")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_ID"), "业务员ID")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_Name"), "业务员")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_ID"), "送货人员ID")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Employee_Name"), "送货人员")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Car_ID"), "车辆ID")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Car_Name"), "车辆")); + query.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("''"), "Remark")); + return query; + } -// dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("null"), "送货人员ID")); -// dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("''"), "送货人员")); + class temp2 + { + public long? DeliverGoodsLine_ID { get; set; } + public Money? AllUnitNum { get; set; } + public Money? SecondNumber { get; set; } + public Money? AlreadyNumber { get; set; } - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine,"Car_ID"), "车辆ID")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(sendLine, "Car_Name"), "车辆")); - dom.GroupBy.Expressions.Add(DQExpression.Field(sendLine, "Car_ID")); - dom.GroupBy.Expressions.Add(DQExpression.Field(sendLine, "Car_Name")); - // dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("null"), "车辆ID")); - // dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("''"), "车辆")); - dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet("''"), "Remark")); - dom.Where.Conditions.Add(DQCondition.EQ("BillState", 单据状态.未审核)); - dom.Where.Conditions.Add(DQCondition.EQ("TakeGoods_Type", 配送方式.公司配送)); - dom.Where.Conditions.Add(DQCondition.GreaterThan(DQExpression.IfNull(DQExpression.Field(sendLine, "ID"), DQExpression.Snippet("0")), DQExpression.Snippet("0"))); - dom.Where.Conditions.Add(DQCondition.Or( - DQCondition.InEQ(DQExpression.Field("AllUnitNum"), DQExpression.Snippet?>("0")), - DQCondition.InEQ(DQExpression.Field("SecondNumber"), DQExpression.Snippet?>("0")))); - if (hidden) + public static void Register(DQueryDom root, DQueryDom dom, bool hidden) { - dom.Having.Conditions.Add(DQCondition.InEQ(DQExpression.Count(DQExpression.Field("ID")), DQExpression.Count(DQExpression.Field(areadyLoadBill, "SaleOutStore_ID")))); - } + var areadyLoadBill = new JoinAlias("AreadyLoadBill", typeof(AreadyLoadBill)); + dom.From.AddJoin(JoinType.Left, new DQDmoSource(areadyLoadBill), DQCondition.EQ(areadyLoadBill, "SaleOutStore_ID", dom.From.RootSource.Alias, "ID")); - OrganizationUtil.AddOrganizationLimit(dom,typeof(SaleOutStore)); - return dom; + dom.Columns.Clear(); + dom.Columns.Add(DQSelectColumn.Field("DeliverGoodsLine_ID")); + dom.GroupBy.Expressions.Add(DQExpression.Field("DeliverGoodsLine_ID")); + dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("AllUnitNum")), "AllUnitNum")); + dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field("SecondNumber")), "辅数量")); + dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.LogicCase(DQCondition.IsNull(DQExpression.Field(areadyLoadBill, "SaleOutStore_ID")), DQExpression.NULL, DQExpression.Field("AllUnitNum"))), "已派车数量")); + dom.Where.Conditions.Add(DQCondition.EQ("BillState", 单据状态.未审核)); + dom.Where.Conditions.Add(DQCondition.EQ("TakeGoods_Type", 配送方式.公司配送)); + dom.Where.Conditions.Add(DQCondition.IsNotNull(DQExpression.Field("DeliverGoodsLine_ID"))); + dom.Where.Conditions.Add(DQCondition.Or( + DQCondition.InEQ(DQExpression.IfNull(DQExpression.Field("AllUnitNum"), DQExpression.Value(0)), DQExpression.Value(0)), + DQCondition.InEQ(DQExpression.IfNull(DQExpression.Field("SecondNumber"), DQExpression.Value(0)), DQExpression.Value(0)))); + if (hidden) + { + dom.Where.Conditions.Add(DQCondition.IsNull(DQExpression.Field(areadyLoadBill, "SaleOutStore_ID"))); + } + OrganizationUtil.AddOrganizationLimit(dom, typeof(SaleOutStore)); + root.RegisterQueryTable(typeof(temp2), new string[] { "DeliverGoodsLine_ID", "AllUnitNum", "SecondNumber", "AlreadyNumber" }, dom); + } } + } - private static DQueryDom GetTemDom() + public class AreadyLoadBill + { + public long SaleOutStore_ID { get; set; } + public static void Register(DQueryDom root, DateTime? min, DateTime? max) { var carLoadingBillDetail = new JoinAlias(typeof(CarLoading_BillDetail)); var temDom = new DQueryDom(carLoadingBillDetail); - temDom.Columns.Add(DQSelectColumn.Field("BillID", "SaleOutStore_ID")); + temDom.Columns.Add(DQSelectColumn.Field("BillID", carLoadingBillDetail, "SaleOutStore_ID")); + temDom.GroupBy.Expressions.Add(DQExpression.Field(carLoadingBillDetail, "BillID")); + if (min.HasValue) + temDom.Where.Conditions.Add(DQCondition.GreaterThanOrEqual("LoadTime", min)); + if (max.HasValue) + temDom.Where.Conditions.Add(DQCondition.LessThanOrEqual("LoadTime", max)); temDom.Where.Conditions.Add(DQCondition.EQ(carLoadingBillDetail, "BillTypeID", DmoTypeIDAttribute.GetID(typeof(SaleOutStore)))); - temDom.GroupBy.Expressions.Add(DQExpression.Field("BillID")); - return temDom; + root.RegisterQueryTable(typeof(AreadyLoadBill), new string[] { "SaleOutStore_ID" }, temDom); } - } } diff --git a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/SaleOutstoreInfo.cs b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/SaleOutstoreInfo.cs index 228adfb..4f5c2d4 100644 --- a/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/SaleOutstoreInfo.cs +++ b/B3QingDaoWanFu.Web/Pages/B3QingDaoWanFu/Tools/SaleOutstoreInfo.cs @@ -14,6 +14,8 @@ using Forks.EnterpriseServices.SqlDoms; using Forks.Utils; using TSingSoft.WebControls2; using TSingSoft.WebPluginFramework.Controls; +using BWP.B3Frameworks.BO.NamedValueTemplate; +using BWP.B3Sale.Utils; namespace BWP.Web.Pages.B3QingDaoWanFu.Tools { @@ -142,22 +144,31 @@ namespace BWP.Web.Pages.B3QingDaoWanFu.Tools } DQueryDom GetQuery() { - var dom = new DQueryDom(new JoinAlias(typeof(SaleOutStore))); - dom = CarLoadingBySendLinePage.GetSendLineQuery(dom, false); - dom.Columns.Clear(); - dom.GroupBy.Expressions.Clear(); - dom.Having.Conditions.Clear(); + var main = new JoinAlias(typeof(SaleOutStore)); + var dom = new DQueryDom(main); + var detail = new JoinAlias(typeof(AreadyLoadBill)); + AreadyLoadBill.Register(dom, MinTime, MaxTime); + dom.From.AddJoin(JoinType.Left, new DQDmoSource(detail), DQCondition.EQ(main, "ID", detail, "SaleOutStore_ID")); if (MinTime != null) dom.Where.Conditions.Add(DQCondition.GreaterThanOrEqual("LoadTime", MinTime)); if (MaxTime != null) dom.Where.Conditions.Add(DQCondition.LessThanOrEqual("LoadTime", MaxTime)); - dom.Where.Conditions.Add(DQExpression.Snippet("[SendLine].[ID]=" + SendLineID)); - dom.Where.Conditions.Add(DQExpression.Snippet("ISNULL([AreadyLoadBill].[SaleOutStore_ID], 0)=0")); + + dom.Where.Conditions.Add(DQCondition.EQ("DeliverGoodsLine_ID", SendLineID)); + dom.Where.Conditions.Add(DQCondition.IsNull(DQExpression.Field(detail, "SaleOutStore_ID"))); dom.Columns.Add(DQSelectColumn.Field("ID")); dom.Columns.Add(DQSelectColumn.Field("LoadTime")); dom.Columns.Add(DQSelectColumn.Field("Customer_Name")); dom.Columns.Add(DQSelectColumn.Field("AllUnitNum")); dom.Columns.Add(DQSelectColumn.Field("SecondNumber")); + + dom.Where.Conditions.Add(DQCondition.EQ("BillState", 单据状态.未审核)); + dom.Where.Conditions.Add(DQCondition.EQ("TakeGoods_Type", 配送方式.公司配送)); + dom.Where.Conditions.Add(DQCondition.IsNotNull(DQExpression.Field("DeliverGoodsLine_ID"))); + dom.Where.Conditions.Add(DQCondition.Or( + DQCondition.InEQ(DQExpression.IfNull(DQExpression.Field("AllUnitNum"), DQExpression.Value(0)), DQExpression.Value(0)), + DQCondition.InEQ(DQExpression.IfNull(DQExpression.Field("SecondNumber"), DQExpression.Value(0)), DQExpression.Value(0)))); + OrganizationUtil.AddOrganizationLimit(dom, typeof(SaleOutStore)); return dom; } } diff --git a/B3QingDaoWanFu.Web/PluginClass.cs b/B3QingDaoWanFu.Web/PluginClass.cs index c8e86b3..b4578ba 100644 --- a/B3QingDaoWanFu.Web/PluginClass.cs +++ b/B3QingDaoWanFu.Web/PluginClass.cs @@ -30,6 +30,8 @@ namespace BWP.B3QingDaoWanFu WpfPageFactory.RegisterPageOverlay(typeof(WeighBillEdit).FullName, typeof(WeightBillEdit_Ext).FullName); WpfPageFactory.RegisterPageOverlay(typeof(WeighBillList).FullName, typeof(WeighBillList_Ext).FullName); WpfPageFactory.RegisterPageOverlay(typeof(BWP.Web.Pages.B3ButcherManage.Bills.Pay_.SelectStatPayDialog).FullName, typeof(SelectStatPayDialog_Ext).FullName); + WpfPageFactory.RegisterPageOverlay(typeof(BWP.Web.Pages.B3Sale.Bills.SaleOutStore_.SaleOutStoreList).FullName, typeof(SaleOutStoreList_Ext).FullName); + WpfPageFactory.RegisterPageOverlay(typeof(BWP.Web.Pages.B3Sale.Bills.Order_.OrderEdit).FullName, typeof(OrderEdit_Ext).FullName); GlobalFlags.On(B3ButcherManageConsts.GlobalFlags.StatPayAddRewardWithButcherUseWeight); GlobalFlags.On(B3SaleConsts.Flags.MarketingActivityEnableAdjustPrice); GlobalFlags.On(B3SaleConsts.Flags.SendOutStoreNoAvailableStorage); diff --git a/B3QingDaoWanFu/B3QingDaoWanFu.csproj b/B3QingDaoWanFu/B3QingDaoWanFu.csproj index bd4bb1f..df8f8a4 100644 --- a/B3QingDaoWanFu/B3QingDaoWanFu.csproj +++ b/B3QingDaoWanFu/B3QingDaoWanFu.csproj @@ -177,6 +177,7 @@ + diff --git a/B3QingDaoWanFu/Tasks/SyncSaleOutStoreInfoToMES.cs b/B3QingDaoWanFu/Tasks/SyncSaleOutStoreInfoToMES.cs index e0e3499..70db868 100644 --- a/B3QingDaoWanFu/Tasks/SyncSaleOutStoreInfoToMES.cs +++ b/B3QingDaoWanFu/Tasks/SyncSaleOutStoreInfoToMES.cs @@ -98,9 +98,9 @@ namespace BWP.B3QingDaoWanFu.Tasks query.Columns.Add(DQSelectColumn.Field("Flag", scan)); query.Where.Conditions.Add(DQCondition.And(DQCondition.GreaterThanOrEqual("BillState", 单据状态.已审核), DQCondition.IsNull(DQExpression.Field(relate, "SaleOutStore_ID")), DQCondition.IsNotNull(DQExpression.Field(scan, "ID")))); - query.Where.Conditions.Add(DQCondition.And(DQCondition.Or(DQCondition.EQ(scan, "Flag", -1), DQCondition.GreaterThan(scan, "Weight", 0)), DQCondition.GreaterThan(scan, "Number", 0))); - query.Where.Conditions.Add(DQCondition.InEQ(scan, "Flag", 2)); - query.OrderBy.Expressions.Add(DQOrderByExpression.Create(main, "ID")); + + query.Where.Conditions.Add(DQCondition.Or(DQCondition.EQ(scan, "Flag", 0), DQCondition.EQ(scan, "Flag", 1))); + query.OrderBy.Expressions.Add(DQOrderByExpression.Create(scan, "ID")); using (var session = Dmo.NewSession()) { var carcassList = new List(); diff --git a/B3QingDaoWanFu/TypeIOCs/SaleOrderBLTypeIoc.cs b/B3QingDaoWanFu/TypeIOCs/SaleOrderBLTypeIoc.cs new file mode 100644 index 0000000..e8e3d6c --- /dev/null +++ b/B3QingDaoWanFu/TypeIOCs/SaleOrderBLTypeIoc.cs @@ -0,0 +1,146 @@ +using BWP.B3Frameworks; +using BWP.B3Frameworks.BO.NamedValueTemplate; +using BWP.B3Frameworks.Utils; +using BWP.B3QingDaoWanFu.Utils; +using BWP.B3Sale.BL; +using BWP.B3Sale.BO; +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.WebPluginFramework; + +namespace BWP.B3QingDaoWanFu.TypeIOCs +{ + [TypeIOC(typeof(OrderBL), typeof(OrderBL.BaseBLIOCs.AfterInsert))] + public class SaleOrderAfterInsert : OrderBL.BaseBLIOCs.AfterInsert + { + IOrderBL orderBL = null; + public void Invoke(IDmoContext context, Order dmo) + { + if (dmo.SaleForecast_ID == null) + return; + if (new WanFuOnlineConfig().AutoCombineOrder.Value == false) + return; + if (dmo.LoadTime == null) + throw new Exception("订单发货时间为空"); + orderBL = BIFactory.Create(context); + var existInfo = GetExistOrderAndSaleOutStore(context.Session, dmo); + if (existInfo == null) + { + orderBL.Check(dmo); + return; + } + + var ok = CombineOrder(context.Session, dmo, existInfo.Item1, existInfo.Item2.HasValue); + if (!ok) + return; + + if (existInfo.Item2.HasValue) + CombineSaleOutStore(context.Session, dmo, existInfo.Item2.Value); + + } + + Tuple GetExistOrderAndSaleOutStore(IDmoSession session, Order order) + { + 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.InEQ("ID", order.ID), DQCondition.EQ("Customer_ID", order.Customer_ID), DQCondition.EQ(DQExpression.Snippet("CAST([mOrder].[LoadTime] AS DATE)"), DQExpression.Value(order.LoadTime.Value.Date)), DQCondition.InEQ("BillState", 单据状态.已作废))); + query.Where.Conditions.Add(DQCondition.Or(DQCondition.IsNull(DQExpression.Field(saleOut, "BillState")), DQCondition.EQ(saleOut, "BillState", 单据状态.未审核))); + return query.EExecuteScalar(session); + } + + bool CombineOrder(IDmoSession session, Order order, long id, bool existSaleOut) + { + var comb = orderBL.Load(id); + if (comb.Details.Any(x => order.Details.Any(y => x.SaleGoods_ID == y.SaleGoods_ID && x.Price != y.Price))) + return false; + foreach (var detail in order.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); + } + + order.OldOrderID = id; + UpdateOldOrderID(session, order); + SaleForecastBL.CreateOrderContext = null; + orderBL.Nullify(order); + orderBL.Update(comb); + if (comb.BillState == 单据状态.未审核) + orderBL.Check(comb); + order.ID = id; + return true; + } + + void UpdateOldOrderID(IDmoSession session, Order order) + { + var update = new DQUpdateDom(typeof(Order)); + update.Columns.Add(new DQUpdateColumn("OldOrderID", order.OldOrderID)); + update.Where.Conditions.Add(DQCondition.EQ("ID", order.ID)); + session.ExecuteNonQuery(update); + } + + void CombineSaleOutStore(IDmoSession session, Order order, long id) + { + var bl = BIFactory.Create(session); + var saleOut = bl.Load(id); + foreach (var orderDetail in order.Details) + { + var first = saleOut.Details.FirstOrDefault(x => x.SaleGoods_ID == orderDetail.SaleGoods_ID); + if (first == null) + { + var outStoreDetail = new SaleOutStore_Detail(); + DmoUtil.CopyDmoFields(orderDetail, outStoreDetail, "ID"); + outStoreDetail.Order_DetailID = orderDetail.ID; + outStoreDetail.Order_Detail_Number = orderDetail.Number; + outStoreDetail.Order_Detail_SecondNumber = orderDetail.SecondNumber; + outStoreDetail.Order_Detail_UnitNum = orderDetail.UnitNum; + outStoreDetail.HiddenUnitNum = orderDetail.UnitNum; + outStoreDetail.HiddenNumber = orderDetail.Number; + outStoreDetail.HiddenSecondNumber = orderDetail.SecondNumber; + outStoreDetail.IsOutsourcing = orderDetail.IsOutsourcing; + saleOut.Details.Add(outStoreDetail); + } + 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; + } + } + bl.Update(saleOut); + } + } +} diff --git a/B3QingDaoWanFu/Utils/WanFuOnlineConfig.cs b/B3QingDaoWanFu/Utils/WanFuOnlineConfig.cs index ea241b0..3269fd5 100644 --- a/B3QingDaoWanFu/Utils/WanFuOnlineConfig.cs +++ b/B3QingDaoWanFu/Utils/WanFuOnlineConfig.cs @@ -74,6 +74,13 @@ namespace BWP.B3QingDaoWanFu.Utils public IntConfigRef DomainUserForTrustPay { get { return _domainUserForTrustPay; } set { _domainUserForTrustPay = value; } - } + } + + private BoolConfigRef _mAutoCombineOrder = new BoolConfigRef(false); + [LogicName("自动合并订单")] + [ConfigurationItemGroup("青岛万福")] + [ConfigurationItemDescription("新建订单时(包括审核销售预报生成和手机app生成的)自动合并,如果合并到的订单有已审核出库单就不合并,价格不同也不合并)")] + [DomainConfigurationItem] + public BoolConfigRef AutoCombineOrder { get { return _mAutoCombineOrder; } set { _mAutoCombineOrder = value; } } } } diff --git a/WebFolder/config/plugins/B3QingDaoWanFu.plugin b/WebFolder/config/plugins/B3QingDaoWanFu.plugin index ed44383..f93629d 100644 --- a/WebFolder/config/plugins/B3QingDaoWanFu.plugin +++ b/WebFolder/config/plugins/B3QingDaoWanFu.plugin @@ -29,6 +29,7 @@ + @@ -82,6 +83,7 @@ +