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#

9 months ago
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();
}
}
}
}