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); } } }