You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

322 lines
20 KiB

using BWP.B3Frameworks;
using BWP.B3Frameworks.BO.NamedValueTemplate;
using BWP.B3Sale.BO;
using BWP.B3Sale.Utils;
using BWP.Web.Layout;
using BWP.Web.Utils;
using BWP.Web.WebControls;
using Forks.EnterpriseServices.DataForm;
using Forks.EnterpriseServices.DomainObjects2;
using Forks.EnterpriseServices.DomainObjects2.DQuery;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;
using TSingSoft.WebControls2;
using TSingSoft.WebControls2.QBELinks;
using Forks.EnterpriseServices.SqlDoms;
using BWP.B3_YunKen.BO;
using BWP.B3UnitedInfos;
using Forks.Utils;
namespace BWP.Web.Pages.B3YunKen.Reports
{
public class ToFreightNetPriceReport : DFBrowseGridReportPage
{
protected override string AccessRoleName
{
get
{
return "B3_YunKen.报表分析.去运费净价表";
}
}
protected override string Caption
{
get { return "去运费净价表"; }
}
CheckBoxListWithReverseSelect checkbox;
DFChoiceBox _goods, _goodsPropertyCatalog, _brandItem, _productLine, _goodsBatch;
private readonly DFInfo mDFInfo = DFInfo.Get(typeof(SaleOutStore));
private readonly DFInfo _detailInfo = DFInfo.Get(typeof(SaleOutStore_Detail));
protected override void InitQueryPanel(QueryPanel queryPanel)
{
base.InitQueryPanel(queryPanel);
var panel = queryPanel.CreateTab("显示字段");
checkbox = new CheckBoxListWithReverseSelect() { RepeatColumns = 6, RepeatDirection = RepeatDirection.Horizontal };
var list = new List<Tuple<string, string>>();
list.Add(new Tuple<string, string>("YearOfLoadTime", "每年"));
list.Add(new Tuple<string, string>("TenDaysOfLoadTime", "每旬"));
list.Add(new Tuple<string, string>("MonthOfLoadTime", "每月"));
list.Add(new Tuple<string, string>("WeekOfLoadTime", "每周"));
list.Add(new Tuple<string, string>("DayOfLoadTime", "每日"));
list.Add(new Tuple<string, string>("Code", "出库编号"));
list.Add(new Tuple<string, string>("Remark", "备注"));
list.Add(new Tuple<string, string>("AccountingUnit_Name", "会计单位"));
list.Add(new Tuple<string, string>("CustomerCatalog_Name", "客户分类"));
list.Add(new Tuple<string, string>("AccountCustomer_Name", "结账客户"));
list.Add(new Tuple<string, string>("Customer_DeliveryPhone", "联系方式"));
list.Add(new Tuple<string, string>("OrderDate", "订货时间"));
list.Add(new Tuple<string, string>("LoadTime", "发货时间"));
list.Add(new Tuple<string, string>("ArriveTime", "到货时间"));
list.Add(new Tuple<string, string>("Department_Name", "部门"));
list.Add(new Tuple<string, string>("CustomerSaleZone_Name", "地区"));
list.Add(new Tuple<string, string>("SaleKind_Name", "销售类型"));
list.Add(new Tuple<string, string>("Employee_Name", "销售人员"));
list.Add(new Tuple<string, string>("AccountCustomer_CreditPolicy_Name", "信用政策"));
list.Add(new Tuple<string, string>("FreightMoney", "运费"));
list.Add(new Tuple<string, string>("Money", "金额"));
list.Add(new Tuple<string, string>("Store_Name", "仓库"));
list.Add(new Tuple<string, string>("DeliverAddress", "送货地址"));
list.Add(new Tuple<string, string>("TakeGoods_Type", "配送方式"));
list.Add(new Tuple<string, string>("Driver_Name", "司机"));
list.Add(new Tuple<string, string>("Driver_Telephone", "司机电话"));
list.Add(new Tuple<string, string>("HandcarNumber", "车牌号"));
list.Add(new Tuple<string, string>("GoodsPropertyCatalog_Name", "存货属性分类"));
list.Add(new Tuple<string, string>("Goods_Name", "存货名称"));
list.Add(new Tuple<string, string>("BrandItem_Name", "品牌"));
list.Add(new Tuple<string, string>("PackingMoney", "包装费"));
list.Add(new Tuple<string, string>("Goods_SecondUnit", "辅单位"));
list.Add(new Tuple<string, string>("SecondNumber", "辅数量"));
list.Add(new Tuple<string, string>("Unit", "报价单位"));
list.Add(new Tuple<string, string>("UnitNum", "报价数量"));
list.Add(new Tuple<string, string>("Price", "平均销价"));
list.Add(new Tuple<string, string>("NetPrice", "去包装净价"));
list.Add(new Tuple<string, string>("ToFreightNetPrice", "去运费单价"));
list.Add(new Tuple<string, string>("PolicyPrice", "政策价格"));
var section = mPageLayoutManager.AddSection("显示字段", "显示字段");
section.ApplyLayout(list, mPageLayoutManager);
foreach (var item in list)
{
section.SetDisplayName(item.Item1, item.Item2);
checkbox.Items.Add(new ListItem(item.Item2, item.Item1));
}
panel.EAdd(checkbox);
mQueryControls.Add("显示字段", checkbox);
mQueryControls.EnableHoldLastControlNames.Add("显示字段");
}
protected override void AddQueryControls(VLayoutPanel vPanel)
{
var layout = new LayoutManager("main", mDFInfo, mQueryContainer);
layout.Add("AccountingUnit_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["AccountingUnit_ID"],
B3FrameworksConsts.DataSources.), s => long.Parse(s)), "AccountingUnit_ID"));
layout["AccountingUnit_ID"].NotAutoAddToContainer = true;
layout.Add("Goods_ID", new SimpleLabel("存货"), mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(_goods = QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["ID"], B3SaleDataSources.), s => long.Parse(s)), "Goods_ID"));
layout["Goods_ID"].NotAutoAddToContainer = true;
layout.Add("GoodsPropertyCatalog_ID", new SimpleLabel("属性分类"), _goodsPropertyCatalog = new DFChoiceBox() { DataKind = B3UnitedInfosConsts.DataSources., Width = Unit.Empty, EnableTopItem = true, EnableMultiSelection = true, EnableMultiSelectionViewer = true, EnableInputArgument = true }, false);
layout["GoodsPropertyCatalog_ID"].NotAutoAddToContainer = true;
layout.Add("ProductLine_ID", new SimpleLabel("产品线"), mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(_productLine = QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["ID"], B3UnitedInfosConsts.DataSources.线), s => long.Parse(s)), "ProductLine_ID"));
layout["ProductLine_ID"].NotAutoAddToContainer = true;
layout.Add("CustomerCatalog_ID", new SimpleLabel("客户分类"), mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["CustomerCatalog_ID"], B3SaleDataSources.), s => long.Parse(s)), "CustomerCatalog_ID"));
layout["CustomerCatalog_ID"].NotAutoAddToContainer = true;
layout.Add("Customer_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["Customer_ID"],
B3SaleDataSources.), s => long.Parse(s)), "Customer_ID"));
layout["Customer_ID"].NotAutoAddToContainer = true;
layout.Add("AccountCustomer_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["AccountCustomer_ID"],
B3SaleDataSources.), s => long.Parse(s)), "AccountCustomer_ID"));
layout["AccountCustomer_ID"].NotAutoAddToContainer = true;
layout.Add("Department_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["Department_ID"], B3FrameworksConsts.DataSources.), s => long.Parse(s)), "Department_ID"));
layout["Department_ID"].NotAutoAddToContainer = true;
layout.Add("Employee_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["Employee_ID"], B3FrameworksConsts.DataSources.), s => long.Parse(s)), "Employee_ID"));
layout["Employee_ID"].NotAutoAddToContainer = true;
layout.Add("CustomerSaleZone_ID", new SimpleLabel("销售地区"), mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["CustomerSaleZone_ID"], B3SaleDataSources.)), "CustomerSaleZone_ID"));
layout["CustomerSaleZone_ID"].NotAutoAddToContainer = true;
layout.Add("Store_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["Store_ID"], B3FrameworksConsts.DataSources.), s => long.Parse(s)), "Store_ID"));
layout["Store_ID"].NotAutoAddToContainer = true;
layout.Add("SaleKind_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["SaleKind_ID"], B3SaleDataSources.), s => long.Parse(s)), "SaleKind_ID"));
layout["SaleKind_ID"].NotAutoAddToContainer = true;
layout.Add("Car_ID", mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["Car_ID"], B3SaleDataSources.), s => long.Parse(s)), "Car_ID"));
layout["Car_ID"].NotAutoAddToContainer = true;
layout.Add("GoodsBatch_ID", new SimpleLabel("存货批次"), mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(_goodsBatch = QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["ID"], B3UnitedInfosConsts.DataSources.), s => long.Parse(s)), "GoodsBatch_ID"));
layout["GoodsBatch_ID"].NotAutoAddToContainer = true;
layout.Add("BrandItem_ID", new SimpleLabel("品牌项"),mQueryContainer.AddLink(new ChoiceBoxMultiSelectLink(_brandItem = QueryCreator.DFChoiceBoxEnableMultiSelection(mDFInfo.Fields["Car_ID"], B3UnitedInfosConsts.DataSources.), s => long.Parse(s)), "BrandItem_ID"));
layout["BrandItem_ID"].NotAutoAddToContainer = true;
var config = layout.CreateDefaultConfig(2);
config.Expand = false;
//config.Add("LoadTime");
//config.Add("OrderDate");
//config.Add("AccountingUnit_ID");
//config.Add("Goods_ID");
//config.Add("GoodsPropertyCatalog_ID");
//config.Add("ProductLine_ID");
//config.Add("CustomerCatalog_ID");
//config.Add("Customer_ID");
//config.Add("AccountCustomer_ID");
//config.Add("Department_ID");
//config.Add("Employee_ID");
//config.Add("SaleZone_ID");
//config.Add("Store_ID");
//config.Add("SaleKind_ID");
//config.Add("Car_ID");
//config.Add("GoodsBatch_ID");
//config.Add("BrandItem_ID");
layout.Config = config;
var section = mPageLayoutManager.AddSection("查询条件", "查询条件");
section.ApplyLayout(layout, config, mPageLayoutManager, mDFInfo);
vPanel.Add(layout.CreateLayout(), new VLayoutOption(HorizontalAlign.Center));
}
class PackageData
{
public long? Goods_ID { get; set; }
public Money<decimal>? Price { get; set; }
public long? AccountingUnit_ID { get; set; }
}
private DQueryDom GetGoods_Package()
{
var goods_Package = new JoinAlias(typeof(Goods_Package));
var wrappage = new JoinAlias(typeof(Wrappage));
var query = new DQueryDom(goods_Package);
query.From.AddJoin(JoinType.Left, new DQDmoSource(wrappage), DQCondition.EQ(wrappage, "ID", goods_Package, "Package_ID"));
query.Columns.Add(DQSelectColumn.Field("Goods_ID", goods_Package));
query.Columns.Add(DQSelectColumn.Field("Price", goods_Package));
query.Columns.Add(DQSelectColumn.Field("AccountingUnit_ID", wrappage));
return query;
}
protected override DQueryDom GetQueryDom()
{
var dom = base.GetQueryDom();
var main = JoinAlias.Create("main");
var detail = new JoinAlias(typeof(SaleOutStore_Detail));
var goods = new JoinAlias(typeof(SaleGoods));
var packageData = new JoinAlias(typeof(PackageData));
dom.RegisterQueryTable(typeof(PackageData), new string[] { "Goods_ID", "Price", "AccountingUnit_ID" }, GetGoods_Package());
dom.From.AddJoin(JoinType.Left, new DQDmoSource(detail),
DQCondition.EQ(main, "ID", detail, "SaleOutStore_ID"));
dom.From.AddJoin(JoinType.Left, new DQDmoSource(packageData),
DQCondition.And(DQCondition.EQ(packageData, "Goods_ID", detail, "SaleGoods_ID"), DQCondition.EQ(packageData, "AccountingUnit_ID", main, "AccountingUnit_ID")));
dom.From.AddJoin(JoinType.Left, new DQDmoSource(goods),
DQCondition.EQ(goods, "ID", detail, "SaleGoods_ID"));
var freightMoney = DQExpression.LogicCase(DQExpression.EQ(DQExpression.Field(main, "FreightBear"), DQExpression.Value(.)), DQExpression.NULL, DQExpression.Multiply(DQExpression.Field(main, "FreightPrice"), DQExpression.Divide(DQExpression.Field(detail, "UnitNum"), DQExpression.NullIfZero(DQExpression.Field(main, "AllUnitNum")))));
foreach (ListItem item in checkbox.Items)
{
if (!item.Selected) { continue; }
var field = item.Value;
switch (field) {
case "YearOfLoadTime":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet<string>("Left(Convert(nvarchar(10),main.LoadTime, 23),4)"), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(main, "LoadTime"));
break;
case "MonthOfLoadTime":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet<string>("Left(Convert(nvarchar(10),main.LoadTime, 23),7)"), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(main, "LoadTime"));
break;
case "TenDaysOfLoadTime":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet<string>(@"CASE WHEN day(main.LoadTime) > 0 AND day(main.LoadTime)<= 10
THEN cast(YEAR(main.LoadTime)as nvarchar)+'年'+cast(MONTH(main.LoadTime)as nvarchar) + '月上旬'
WHEN day(main.LoadTime) > 10 AND day(main.LoadTime)<= 20
THEN cast(YEAR(main.LoadTime)as nvarchar)+'年'+cast(MONTH(main.LoadTime)as nvarchar) + '月中旬'
WHEN day(main.LoadTime) > 20
THEN cast(YEAR(main.LoadTime)as nvarchar)+'年'+cast(MONTH(main.LoadTime)as nvarchar) + '月下旬' END"), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(main, "LoadTime"));
break;
case "WeekOfLoadTime":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet<string>("convert(nvarchar(10), dateadd(day,1-(datepart(weekday,main.LoadTime)+@@datefirst-1)%7,main.LoadTime),23)+'~'+convert(nvarchar(10),dateadd(day,7-(datepart(weekday,main.LoadTime)+@@datefirst-1)%7,main.LoadTime),23)"), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(main, "LoadTime"));
break;
case "DayOfLoadTime":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Snippet<string>("Convert(nvarchar(10),main.LoadTime, 23)"), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(main, "LoadTime"));
break;
case "Code":
case "Remark":
case "AccountingUnit_Name":
case "CustomerCatalog_Name":
case "AccountCustomer_Name":
case "Customer_DeliveryPhone":
case "OrderDate":
case "LoadTime":
case "ArriveTime":
case "Department_Name":
case "CustomerSaleZone_Name":
case "SaleKind_Name":
case "Employee_Name":
case "AccountCustomer_CreditPolicy_Name":
case "DeliverAddress":
case "TakeGoods_Type":
case "Driver_Name":
case "Driver_Telephone":
case "HandcarNumber":
case "Store_Name":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(main, field), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(main, field));
break;
case "GoodsPropertyCatalog_Name":
case "Goods_Name":
case "BrandItem_Name":
case "Goods_SecondUnit":
case "Unit":
case "PolicyPrice":
case "Price":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Field(detail, field), item.Text));
dom.GroupBy.Expressions.Add(DQExpression.Field(detail, field));
break;
case "FreightMoney":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(freightMoney),item.Text));
break;
case "Money":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Field(main, field)), item.Text));
break;
case "PackingMoney":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Sum(DQExpression.Multiply(DQExpression.Field(packageData, "Price"), DQExpression.Field(detail, "SecondNumber"))), item.Text));
break;
case "NetPrice":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Divide(DQExpression.Sum(DQExpression.Subtract(DQExpression.Field(detail, "Money"), DQExpression.IfNull(freightMoney, DQExpression.Value(0))).ESubtract(DQExpression.IfNull(DQExpression.Field(packageData, "Price"), DQExpression.Value(0)))), DQExpression.NullIfZero(DQExpression.Sum(DQExpression.Field(detail, "UnitNum")))), item.Text));
break;
case "ToFreightNetPrice":
dom.Columns.Add(DQSelectColumn.Create(DQExpression.Divide(DQExpression.Sum(DQExpression.Subtract(DQExpression.Field(detail, "Money"), DQExpression.IfNull(freightMoney, DQExpression.Value(0)))), DQExpression.NullIfZero(DQExpression.Sum(DQExpression.Field(detail, "UnitNum")))), item.Text));
break;
}
}
if (!_goods.IsEmpty) {
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field(detail, "SaleGoods_ID"), _goods.GetValues().Select(x => DQExpression.Value(x)).ToArray()));
}
if (!_brandItem.IsEmpty) {
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field(detail, "BrandItem_ID"), _brandItem.GetValues().Select(x => DQExpression.Value(x)).ToArray()));
}
if (!_goodsPropertyCatalog.IsEmpty) {
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field(detail, "GoodsPropertyCatalog_ID"), _goodsPropertyCatalog.GetValues().Select(x => DQExpression.Value(x)).ToArray()));
}
if (!_productLine.IsEmpty) {
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field(goods, "ProductLine_ID"), _productLine.GetValues().Select(x => DQExpression.Value(x)).ToArray()));
}
if (!_goodsBatch.IsEmpty) {
dom.Where.Conditions.Add(DQCondition.InList(DQExpression.Field(detail, "GoodsBatch_ID"), _goodsBatch.GetValues().Select(x => DQExpression.Value(x)).ToArray()));
}
dom.Where.Conditions.Add(DQCondition.EQ(main, "BillState", .));
return dom;
}
}
}