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 @@
+