You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

461 lines
16 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
//获取用户选择的文件并判断文件大小不能超过20KfileInfo.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();
}
}
}
}