|
|
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<Config>(string.Format(SqlConstant.ConfigQueryByGroupAndKey, ConfigConstant.PERIPHERAL_GROUP, ConfigConstant.PERIPHERAL_LABEL_TEMPLATE));
|
|
|
}
|
|
|
if (template != null)
|
|
|
{
|
|
|
var tems = JsonUtils.Deserialize<List<LabelTemplate>>(template.Values);
|
|
|
var tem = tems.Find(x => x.Name == labelType);
|
|
|
if (tem != null)
|
|
|
{
|
|
|
DrawLabelTemplate(tem);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public List<Config> NewChanged()
|
|
|
{
|
|
|
List<Config> result = new List<Config>();
|
|
|
|
|
|
|
|
|
var tem = InstallLabelTemplate();
|
|
|
List<LabelTemplate> temList = new List<LabelTemplate>();
|
|
|
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<bool, string> SaveChanged(List<Config> 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<bool, string>(isSuccess, message);
|
|
|
}
|
|
|
|
|
|
private void UpdatePrinterUi()
|
|
|
{
|
|
|
Global.Instance.ReloadConfig(ConfigConstant.PERIPHERAL_GROUP);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 变更标签尺寸,重绘矩形大小
|
|
|
/// </summary>
|
|
|
/// <param name="sender"></param>
|
|
|
/// <param name="e"></param>
|
|
|
private void OnLabelSizeValueChanged(object sender, EventArgs e)
|
|
|
{
|
|
|
this.labelDesignContainer.Refresh();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 切换标签大小,分配宽高控件值
|
|
|
/// </summary>
|
|
|
/// <param name="sender"></param>
|
|
|
/// <param name="e"></param>
|
|
|
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]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 打印区域
|
|
|
/// </summary>
|
|
|
Rectangle rect;
|
|
|
|
|
|
/// <summary>
|
|
|
/// 绘制标签区域
|
|
|
/// </summary>
|
|
|
/// <param name="sender"></param>
|
|
|
/// <param name="e"></param>
|
|
|
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<LabelPrinterContent> list = new List<LabelPrinterContent>();
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 打印测试
|
|
|
/// </summary>
|
|
|
/// <param name="sender"></param>
|
|
|
/// <param name="e"></param>
|
|
|
private void OnTestPrintClick(object sender, EventArgs e)
|
|
|
{
|
|
|
|
|
|
try
|
|
|
{
|
|
|
List<Dictionary<string, string>> labelList = new List<Dictionary<string, string>>();
|
|
|
var dic = new Dictionary<string, string>();
|
|
|
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);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 导入
|
|
|
/// </summary>
|
|
|
/// <param name="sender"></param>
|
|
|
/// <param name="e"></param>
|
|
|
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<LabelTemplate>(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();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|