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 GuestShowParameter : AbstractParameter { /// /// 修改前的数据 /// private Dictionary _oldValue = new Dictionary(); /// /// 修改后的数据 /// private Dictionary _newValue = new Dictionary(); /// /// 是否初始化 /// private bool _inited = false; public GuestShowParameter() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; this.BackColor = Color.Transparent; 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(); //串口参数初始值 this.guestShowPortCom.Items.Clear(); this.guestShowPortCom.Items.AddRange(Constant.COM_PORT_NAME_VALUE); //是否启用客显 this.enableGuestShowCom.Value = data[ConfigConstant.DEVICE_GUESTSHOW_ENABLE] == "1"; //加载支持的客显 List itemList = new List(); var defaultGuestShowItem = Global.Instance.GetDefaultGuestShowItem(); itemList.Add(defaultGuestShowItem); List showDeviceList = null; using (var db = Global.Instance.OpenDataBase) { showDeviceList = db.Fetch(); } if (showDeviceList.Count > 0) { foreach (var device in showDeviceList) { GuestShowItem item = new GuestShowItem(); item.Name = device.Name; item.Parameter = JsonUtils.Deserialize(device.Param); itemList.Add(item); } } this.guestShowNameCom.Items.Clear(); this.guestShowNameCom.Items.AddRange(itemList.ToArray()); this.guestShowNameCom.DisplayMember = "name"; if (data.ContainsKey(ConfigConstant.DEVICE_GUESTSHOW_PARAMETER)) { var json = data[ConfigConstant.DEVICE_GUESTSHOW_PARAMETER]; var item = JsonUtils.Deserialize(json); if (item != null) { this.guestShowNameCom.Tag = item.Parameter; var index = itemList.FindIndex(x => x.Name == item.Name); this.guestShowNameCom.SelectedIndex = index < 0 ? 0 : index; this.guestShowPortCom.Text = item.Port; } else { this.guestShowNameCom.SelectedIndex = 0; this.guestShowPortCom.SelectedIndex = 0; } } else { this.guestShowNameCom.SelectedIndex = 0; this.guestShowPortCom.SelectedIndex = 0; } //界面加载完成 this._inited = true; } public List NewChanged() { var result = new List(); //尚未初始化完成 if (!this._inited) return result; //是否启用客显 var enableGuestShow = this.enableGuestShowCom.Value ? "1" : "0"; bool changed = !(this._oldValue.ContainsKey(ConfigConstant.DEVICE_GUESTSHOW_ENABLE) && this._oldValue[ConfigConstant.DEVICE_GUESTSHOW_ENABLE].Equals(enableGuestShow)); if (changed) { this._newValue[ConfigConstant.DEVICE_GUESTSHOW_ENABLE] = enableGuestShow; } //客显参数 var item = new GuestShowItem(); item.Name = this.guestShowNameCom.Text; item.Port = this.guestShowPortCom.Text; var showItem = this.guestShowNameCom.SelectedItem as POSV.Bean.GuestShowItem; if (showItem != null) { item.Parameter = showItem.Parameter; } var itemJson = JsonUtils.Serialize(item); changed = !(this._oldValue.ContainsKey(ConfigConstant.DEVICE_GUESTSHOW_PARAMETER) && this._oldValue[ConfigConstant.DEVICE_GUESTSHOW_PARAMETER].Equals(itemJson)); if (changed) { this._newValue[ConfigConstant.DEVICE_GUESTSHOW_PARAMETER] = itemJson; } //转换为Config对象,便于存储 foreach (var v in this._newValue) { 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; 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); //更新客显配置 GuestShowUtils.RefreshInstance(); } } return new Tuple(isSuccess, message); } /// /// 修改配置 /// /// /// private void OnModifyParamClick(object sender, EventArgs e) { if (this.guestShowNameCom.Text == "None") { MessageBox.Show("请选择客显"); return; } var item = this.guestShowNameCom.SelectedItem as GuestShowItem; string param = string.Empty; if (item != null) { param = JsonUtils.Serialize(item.Parameter); } GuestShowModifyForm form = new GuestShowModifyForm(param); form.KxCmdCommit -= OnGuestShowParamModifySubmit; form.KxCmdCommit += OnGuestShowParamModifySubmit; form.ShowDialog(); } private void OnGuestShowParamModifySubmit(string kxParam) { var item = this.guestShowNameCom.SelectedItem as GuestShowItem; string param = string.Empty; if (item != null) { param = JsonUtils.Serialize(item.Parameter); if (kxParam != param) { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { GuestShowDevice device = new GuestShowDevice(); device.Id = IdWorkerUtils.Instance.NextId(); device.TenantId = Global.Instance.Authc.TenantId; device.Name = item.Name; device.Param = kxParam; device.IsLocal = 1; db.Save(device); } item.Parameter = JsonUtils.Deserialize(kxParam); } } } } /// /// 客显测试 /// /// /// private void OnTestClick(object sender, EventArgs e) { try { GuestShowUtils.RefreshInstance(); GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Price, "1111.11"); System.Threading.Thread.Sleep(1000); GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Total, "8888.88"); System.Threading.Thread.Sleep(1000); GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Recive, "6666.66"); System.Threading.Thread.Sleep(1000); GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Change, "0.01"); System.Threading.Thread.Sleep(1000); GuestShowUtils.Instance.DisplayData(CustomerDisplayType.Clear, ""); } catch (Exception ex) { LOGGER.Error(ex, "客显测试异常"); MessageBox.Show(ex.Message); } } } }