huawei
20 小时以前 f0e4fa93666206c4af4a654c43148915d934c6ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
using DevExpress.XtraEditors;
using Gs.DevApp.ToolBox;
using Newtonsoft.Json;
using System;
using System.Windows.Forms;
 
namespace Gs.DevApp.DevFrm.Sys
{
    /// <summary>
    /// 看板节点编辑窗体
    /// </summary>
    public partial class SimpleKanBanEdit : DevExpress.XtraEditors.XtraForm
    {
        private string _webServiceName = "MesSimpleManager/";
        private string _strId = "";      // 当前编辑的节点ID(为空表示新增)
        private string _strFid = "";     // 父节点ID
        private int _nodeLevel = 0;       // 节点层级
        private bool _isEditMode = false; // 是否为编辑模式
        private bool _isLoading = false; // 是否正在加载数据
 
        /// <summary>
        /// 保存成功后的回调事件
        /// </summary>
        public event EventHandler<UpdateParentEventArgs> UpdateParent;
 
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="strId">节点ID,为空表示新增</param>
        /// <param name="strFid">父节点ID,为空表示根节点</param>
        public SimpleKanBanEdit(string strId, string strFid)
        {
            InitializeComponent();
            rgNodeType.EditValueChanged += RgNodeType_EditValueChanged;
            _strId = strId;
            _strFid = strFid;
            _isEditMode = !string.IsNullOrEmpty(_strId);
 
            // 设置窗体标题
            this.Text = _isEditMode ? "编辑看板节点" : "新增看板节点";
 
            // 初始化节点类型选项(0=根目录, 1=看板目录, 2=看板内容)
            rgNodeType.Properties.Items.Clear();
            rgNodeType.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem(0, "根目录"));
            rgNodeType.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem(1, "看板目录"));
            rgNodeType.Properties.Items.Add(new DevExpress.XtraEditors.Controls.RadioGroupItem(2, "看板内容"));
 
            // 保存按钮
            btnSave.Click += BtnSave_Click;
 
            // 取消按钮
            btnCancel.Click += (s, e) => { this.Close(); };
 
            // 初始化默认值
            seSortOrder.Value = 0;
            seCarouselDuration.Value = 10;
            chkIsExpanded.Checked = false;
            chkIsEnabled.Checked = true;
 
            // 加载数据
            if (_isEditMode)
            {
                LoadModel();
            }
            else
            {
                // 新增模式:根据父节点计算当前节点层级并设置节点类型
                InitNodeLevelAndType();
            }
        }
 
  
        /// <summary>
        /// 新增模式:初始化节点层级
        /// 规则:
        /// - node_level = 0:根节点
        /// - node_level >= 1:非根节点
        /// </summary>
        private void InitNodeLevelAndType()
        {
            if (string.IsNullOrEmpty(_strFid))
            {
                // 无父节点,说明是根节点
                _nodeLevel = 0;
            }
            else
            {
                // 有父节点,基于父节点层级 +1
                try
                {
                    var _obj = new { Id = long.Parse(_strFid) };
                    var json = JsonConvert.SerializeObject(_obj);
                    var strReturn = UtilityHelper.HttpPost("", _webServiceName + "GetModel", json);
                    var dd = UtilityHelper.ReturnToDynamic(strReturn);
 
                    if (dd.rtnCode > 0 && dd.rtnData != null)
                    {
                        int parentNodeLevel = dd.rtnData.nodeLevel != null
                            ? Convert.ToInt32(dd.rtnData.nodeLevel)
                            : 0;
 
                        _nodeLevel = parentNodeLevel + 1;
                    }
                    else
                    {
                        _nodeLevel = 1;
                    }
                }
                catch
                {
                    _nodeLevel = 1;
                }
            }
 
            // 根据层级初始化 NodeType & 控件状态
            SetNodeTypeByLevel();
        }
 
        /// <summary>
        /// 根据节点层级设置节点类型
        /// - node_level = 0:只能选 0(根目录),整个控件禁用
        /// - node_level >= 1:只能选 1 / 2,根目录项灰掉不可选
        /// </summary>
        private void SetNodeTypeByLevel()
        {
            // 先统一启用控件,后面按情况处理
            rgNodeType.Enabled = true;
 
            if (_nodeLevel == 0)
            {
                // 根节点:只能是根目录
                rgNodeType.EditValue = 0;
                rgNodeType.Enabled = false;
            }
            else
            {
                // 非根节点:不能选“根目录(0)”
                DisableRootNodeTypeItem();
 
                // 如果当前值是 0,强制切到默认值
                if (rgNodeType.EditValue == null ||
                    Convert.ToInt32(rgNodeType.EditValue) == 0)
                {
                    rgNodeType.EditValue = 1; // 默认“看板目录”
                }
            }
 
            SetControlsByNodeType();
        }
 
        /// <summary>
        /// 禁用 NodeType=0(根目录)选项
        /// </summary>
        private void DisableRootNodeTypeItem()
        {
            foreach (DevExpress.XtraEditors.Controls.RadioGroupItem item in rgNodeType.Properties.Items)
            {
                if (Convert.ToInt32(item.Value) == 0)
                {
                    item.Enabled = false;
                    break;
                }
            }
        }
        private void LoadModel()
        {
            try
            {
                var _obj = new { Id = long.Parse(_strId) };
                var json = JsonConvert.SerializeObject(_obj);
                var strReturn = UtilityHelper.HttpPost("", _webServiceName + "GetModel", json);
                var dd = UtilityHelper.ReturnToDynamic(strReturn);
 
                if (dd.rtnCode > 0 && dd.rtnData != null)
                {
                    var m = dd.rtnData;
 
                    // 1. 基础赋值
                    txtCode.Text = m.code != null ? m.code.ToString() : "";
                    txtTitle.Text = m.title != null ? m.title.ToString() : "";
                    txtUrl.Text = m.url != null ? m.url.ToString() : "";
                    _isLoading = true;
 
                    _nodeLevel = m.nodeLevel != null ? Convert.ToInt32(m.nodeLevel) : 0;
                    if (m.parentId != null) _strFid = m.parentId.ToString();
 
                    
                    if (m.nodeType != null)
                    {
                        int type = Convert.ToInt32(m.nodeType);
                        rgNodeType.EditValue = type;
 
                        // 获取子节点数量 (从存储过程新增的字段)
                        int childCount = m.childCount != null ? Convert.ToInt32(m.childCount) : 0;
 
                        // 逻辑判断
                        if (type == 0)
                        {
                            // 根目录:永远不可修改
                            rgNodeType.Properties.ReadOnly = true;
                        }
                        else
                        {
                            
                            if (childCount > 0)
                            {
                                rgNodeType.Properties.ReadOnly = true;
                                // 可以给用户一个提示(Tooltip)或在保存时体现,这里仅控制UI只读
                            }
                            else
                            {
                                rgNodeType.Properties.ReadOnly = false;
                            }
                        }
                    }
                   
 
                    SetControlsByNodeType(); // 刷新界面
                    _isLoading = false;
 
                    // 其他字段
                    if (m.carouselDuration != null) seCarouselDuration.Value = Convert.ToInt32(m.carouselDuration);
                    if (m.sortOrder != null) seSortOrder.Value = Convert.ToInt32(m.sortOrder);
                    chkIsExpanded.Checked = m.isExpanded != null && Convert.ToBoolean(m.isExpanded);
                    chkIsEnabled.Checked = m.isEnabled != null && Convert.ToBoolean(m.isEnabled);
                }
                else
                {
                    MsgHelper.ShowError("加载数据失败:" + dd.rtnMsg);
                }
            }
            catch (Exception ex)
            {
                MsgHelper.ShowError("加载数据异常:" + ex.Message);
            }
        }
 
        /// <summary>
        /// 根据节点层级(node_level)设置 URL 和轮播时长显示状态
        /// </summary>
        private void SetControlsByNodeType()
        {
            int nodeType = Convert.ToInt32(rgNodeType.EditValue);
            // 只有 nodeType == 2(看板内容)才显示
            bool show = (nodeType == 2);
 
            SetUrlAndDurationVisible(show);
        }
        /// <summary>
        /// 类型更改自动刷新
        /// </summary>
        private void RgNodeType_EditValueChanged(object sender, EventArgs e)
        {
            SetControlsByNodeType();
        }
        /// <summary>
        /// 设置 URL 和轮播时长的显示状态
        /// </summary>
        private void SetUrlAndDurationVisible(bool visible)
        {
            // 控制可见性
            layoutControlItem4.Visibility = visible
                ? DevExpress.XtraLayout.Utils.LayoutVisibility.Always
                : DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
 
            layoutControlItem5.Visibility = visible
                ? DevExpress.XtraLayout.Utils.LayoutVisibility.Always
                : DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
 
            // 控制可编辑状态
            txtUrl.Enabled = visible;
            seCarouselDuration.Enabled = visible;
 
            if (!visible)
            {
                // 不可见时清空
                txtUrl.Text = string.Empty;
                seCarouselDuration.Value = 0;
            }
            else
            {
                // 可见时给默认值
                if (seCarouselDuration.Value <= 0)
                {
                    seCarouselDuration.Value = 5; // 默认 5 秒
                }
            }
        }
 
        /// <summary>
        /// 保存按钮点击事件
        /// </summary>
        private void BtnSave_Click(object sender, EventArgs e)
        {
            // 验证必填项
            if (string.IsNullOrWhiteSpace(txtTitle.Text))
            {
                MsgHelper.Warning("名称不能为空!");
                txtTitle.Focus();
                return;
            }
 
            // 节点类型为看板内容时,URL不能为空
            if ((int)rgNodeType.EditValue == 2 && string.IsNullOrWhiteSpace(txtUrl.Text))
            {
                MsgHelper.Warning("看板内容的URL地址不能为空!");
                txtUrl.Focus();
                return;
            }
 
            try
            {
                // 构建保存对象
                var _obj = new
                {
                    Id = string.IsNullOrEmpty(_strId) ? 0 : long.Parse(_strId),
                    ParentId = string.IsNullOrEmpty(_strFid) ? (long?)null : long.Parse(_strFid),
                    NodeType = (int)rgNodeType.EditValue,
                    Code = string.IsNullOrWhiteSpace(txtCode.Text) ? null : txtCode.Text.Trim(),
                    Title = txtTitle.Text.Trim(),
                    Url = string.IsNullOrWhiteSpace(txtUrl.Text) ? null : txtUrl.Text.Trim(),
                    CarouselDuration = (int)rgNodeType.EditValue == 2 ? (int?)seCarouselDuration.Value : null,
                    IsExpanded = chkIsExpanded.Checked,
                    IsEnabled = chkIsEnabled.Checked,
                    SortOrder = (int)seSortOrder.Value
                };
 
                var json = JsonConvert.SerializeObject(_obj);
                var strReturn = UtilityHelper.HttpPost("", _webServiceName + "SaveModel", json);
                var dd = UtilityHelper.ReturnToDynamic(strReturn);
 
                if (dd.rtnCode > 0)
                {
                    MsgHelper.ShowInformation("保存成功!");
 
                    // 触发父窗体刷新事件
                    UpdateParent?.Invoke(this, new UpdateParentEventArgs());
 
                    this.Close();
                }
                else
                {
                    MsgHelper.ShowError("保存失败:" + dd.rtnMsg);
                }
            }
            catch (Exception ex)
            {
                MsgHelper.ShowError("保存异常:" + ex.Message);
            }
        }
    }
}