| @ -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; | |||||
| } | |||||
| } | |||||