| @ -0,0 +1,254 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.IO; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Web.UI; | |||
| using System.Web.UI.HtmlControls; | |||
| using BWP.B3Frameworks; | |||
| using BWP.B3Sale.BO; | |||
| using BWP.Web.Pages.B3Sale; | |||
| using BWP.Web.Pages.B3Sale.Bills.CarLoading_; | |||
| using Forks.Drawing; | |||
| using Forks.EnterpriseServices.DataForm; | |||
| using Forks.Utils; | |||
| using TSingSoft.WebControls2.BillReports; | |||
| using TSingSoft.WebPluginFramework; | |||
| namespace BWP.Web.Pages.TypeIOCs | |||
| { | |||
| [TypeIOC(typeof(CarLoadingPrint), typeof(CarLoadingPrint.AfterAddParameters))] | |||
| public class CarLoadingTypeIOC : CarLoadingPrint.AfterAddParameters | |||
| { | |||
| public void Invoke(IDictionary<string, object> dic, CarLoading dmo) | |||
| { | |||
| AddParameterss(dic, dmo); | |||
| } | |||
| //定制打印格式【装车单】 | |||
| protected void AddParameterss(IDictionary<string, object> dic, CarLoading Dmo) | |||
| { | |||
| PageSize = 100; | |||
| dic.Add("$DetailInfo2", new Func<object>(() => GetPrintStyle(Dmo, true))); | |||
| } | |||
| readonly StringBuilder mHtml = new StringBuilder(); | |||
| //readonly StringBuilder mHtml2 = new StringBuilder(); | |||
| protected int mTotalCount { get; private set; } | |||
| private string GetPrintStyle(CarLoading dmo, bool haveaddress) | |||
| { | |||
| StringBuilder html = BuildHtml(dmo, haveaddress); | |||
| return html.ToString(); | |||
| } | |||
| protected int PageSize { get; private set; } | |||
| private StringBuilder BuildHtml(CarLoading dmo, bool haveaddress) | |||
| { | |||
| StringBuilder html = new StringBuilder(); | |||
| DFDataTable dt = new DFDataAdapter(CarLoadingUtil.GetGoodsDetailGroupByOutStoreID(dmo)).Fill(); | |||
| mTotalCount = dt.Rows.Count; | |||
| var pageCount = mTotalCount <= 0 ? 1 : ((mTotalCount + PageSize - 1) / PageSize); | |||
| Money<decimal>? allSecNum = GetAllNum(dt, "SecondNumber"); | |||
| Money<decimal>? allMainNum = GetAllNum(dt, "Number"); | |||
| var infoBand = GetInfoBand(dmo, allSecNum, allMainNum); | |||
| for (int i = 0; i < pageCount; i++) | |||
| { | |||
| var report = new BillReport(); | |||
| report.Bands.Add(new TextBand("装车单№" + dmo.ID, new Font("黑体", 15), TextAlignMode.Center)); | |||
| report.Bands.Add(infoBand); | |||
| report.FindControl(""); | |||
| html.Append(ToHtmlStr(report)); | |||
| HtmlTable table = NewHtmlTable(); | |||
| table.EAddRow("center", 1, 1, "单号", "客户", "仓库", "存货编号", "存货名称", "规格", "辅单位", "件数", "主单位", "数量", "备注", "发货标记"); | |||
| int i1 = i; | |||
| var groups = dt.Rows.Where(detail => detail.RowID >= i1 * PageSize && detail.RowID < (i1 + 1) * PageSize).GroupBy(detail => ((long?)detail["BillID"]).Value); | |||
| AddDetails(table, groups, haveaddress); | |||
| html.Append(ToHtmlStr(table)); | |||
| var reportBottom = new BillReport(); | |||
| reportBottom.Bands.Add(GetBottomInfoBand(dmo, pageCount, i + 1)); | |||
| reportBottom.FindControl(""); | |||
| html.Append(ToHtmlStr(reportBottom)); | |||
| if (i + 1 != pageCount) | |||
| { | |||
| html.Append("<div STYLE='page-break-before:always'></div>"); | |||
| } | |||
| } | |||
| return html; | |||
| } | |||
| private static DFInfoBand<CarLoading> GetBottomInfoBand(CarLoading dmo, int pageCount, int currentPage) | |||
| { | |||
| var dfInfoBand = new DFInfoBand<CarLoading>(dmo, 4); | |||
| dfInfoBand.AddField("CreateUser_Name", 4); | |||
| dfInfoBand.AddField("CheckUser_Name", 4); | |||
| dfInfoBand.AddText("页码", currentPage + "" + (pageCount == -1 ? "" : ("/" + pageCount))); | |||
| dfInfoBand.AddText("打印时间", BLContext.Now.ToString()); | |||
| return dfInfoBand; | |||
| } | |||
| private static DFInfoBand<CarLoading> GetInfoBand(CarLoading dmo, Money<decimal>? allSecNum, Money<decimal>? allMainNum) | |||
| { | |||
| var dfInfoBand = new DFInfoBand<CarLoading>(dmo, 3); | |||
| dfInfoBand.AddField("Car_Name", 4); | |||
| dfInfoBand.AddField("AccountingUnit_Name", 4); | |||
| dfInfoBand.AddField("Date", 4); | |||
| dfInfoBand.AddField("Deliveryman_Name", 4); | |||
| dfInfoBand.AddText("总 件 数", allSecNum.HasValue ? allSecNum.ToString() : ""); | |||
| dfInfoBand.AddText("总 数 量", allMainNum.HasValue ? allMainNum.ToString() : ""); | |||
| dfInfoBand.AddField("Remark", 4, 3, Font.Empty, WrapMode.Wrap); | |||
| return dfInfoBand; | |||
| } | |||
| private static Money<decimal>? GetAllNum(DFDataTable dt, string fieldName) | |||
| { | |||
| Money<decimal>? num = 0; | |||
| foreach (DFDataRow row in dt.Rows) | |||
| { | |||
| num = num + (((Money<decimal>?)row[fieldName]) ?? 0); | |||
| } | |||
| return num; | |||
| } | |||
| private static Money<decimal>? GetAllGroupNum(IGrouping<object, DFDataRow> dt, string fieldName) | |||
| { | |||
| Money<decimal>? num = 0; | |||
| foreach (var row in dt) | |||
| { | |||
| num = num + (((Money<decimal>?)row[fieldName]) ?? 0); | |||
| } | |||
| return num; | |||
| } | |||
| //readonly IntConfigRef mPageSize = new IntConfigRef(1000); | |||
| //[LogicName("装车单复杂打印格式分页")] | |||
| //[ConfigurationItemGroup("装车单")] | |||
| //[ConfigurationItemDescription("默认一页打印1000个产品,此配置影响装车单定制打印格式 ")] | |||
| //public IntConfigRef PageSize | |||
| //{ | |||
| // get { return mPageSize; } | |||
| //} | |||
| private void AddDetails(HtmlTable table, IEnumerable<IGrouping<long, DFDataRow>> groups, bool haveaddress) | |||
| { | |||
| HtmlTableExtentions.rowCount = 0; | |||
| foreach (var group in groups) | |||
| { | |||
| bool first = true; | |||
| Money<decimal>? main = null; | |||
| Money<decimal>? sec = null; | |||
| HtmlTableRow row; | |||
| foreach (DFDataRow dataRow in group) | |||
| { | |||
| row = new HtmlTableRow(); | |||
| table.Rows.Add(row); | |||
| if (first) | |||
| { | |||
| row.EAdd("center", group.Count() + 1, 1, ((long?)dataRow["BillID"]).Value.ToString(), (string)dataRow["Customer_Name"], (string)dataRow["Store_Name"]); | |||
| if (haveaddress) | |||
| { | |||
| Address = (string)dataRow["DeliverAddress"]; | |||
| Remark = (string)dataRow["Remark"]; | |||
| } | |||
| first = false; | |||
| } | |||
| var secNum = (Money<decimal>?)dataRow["SecondNumber"]; | |||
| var mainNum = (Money<decimal>?)dataRow["Number"]; | |||
| row.EAdd("center", 1, 1, (string)dataRow["Goods_Code"], (string)dataRow["Goods_Name"], (string)dataRow["Goods_Spec"], (string)dataRow["Goods_SecondUnit"], (secNum ?? 0).ToString(), (string)dataRow["Goods_MainUnit"], (mainNum ?? 0).ToString(), (string)dataRow["Goods_Remark"], ""); | |||
| main = (main ?? 0) + (mainNum ?? 0); | |||
| sec = (sec ?? 0) + (secNum ?? 0); | |||
| } | |||
| table.EAddRow("center", 1, 1, "小计", "", "", "", sec.ToString(), "", main.ToString(), "", ""); | |||
| if (haveaddress) | |||
| { | |||
| row = new HtmlTableRow(); | |||
| table.Rows.Add(row); | |||
| row.EAdd("center", 1, 1, "地址"); | |||
| row.EAdd("left", 1, 11, Address); | |||
| row = new HtmlTableRow(); | |||
| table.Rows.Add(row); | |||
| row.EAdd("center", 1, 1, "备注"); | |||
| row.EAdd("left", 1, 11, Remark); | |||
| } | |||
| } | |||
| } | |||
| private string Address { get; set; } | |||
| private string Remark { get; set; } | |||
| private static string ToHtmlStr(Control ctrl) | |||
| { | |||
| var sb = new StringBuilder(); | |||
| using (var writer = new HtmlTextWriter(new StringWriter(sb))) | |||
| { | |||
| ctrl.RenderControl(writer); | |||
| } | |||
| return sb.ToString(); | |||
| } | |||
| private static HtmlTable NewHtmlTable() | |||
| { | |||
| var table = new HtmlTable(); | |||
| table.Style.Add("border-collapse", "collapse"); | |||
| table.Width = "100%"; | |||
| table.BorderColor = "Black"; | |||
| table.Border = 1; | |||
| return table; | |||
| } | |||
| } | |||
| public static class HtmlTableExtentions | |||
| { | |||
| public static void EAdd(this HtmlTableRow row, string align, int rowSpan, int colSpan, params string[] innerHtmls) | |||
| { | |||
| foreach (var innerHtml in innerHtmls) | |||
| { | |||
| var cell = new HtmlTableCell | |||
| { | |||
| Align = align, | |||
| RowSpan = rowSpan, | |||
| ColSpan = colSpan, | |||
| InnerHtml = innerHtml | |||
| }; | |||
| cell.Style["Font-size"] = "15px"; | |||
| row.Cells.Add(cell); | |||
| } | |||
| } | |||
| public static void EAddRow(this HtmlTable table, string align, int rowSpan, int colSpan, params string[] innerHtmls) | |||
| { | |||
| var row = new HtmlTableRow(); | |||
| row.EAdd(align, rowSpan, colSpan, innerHtmls); | |||
| table.Rows.Add(row); | |||
| } | |||
| public static int rowCount; | |||
| } | |||
| } | |||