using System; using Newtonsoft.Json; using System.Collections.Generic; using System.Drawing; namespace POSV.Printer { [Serializable] [JsonObject(MemberSerialization.OptIn)] public class DesignerSurface { [JsonProperty(PropertyName = "pager")] public PagerType PagerType { get; set; } [JsonProperty(PropertyName = "width")] public int Width { get; set; } [JsonProperty(PropertyName = "version")] public int Version { get; set; } = 1; [JsonProperty(PropertyName = "dataSource")] public Dictionary> DataSource { get; set; } /// /// 当前控件列表 /// [JsonProperty(PropertyName = "controls")] public List DesignerControls { get; set; } private bool ParseCondition(VariableItem var,string dataSourceKey, List args) { bool result = true; //数据源参数,无论单行还是列表,数据源采用List方式,兼容单行选择集合数据源,重复行打印 var data = new List>(); //包含数据源参数,重置 if (args.Exists(x => x.Key == dataSourceKey)) { //当前数据源 var vars = args.FindLast(x => x.Key == dataSourceKey); //List集合数据 if (vars.DataType == DataType.List) { data = JSON.Deserialize>>(vars.Value.ToString()); } else { var row = JSON.Deserialize>(vars.Value.ToString()); data.Add(row); } } //参数中是否包含条件参数,如果包含,取值,如果不包含,忽略,继续打印 if(var != null && data.Exists(x => x.ContainsKey(var.Value))) { //取第一个值 var _value = data[0][var.Value]; if ("false".Equals(_value.ToLower())) { result = false; } } return result; } public PrinterTemplate Parse(List args) { PrinterTemplate printer = new PrinterTemplate(); printer.PagerType = this.PagerType; printer.MaxLength = (int)this.PagerType; foreach (DesignerControls ctrls in this.DesignerControls) { switch (ctrls.ControlType) { case ControlType.单行模版: { var parameter = JSON.Deserialize(ctrls.Template); R1Template template = parameter.Template.Item1; //判断是否符合打印条件 var condition = ParseCondition(template.Condition , template.DataSourceKey, args); if (!condition) { continue; } RowTemplate row = new RowTemplate(); row.RowFormat = RowFormat.Line; LineTemplate line = new LineTemplate(); line.DataSourceKey = template.DataSourceKey; line.FontStyle = parameter.FontStyle; line.AlignStyle = parameter.AlignStyle; line.LineStyle = parameter.LineStyle; line.Length = (int)this.PagerType; var content = string.Format("{0}{1}{2}{3}{4}" , template.Prefix , template.Var1.Value , template.Middle , template.Var2.Value , template.Suffix); line.Content = content; row.Template = JSON.Serialize(line); printer.AddRow(row); } break; case ControlType.两列模版: { var parameter = JSON.Deserialize(ctrls.Template); R2Template left = parameter.Template.Item1; //判断是否符合打印条件 var leftCondition = ParseCondition(left.Condition ,left.DataSourceKey, args); R2Template right = parameter.Template.Item2; //判断是否符合打印条件 var rightCondition = ParseCondition(right.Condition , left.DataSourceKey , args); if(!leftCondition && !rightCondition) { continue; } RowTemplate row = new RowTemplate(); row.RowFormat = RowFormat.Column; List lines = new List(); LineTemplate line = new LineTemplate(); line.DataSourceKey = left.DataSourceKey; line.FontStyle = parameter.FontStyle; line.AlignStyle = left.AlignStyle; line.LineStyle = parameter.LineStyle; //列打印字符数,根据每行字符数*列的宽度百分比 int leftStringLength = Convert.ToInt32(((int)this.PagerType) * left.Percent / 100 ); //将宽度都重置为偶数,防止比例算出来为奇数,导致两列模板换行失控 switch (line.FontStyle) { case FontStyle.倍宽倍高: case FontStyle.倍宽字体: { line.Length = ((int)leftStringLength / 4) * 4; } break; default: { line.Length = ((int)leftStringLength / 2) * 2; } break; } leftStringLength = line.Length; var content = string.Format("{0}{1}{2}{3}{4}" , left.Prefix , left.Var1.Value , left.Middle , left.Var2.Value , left.Suffix); line.Content = leftCondition ? content : ""; lines.Add(line); line = new LineTemplate(); line.DataSourceKey = right.DataSourceKey; line.FontStyle = parameter.FontStyle; line.AlignStyle = right.AlignStyle; line.LineStyle = parameter.LineStyle; //左标签长度确定后,右标签采用减的方式 line.Length = (int)this.PagerType - leftStringLength; content = string.Format("{0}{1}{2}{3}{4}" , right.Prefix , right.Var1.Value , right.Middle , right.Var2.Value , right.Suffix); line.Content = rightCondition ? content : ""; lines.Add(line); row.Template = JSON.Serialize(lines); printer.AddRow(row); } break; case ControlType.表格模版: { var template = JSON.Deserialize(ctrls.Template); RowTemplate row = new RowTemplate(); row.RowFormat = RowFormat.Grid; GridTemplate grid = new GridTemplate(); grid.DataSourceKey = template.Template.DataSourceKey; //包含合计行 grid.ContainsTotalRow = template.Template.ContainsTotalRow; //自动换新行 grid.AllowNewLine = template.Template.AllowNewLine; //打印合计行 grid.OutputTotalRow = template.Template.OutputTotalRow; //字体 grid.FontStyle = template.FontStyle; //表头下划线格式 grid.LineStyle = template.LineStyle; //空记录集是否打印表头 grid.NotAllowEmpty = template.Template.NotAllowEmpty; //禁止打印表头 grid.NotAllowHeader = template.Template.NotAllowHeader; //表头采用正常字体打印 grid.HeaderFontStyle = template.Template.HeaderFontStyle; foreach (var cols in template.Template.Columns) { var r = template.Template.RowTemplates[cols.Index]; grid.AddColumn(new ColumnTempate(cols.Name ,template.AlignStyle , r.Content , cols.Length)); } row.Template = JSON.Serialize(grid); printer.AddRow(row); } break; case ControlType.条码模版: { var parameter = JSON.Deserialize(ctrls.Template); BarCodeXTemplate template = parameter.Template.Item1; //判断是否符合打印条件 var condition = ParseCondition(template.Condition , template.DataSourceKey , args); if (!condition) { continue; } RowTemplate row = new RowTemplate(); row.RowFormat = RowFormat.Barcode; BarcodeTemplate barcode = new BarcodeTemplate(); barcode.DataSourceKey = template.DataSourceKey; barcode.FontStyle = parameter.FontStyle; barcode.AlignStyle = parameter.AlignStyle; barcode.Length = (int)this.PagerType; barcode.ShowLable = template.ShowLabel; barcode.Content = template.Var1.Value; barcode.LableContent = template.Var2.Value; row.Template = JSON.Serialize(barcode); printer.AddRow(row); } break; case ControlType.二维码模版: { var parameter = JSON.Deserialize(ctrls.Template); QRCodeXTemplate template = parameter.Template.Item1; //判断是否符合打印条件 var condition = ParseCondition(template.Condition, template.DataSourceKey, args); if (!condition) { continue; } RowTemplate row = new RowTemplate(); row.RowFormat = RowFormat.QRCode; QRCodeTemplate qrcode = new QRCodeTemplate(); qrcode.DataSourceKey = template.DataSourceKey; qrcode.FontStyle = parameter.FontStyle; qrcode.AlignStyle = parameter.AlignStyle; qrcode.SizeMode = parameter.SizeMode; qrcode.Length = (int)this.PagerType; qrcode.Content = template.Var1.Value; row.Template = JSON.Serialize(qrcode); printer.AddRow(row); } break; case ControlType.位图模版: { var parameter = JSON.Deserialize(ctrls.Template); BitmapXTemplate template = parameter.Template.Item1; //判断是否符合打印条件 var condition = ParseCondition(template.Condition , template.DataSourceKey , args); if (!condition) { continue; } RowTemplate row = new RowTemplate(); row.RowFormat = RowFormat.Bitmap; BitmapTemplate bitmap = new BitmapTemplate(); bitmap.DataSourceKey = template.DataSourceKey; bitmap.FontStyle = parameter.FontStyle; bitmap.AlignStyle = parameter.AlignStyle; bitmap.Length = (int)this.PagerType; bitmap.Content = template.Var1.Value; row.Template = JSON.Serialize(bitmap); printer.AddRow(row); } break; } } return printer; } } [Serializable] [JsonObject(MemberSerialization.OptIn)] public class DesignerControls { [JsonProperty(PropertyName = "type")] public ControlType ControlType { get; set; } [JsonProperty(PropertyName = "text")] public string Text { get; set; } [JsonProperty(PropertyName = "x")] public int X { get; set; } [JsonProperty(PropertyName = "y")] public int Y { get; set; } [JsonProperty(PropertyName = "width")] public int Width { get; set; } [JsonProperty(PropertyName = "height")] public int Height { get; set; } [JsonProperty(PropertyName = "color")] public Color BackColor { get; set; } [JsonProperty(PropertyName = "template")] public string Template { get; set; } } }