using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using POSV.Utils; using POSV.Bean; using POSV.Helper; using POSV.Entity; using System.Threading.Tasks; using System.IO; using System.Collections; using POS.Language.Language; namespace POSV.Component { [ToolboxItem(true)] public partial class LabelDesignParameter : AbstractParameter { private string[] labelSizeEnum = { "", "25*15", "32*19", "40*30", "60*40", "95*35" }; public LabelDesignParameter() { InitializeComponent(); labelX85.Text = LangProxy.ToLang(labelX85.Text); labelX1.Text = LangProxy.ToLang(labelX1.Text); labelX2.Text = LangProxy.ToLang(labelX2.Text); labelX3.Text = LangProxy.ToLang(labelX3.Text); labelX4.Text = LangProxy.ToLang(labelX4.Text); labelX5.Text = LangProxy.ToLang(labelX5.Text); labelX6.Text = LangProxy.ToLang(labelX6.Text); btnInclude.Text = LangProxy.ToLang(btnInclude.Text); btnExport.Text = LangProxy.ToLang(btnExport.Text); buttonX2.Text = LangProxy.ToLang(buttonX2.Text); buttonX6.Text = LangProxy.ToLang(buttonX6.Text); buttonX7.Text = LangProxy.ToLang(buttonX7.Text); buttonX8.Text = LangProxy.ToLang(buttonX8.Text); buttonX9.Text = LangProxy.ToLang(buttonX9.Text); buttonX10.Text = LangProxy.ToLang(buttonX10.Text); buttonX11.Text = LangProxy.ToLang(buttonX11.Text); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; this.labelTypeCom.SelectedIndexChanged += LabelTypeCom_SelectedIndexChanged; this.labelSizeCom.SelectedIndexChanged += LabelSizeCom_SelectedIndexChanged; this.labelWidthCom.ValueChanged += OnLabelSizeValueChanged; this.labelHeightCom.ValueChanged += OnLabelSizeValueChanged; //常用标签尺寸 this.labelSizeCom.DataSource = labelSizeEnum; this.labelTypeCom.SelectedIndex = 0; LabelTypeCom_SelectedIndexChanged(null, null); } private void LabelTypeCom_SelectedIndexChanged(object sender, EventArgs e) { var labelType = this.labelTypeCom.Text; Config template = null; //获取品类分组下的全部参数 using (var db = Global.Instance.OpenDataBase) { template = db.FirstOrDefault(string.Format(SqlConstant.ConfigQueryByGroupAndKey, ConfigConstant.PERIPHERAL_GROUP, ConfigConstant.PERIPHERAL_LABEL_TEMPLATE)); } if (template != null) { var tems = JsonUtils.Deserialize>(template.Values); var tem = tems.Find(x => x.Name == labelType); if (tem != null) { DrawLabelTemplate(tem); } } } public List NewChanged() { List result = new List(); var tem = InstallLabelTemplate(); List temList = new List(); temList.Add(tem); var config = new Config(); config.Id = IdWorkerUtils.Instance.NextId(); config.Group = ConfigConstant.PERIPHERAL_GROUP; config.TenantId = Global.Instance.Authc.TenantId; config.Keys = ConfigConstant.PERIPHERAL_LABEL_TEMPLATE; config.Values = JsonUtils.Serialize(temList); result.Add(config); return result; } public Tuple SaveChanged(List data) { bool isSuccess = true; string message = "参数更新成功"; try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var trans = db.GetTransaction()) { foreach (var config in data) { db.Save(config); } trans.Complete(); } } } } catch (Exception ex) { isSuccess = false; message = "参数更新异常"; LOGGER.Error(ex, message); } finally { if (isSuccess) { //更新控件UI UpdatePrinterUi(); } } return new Tuple(isSuccess, message); } private void UpdatePrinterUi() { Global.Instance.ReloadConfig(ConfigConstant.PERIPHERAL_GROUP); } /// /// 变更标签尺寸,重绘矩形大小 /// /// /// private void OnLabelSizeValueChanged(object sender, EventArgs e) { this.labelDesignContainer.Refresh(); } /// /// 切换标签大小,分配宽高控件值 /// /// /// private void LabelSizeCom_SelectedIndexChanged(object sender, EventArgs e) { var labelSize = this.labelSizeCom.Text; if (!string.IsNullOrEmpty(labelSize)) { var sizeArr = labelSize.Split('*'); this.labelWidthCom.Value = StringUtils.GetInt(sizeArr[0]); this.labelHeightCom.Value = StringUtils.GetInt(sizeArr[1]); } } /// /// 打印区域 /// Rectangle rect; /// /// 绘制标签区域 /// /// /// private void OnLabelDesignPaint(object sender, PaintEventArgs e) { int width = this.labelWidthCom.Value; int height = this.labelHeightCom.Value; Pen pen1 = new Pen(Color.Red, 1); pen1.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; pen1.DashPattern = new float[] { 4f, 2f }; var g = e.Graphics; var widthPoint = DpiUtils.MillimetersToPixels(width); var heightPoint = DpiUtils.MillimetersToPixels(height); rect = new Rectangle(0, 0, widthPoint, heightPoint); g.DrawRectangle(pen1, rect); pen1.Dispose(); ControlPaint.DrawGrid(g, new Rectangle(0, 0, widthPoint, heightPoint), new Size(4, 4), Color.White); } private LabelTemplate InstallLabelTemplate() { LabelTemplate temp = new LabelTemplate(); temp.Name = this.labelTypeCom.Text; //标签控制打印控制信息 LabelPrinterControl ctrl = new LabelPrinterControl(); ctrl.Width = this.labelWidthCom.Value; ctrl.Height = this.labelHeightCom.Value; ctrl.RowGap = Convert.ToDecimal(this.labelGapCom.Value); ctrl.PaddingTop = this.paddingTopCom.Value; ctrl.PaddingLeft = this.paddingLeftCom.Value; ctrl.ScreenDpi = DpiUtils.GetScreenDpi(); temp.LabelControl = ctrl; //标签打印内容 List list = new List(); foreach (Control cont in this.labelDesignContainer.Controls) { if (rect.Contains(cont.Location)) { //在矩形区域内,打印内容 LabelPrinterContent con = new LabelPrinterContent(); con.X = cont.Location.X; con.Y = cont.Location.Y; con.Rotation = "0"; con.Font = cont.Font; int x = 1, y = 1; switch (con.Font.Size) { case 18: x = 2; y = 2; break; case 15: x = 2; break; case 12: y = 2; break; } con.X_multiplication = x; con.Y_multiplication = y; con.Text = cont.Text; con.Name = cont.Name; con.Width = cont.Width; con.Height = cont.Height; list.Add(con); } } //标签排序,从上到小,从左到右 list.Sort(delegate (LabelPrinterContent label1, LabelPrinterContent label2) { if (label1.Y < label2.Y) { return -1; } else if (label1.Y == label2.Y) { if (label1.X < label2.X) { return -1; } else { return 1; } } else { return 1; } }); temp.LabelContentList = list; return temp; } /// /// 打印测试 /// /// /// private void OnTestPrintClick(object sender, EventArgs e) { try { List> labelList = new List>(); var dic = new Dictionary(); dic["#票号#"] = "01"; dic["#桌号#"] = "66"; dic["#营业模式#"] = "堂食"; dic["#订单序号#"] = "1"; dic["#产品序号#"] = "[1/1]"; dic["#门店#"] = "转转旗舰店"; dic["#金额#"] = "¥99"; dic["#做法#"] = "加冰加冰加冰加冰加冰加冰加冰加冰加冰加冰"; dic["#品名#"] = "测试签"; dic["#时间#"] = DateTime.Now.ToString("MM-dd HH:mm"); dic["#电话#"] = "18888888888"; labelList.Add(dic); var tem = InstallLabelTemplate(); Task.Factory.StartNew(new Action(() => { LabelPrintHelper.PrintLabel(tem, labelList); })); } catch(Exception ex) { LOGGER.Error(ex, "标签测试打印发生异常!"); } } private void DrawLabelTemplate(LabelTemplate tem) { if (tem == null) { return; } //恢复控制信息 this.labelGapCom.Text = tem.LabelControl.RowGap.ToString(); this.labelHeightCom.Value = Convert.ToInt32(tem.LabelControl.Height); this.labelWidthCom.Value = Convert.ToInt32(tem.LabelControl.Width); this.labelTypeCom.Text = tem.Name; this.paddingTopCom.Value = Convert.ToInt32(tem.LabelControl.PaddingTop); this.paddingLeftCom.Value = Convert.ToInt32(tem.LabelControl.PaddingLeft); //重置内容信息 foreach(var content in tem.LabelContentList) { Control cont = labelDesignContainer.Controls.Find(content.Name, false)[0]; //排除width为0 if(content.Width == 0) { content.Width = 10; } cont.SetBounds(content.X, content.Y, content.Width, content.Height); cont.Text = content.Text; cont.Font = content.Font; } //将非模板中在打印区域的空间移出可打印区域 foreach(Control ctl in labelDesignContainer.Controls) { if(ctl.Location.X <= rect.Width && ctl.Location.Y <= rect.Height) { bool isExist = tem.LabelContentList.Exists(x => x.Name == ctl.Name); if (!isExist) { ctl.SetBounds(300, ctl.Location.Y, ctl.Width, ctl.Height); } } } } /// /// 导入 /// /// /// private void OnIncludeClick(object sender, EventArgs e) { //初始化一个OpenFileDialog类 OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Filter = " tem files(*.tem)|*.tem"; //判断用户是否正确的选择了文件 if (fileDialog.ShowDialog() == DialogResult.OK) { //获取用户选择文件的后缀名 string extension = Path.GetExtension(fileDialog.FileName); //声明允许的后缀名 string[] str = new string[] { ".tem" }; if (!((IList)str).Contains(extension)) { MessageBox.Show("仅能选择tem文件!"); } else { //获取用户选择的文件,并判断文件大小不能超过20K,fileInfo.Length是以字节为单位的 FileInfo fileInfo = new FileInfo(fileDialog.FileName); StreamReader sr = new StreamReader(Path.GetFullPath(fileDialog.FileName), Encoding.UTF8); StringBuilder templateSb = new StringBuilder();//存储文件内容 while (!sr.EndOfStream) { templateSb.Append(sr.ReadLine()); } sr.Close(); if (templateSb.Length > 0) { var fileTem = JsonUtils.Deserialize(templateSb.ToString()); var sign = fileTem.Name; switch (sign) { case "普通标签": this.labelTypeCom.Text = sign; DrawLabelTemplate(fileTem); break; default: MessageBox.Show("不支持的模板,导入失败"); break; } } } } } private void OnExportClick(object sender, EventArgs e) { string bqType = string.Empty; var tem = InstallLabelTemplate(); if (tem == null) { MessageBox.Show("未获取模板,导出失败"); return; } SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.FileName = bqType; //设置文件类型 saveFileDialog1.Filter = " tem files(*.tem)|*.tem"; //设置默认文件类型显示顺序 saveFileDialog1.FilterIndex = 2; //保存对话框是否记忆上次打开的目录 saveFileDialog1.RestoreDirectory = true; //点了保存按钮进入 if (saveFileDialog1.ShowDialog() == DialogResult.OK) { System.IO.FileStream fs = (System.IO.FileStream)saveFileDialog1.OpenFile();//输出文件 string temJson = JsonUtils.Serialize(tem); byte[] temBytes = Encoding.UTF8.GetBytes(temJson); fs.Write(temBytes, 0, temBytes.Length); fs.Close(); } } } }