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; using POSV.MessageEvent; namespace POSV.Component { [ToolboxItem(true)] public partial class SpecMakeParameter : AbstractParameter { /// /// 默认参数 /// private string[] itemHeight = { "40", "45", "50", "55", "60", "70", "80" }; private string[] cols = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15" }; private string[] itemWidth = { "0", "70", "80", "90", "100", "110", "120", "130" }; /// /// 修改前的数据 /// private Dictionary _oldValue = new Dictionary(); /// /// 修改后的数据 /// private Dictionary _newValue = new Dictionary(); /// /// 是否初始化 /// private bool _inited = false; private ProductMakeItem _makeItem = null; private ProductSpecItem _specItem = null; public SpecMakeParameter() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; this.BackColor = Color.Transparent; //==============做法============ //字体大小 this.comboBoxEx5.DataSource = Enum.GetValues(typeof(SystemFont)); //cols this.comboBoxEx8.DataSource = (string[])cols.Clone(); //宽度 this.comboBoxEx7.DataSource = (string[])itemWidth.Clone(); //高度 this.comboBoxEx6.DataSource = (string[])itemHeight.Clone(); //==============规格============ //字体大小 this.comboBoxEx9.DataSource = Enum.GetValues(typeof(SystemFont)); //cols this.comboBoxEx1.DataSource = (string[])cols.Clone(); //宽度 this.comboBoxEx3.DataSource = (string[])itemWidth.Clone(); //高度 this.comboBoxEx2.DataSource = (string[])itemHeight.Clone(); 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.SPECMAKE_GROUP)); } //将新增加或者变更的参数重新更新到数据库 var defaultValue = ConfigConstant.SpecMakeGroupDefaultValue(); //数据库有配置参数 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.SPECMAKE_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.SPECMAKE_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(); //做法 var makeJson = data[ConfigConstant.MAKE_JSON_TEMPLATE]; if (!string.IsNullOrEmpty(makeJson)) { _makeItem = JsonUtils.Deserialize(makeJson); if (_makeItem != null) { //是否显示售价 this.checkBoxX4.Checked = _makeItem.ShowPrice; //背景颜色 this.comboBoxColorPicker6.Color = ColorTranslator.FromHtml(_makeItem.BackColor1); this.comboBoxColorPicker5.Color = ColorTranslator.FromHtml(_makeItem.BackColor2); //字体颜色 this.comboBoxColorPicker4.Color = ColorTranslator.FromHtml(_makeItem.TxtColor); //字体大小 this.comboBoxEx5.Text = _makeItem.MakeFont.ToString(); //每行显示列数 this.comboBoxEx8.Text = _makeItem.Cols.ToString(); //宽度 this.comboBoxEx7.Text = _makeItem.ItemWidth.ToString(); //高度 this.comboBoxEx6.Text = _makeItem.ItemHeight.ToString(); } } //规格 var specJson = data[ConfigConstant.SPEC_JSON_TEMPLATE]; if (!string.IsNullOrEmpty(specJson)) { var _specItem = JsonUtils.Deserialize(specJson); if (_specItem != null) { //是否显示售价 this.checkBoxX1.Checked = _specItem.ShowPrice; //背景颜色 this.comboBoxColorPicker9.Color = ColorTranslator.FromHtml(_specItem.BackColor1); this.comboBoxColorPicker8.Color = ColorTranslator.FromHtml(_specItem.BackColor2); //字体颜色 this.comboBoxColorPicker4.Color = ColorTranslator.FromHtml(_specItem.TxtColor); //字体大小 this.comboBoxEx9.Text = _specItem.SpecFont.ToString(); //每行显示列数 this.comboBoxEx1.Text = _specItem.Cols.ToString(); //宽度 this.comboBoxEx3.Text = _specItem.ItemWidth.ToString(); //高度 this.comboBoxEx2.Text = _specItem.ItemHeight.ToString(); } } //界面加载完成 this._inited = true; } public List NewChanged() { var result = new List(); //尚未初始化完成 if (!this._inited) return result; //做法 ProductMakeItem newMake = new ProductMakeItem(); newMake.ShowPrice = this.checkBoxX4.Checked; newMake.BackColor1 = ColorTranslator.ToHtml(this.comboBoxColorPicker6.Color); newMake.BackColor2 = ColorTranslator.ToHtml(this.comboBoxColorPicker5.Color); newMake.TxtColor = ColorTranslator.ToHtml(this.comboBoxColorPicker4.Color); newMake.MakeFont = (SystemFont)Enum.Parse(typeof(SystemFont), this.comboBoxEx5.Text); newMake.Cols = StringUtils.GetInt(this.comboBoxEx8.Text); newMake.ItemWidth = StringUtils.GetInt(this.comboBoxEx7.Text); newMake.ItemHeight = StringUtils.GetInt(this.comboBoxEx6.Text); //判断是否更改,如果过更改压入到 NewValue bool isChanged = !(newMake.Equals(this._makeItem)); if (isChanged) { var config = new Config(); config.Id = IdWorkerUtils.Instance.NextId(); config.Group = ConfigConstant.SPECMAKE_GROUP; config.TenantId = Global.Instance.Authc.TenantId; config.Keys = ConfigConstant.MAKE_JSON_TEMPLATE; config.Values = JsonUtils.Serialize(newMake); result.Add(config); } //规格 ProductSpecItem newSpec = new ProductSpecItem(); newSpec.ShowPrice = this.checkBoxX1.Checked; newSpec.BackColor1 = ColorTranslator.ToHtml(this.comboBoxColorPicker9.Color); newSpec.BackColor2 = ColorTranslator.ToHtml(this.comboBoxColorPicker8.Color); newSpec.TxtColor = ColorTranslator.ToHtml(this.comboBoxColorPicker4.Color); newSpec.SpecFont = (SystemFont)Enum.Parse(typeof(SystemFont), this.comboBoxEx9.Text); newSpec.Cols = StringUtils.GetInt(this.comboBoxEx1.Text); newSpec.ItemWidth = StringUtils.GetInt(this.comboBoxEx3.Text); newSpec.ItemHeight = StringUtils.GetInt(this.comboBoxEx2.Text); //判断是否更改,如果过更改压入到 NewValue isChanged = !(newSpec.Equals(this._specItem)); if (isChanged) { var config = new Config(); config.Id = IdWorkerUtils.Instance.NextId(); config.Group = ConfigConstant.SPECMAKE_GROUP; config.TenantId = Global.Instance.Authc.TenantId; config.Keys = ConfigConstant.SPEC_JSON_TEMPLATE; config.Values = JsonUtils.Serialize(newSpec); 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) { UpdateSpecMakeUi(); } } return new Tuple(isSuccess, message); } private void UpdateSpecMakeUi() { Config specConfig = null; Config flavorConfig = null; lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { string sql = string.Format(SqlConstant.ConfigQueryByGroupAndKey, ConfigConstant.SPECMAKE_GROUP, ConfigConstant.SPEC_JSON_TEMPLATE); specConfig = db.SingleOrDefault(sql); sql = string.Format(SqlConstant.ConfigQueryByGroupAndKey, ConfigConstant.SPECMAKE_GROUP, ConfigConstant.MAKE_JSON_TEMPLATE); flavorConfig = db.SingleOrDefault(sql); } } if (specConfig != null) { ProductSpecItem item = JsonUtils.Deserialize(specConfig.Values); //发送分组通知 MsgEvent.Send(Constant.SPEC_CHANGED_NOTIFY, item); } if (flavorConfig != null) { ProductMakeItem item = JsonUtils.Deserialize(flavorConfig.Values); //发送分组通知 MsgEvent.Send(Constant.FLAVOR_CHANGED_NOTIFY, item); } } } }