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 System.Threading.Tasks;
using POSV.Entity;
using POSV.Utils;
using POSV.Bean;
namespace POSV.Component
{
[ToolboxItem(true)]
public partial class TelephoneParameter : AbstractParameter
{
///
/// 修改前的数据
///
private Dictionary _oldValue = new Dictionary();
///
/// 修改后的数据
///
private Dictionary _newValue = new Dictionary();
///
/// 是否初始化
///
private bool _inited = false;
public TelephoneParameter()
{
InitializeComponent();
this.txtAreaCode.Multiline = false;
this.txtPrefix.Multiline = false;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.DesignMode) return;
this.BackColor = Color.Transparent;
//来电1的串口参数
this.cmbSerialPort1.Items.Clear();
this.cmbSerialPort1.Items.AddRange(Constant.COM_PORT_NAME_VALUE);
//来电1的波特率参数
this.cmbSerialPortBaud1.Items.Clear();
this.cmbSerialPortBaud1.Items.AddRange(Constant.COM_PORT_BAUD_VALUE);
//来电2的串口参数初始值
this.cmbSerialPort2.Items.Clear();
this.cmbSerialPort2.Items.AddRange(Constant.COM_PORT_NAME_VALUE);
//来电2的波特率参数
this.cmbSerialPortBaud2.Items.Clear();
this.cmbSerialPortBaud2.Items.AddRange(Constant.COM_PORT_BAUD_VALUE);
this.InitUi();
}
///
/// 初始化界面
///
private void InitUi()
{
//界面加载开始
this._inited = false;
Task.Factory.StartNew(() =>
{
Dictionary data = null;
//获取品类分组下的全部参数
using (var db = Global.Instance.OpenDataBase)
{
data = db.Dictionary(string.Format(SqlConstant.ConfigQueryByGroupToDictionary , ConfigConstant.DEVICE_GROUP));
}
//将新增加或者变更的参数重新更新到数据库
var defaultValue = ConfigConstant.DeviceGroupDefaultValue();
//数据库有配置参数
if (data != null)
{
var diff = defaultValue.Where(kvp => !data.ContainsKey(kvp.Key)).ToDictionary(kvp => kvp.Key , kvp => kvp.Value);
if (diff != null && diff.Keys.Count > 0)
{
var list = new List();
foreach (var v in diff)
{
var config = new Config();
config.Id = IdWorkerUtils.Instance.NextId();
config.Group = ConfigConstant.DEVICE_GROUP;
config.TenantId = Global.Instance.Authc.TenantId;
config.Keys = v.Key;
config.Values = v.Value;
list.Add(config);
}
//如果数据表中没有配置group相关的信息,更新差异
this.SaveChanged(list);
//将差异合并到data,避免再次访问数据库
data = data.Concat(diff).ToDictionary(x => x.Key , x => x.Value);
}
}
else
{
//加载系统默认参数
data = defaultValue;
var list = new List();
foreach (var v in defaultValue)
{
var config = new Config();
config.Id = IdWorkerUtils.Instance.NextId();
config.Group = ConfigConstant.DEVICE_GROUP;
config.TenantId = Global.Instance.Authc.TenantId;
config.Keys = v.Key;
config.Values = v.Value;
list.Add(config);
}
//如果数据表中没有配置group相关的信息,保存
this.SaveChanged(list);
}
return data;
}).ContinueWith(task =>
{
if (task.IsFaulted)
{
LOGGER.Error(task.Exception.GetBaseException() , "加载来电参数设置异常");
}
else
{
this.Invoke(new Action(() =>
{
BindUi(task.Result);
}));
}
});
}
private void BindUi(Dictionary data)
{
//变更前的数据单独存储
_oldValue.Clear();
_oldValue = ObjectUtils.Copy>(data);
//清理历史变更数据
_newValue.Clear();
TelephoneCatParameter parameter = JsonUtils.Deserialize(data[ConfigConstant.DEVICE_TELEPHONE_PARAMETER]);
//前缀
this.txtPrefix.Text = parameter.Prefix;
//区号
this.txtAreaCode.Text = parameter.AreaCode;
foreach(var cat in parameter.Parameter)
{
switch (cat.Name)
{
case "电话1":
{
this.chkCat1.Checked = cat.Enable;
this.cmbSerialPort1.SelectedIndex = this.cmbSerialPort1.FindString(cat.Port);
this.cmbSerialPortBaud1.SelectedIndex = this.cmbSerialPortBaud1.FindString(cat.Baud.ToString());
}
break;
case "电话2":
{
this.chkCat2.Checked = cat.Enable;
this.cmbSerialPort2.SelectedIndex = this.cmbSerialPort2.FindString(cat.Port);
this.cmbSerialPortBaud2.SelectedIndex = this.cmbSerialPortBaud2.FindString(cat.Baud.ToString());
}
break;
}
}
//将变动前的参数缓存
this.Tag = parameter;
//界面加载完成
this._inited = true;
}
public List NewChanged()
{
var result = new List();
//尚未初始化完成
if (!this._inited) return result;
int baud = 9600;
//来电参数
var newValue = new TelephoneCatParameter();
newValue.Prefix = this.txtPrefix.Text.Trim();
newValue.AreaCode = this.txtAreaCode.Text.Trim();
newValue.Parameter = new List();
var cat1 = new CatParameter();
cat1.Name = "电话1";
cat1.Enable = this.chkCat1.Checked;
cat1.Port = this.cmbSerialPort1.SelectedItem.ToString();
int.TryParse(this.cmbSerialPortBaud1.SelectedItem.ToString() , out baud);
cat1.Baud = baud;
newValue.Parameter.Add(cat1);
var cat2 = new CatParameter();
cat2.Name = "电话2";
cat2.Enable = this.chkCat2.Checked;
cat2.Port = this.cmbSerialPort2.SelectedItem.ToString();
int.TryParse(this.cmbSerialPortBaud2.SelectedItem.ToString() , out baud);
cat2.Baud = baud;
newValue.Parameter.Add(cat2);
//变更前的数据
TelephoneCatParameter oldValue = this.Tag as TelephoneCatParameter;
//判断是否更改,如果过更改压入到 NewValue
bool isChanged = !(newValue.Equals(oldValue));
if (isChanged)
{
var config = new Config();
config.Id = IdWorkerUtils.Instance.NextId();
config.Group = ConfigConstant.DEVICE_GROUP;
config.TenantId = Global.Instance.Authc.TenantId;
config.Keys = ConfigConstant.DEVICE_TELEPHONE_PARAMETER;
config.Values = JsonUtils.Serialize(newValue);
result.Add(config);
}
return result;
}
public Tuple SaveChanged(List data)
{
bool isSuccess = true;
string message = "参数更新成功";
try
{
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)
{
//新修改后的参数应用后,重置OldValue,避免用户在没有切换Tab情况下,直接修改当前Tab内容
this._newValue.Clear();
//更新控件UI
Global.Instance.ReloadConfig(ConfigConstant.DEVICE_GROUP);
}
}
return new Tuple(isSuccess , message);
}
private void OnKeyboardClick(object sender , EventArgs e)
{
var item = sender as NormalTextBox;
NumericKeyboard.ShowKeyboard(this , item);
}
}
}