jt
2021-06-10 5d0d028456874576560552f5a5c4e8b801786f11
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
/*************************************************************************
 * 文件名称 :ServiceBaseEdit.cs                          
 * 描述说明 :定义数据服务基类中的编辑处理
 * 
 * 创建信息 : create by liuhuisheng.xm@gmail.com on 2012-11-10
 * 修订信息 : modify by (person) on (date) for (reason)
 * 
 * 版权信息 : Copyright (c) 2013 厦门纵云信息科技有限公司 www.zoewin.com
 **************************************************************************/
 
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Zephyr.Utils;
 
namespace Zephyr.Core
{
    public partial class ServiceBase<T> where T : ModelBase, new()
    {
        protected virtual bool OnBeforeEditPage(EditPageEventArgs arg)
        {
            return true;
        }
 
        protected virtual bool OnBeforeEditPageForm(EditPageEventArgs arg)
        {
            return true;
        }
 
        protected virtual void OnAfterEditPageForm(EditPageEventArgs arg)
        {
 
        }
 
        protected virtual bool OnBeforeEditPageRow(EditPageEventArgs arg)
        {
            return true;
        }
 
        protected virtual void OnAfterEditPageRow(EditPageEventArgs arg)
        {
 
        }
 
        protected virtual void OnAfterEditPage(EditPageEventArgs arg)
        {
 
        }
 
        public int EditPage(JObject data,RequestWrapper formWrapper, List<RequestWrapper> tabsWrapper)
        {
            const string DATA_TYPE_DELETED = "deleted";
            const string DATA_TYPE_UPDATED = "updated";
            const string DATA_TYPE_INSERTED = "inserted";
 
            const string DATA_TYPE_FORM = "form";
            const string DATA_TYPE_TABS = "tabs";
            const string DATA_TYPE_ARRAY = "Array";
 
            Dictionary<string, OptType> actionTypes = new Dictionary<string, OptType>{
                {DATA_TYPE_DELETED  ,OptType.Del},
                {DATA_TYPE_UPDATED  ,OptType.Mod},
                {DATA_TYPE_INSERTED ,OptType.Add}};
 
            var handles = new Dictionary<string, Func<RequestWrapper, int>>{
                {DATA_TYPE_DELETED  , x => BuilderParse(x.ToParamDelete()).Execute()},
                {DATA_TYPE_UPDATED  , x => BuilderParse(x.ToParamUpdate()).Execute()},
                {DATA_TYPE_INSERTED , x => BuilderParse(x.ToParamInsert()).Execute()}};
 
            var rowsAffected = 0;
 
            Logger("编辑记录", () =>
            {
                var formData = data[DATA_TYPE_FORM];
                var tabsData = data[DATA_TYPE_TABS];
                var editArgs = new EditPageEventArgs() { db = db, data=data, formWrapper=formWrapper, tabsWrapper=tabsWrapper};
 
                //开启事务
                db.UseTransaction(true);
 
                //更新全部数据之前事件
                var rtnBefore = this.OnBeforeEditPage(editArgs);
                if (!rtnBefore) return;
 
                //更新主表
                if (formData != null && formWrapper != null)
                {
                    formWrapper.SetRequestData(formData);
                    var changedFieldCount = formWrapper.ToParamUpdate().GetData().Columns.Count;
 
                    //如果有字段被修改则更新
                    if (changedFieldCount > 0)
                    {
                        //到数据库中取得旧值
                        var formOld = BuilderParse(formWrapper.ToParamQuery()).QuerySingleDynamic();
                        var strAction = (formOld == null) ? DATA_TYPE_INSERTED : DATA_TYPE_UPDATED;
 
                        //事件参数
                        editArgs.dataNew = formData;
                        editArgs.dataOld = formOld??new JObject();
                        editArgs.dataAction = actionTypes[strAction];
                        editArgs.dataWrapper = formWrapper;
 
                        //主表编辑前事件
                        rtnBefore = this.OnBeforeEditPageForm(editArgs);
                        if (!rtnBefore) return;
 
                        //主表数据处理
                        formWrapper.SetRequestData(editArgs.dataNew);
                        editArgs.executeValue = handles[strAction](formWrapper);
                        rowsAffected += editArgs.executeValue;
 
                        //把未修改的数据更新到form新值上,避免在后面的事件中使用formNew值时为null出现错误
                        if (editArgs.dataAction == OptType.Mod)
                        {
                            EachHelper.EachObjectProperty(editArgs.dataOld as object, (i, name, value) =>
                            {
                                if (editArgs.dataNew[name] == null)
                                    editArgs.dataNew[name] = JToken.FromObject(value ?? string.Empty);
                            });
                        }
 
                        //主表编辑结束事件
                        this.OnAfterEditPageForm(editArgs);
                    }
                }
 
                //更新tabs
                if (tabsData != null && tabsWrapper != null)
                {
                    var current = 0;
                    var wrapperCount = tabsWrapper.Count;
 
                    foreach (JToken tab in tabsData.Children())
                    {
                        //如果Tab数据长度大于wrapper长度,则结束
                        if (current > wrapperCount - 1)
                            break;
 
                        //如果数据为null或未配置相应的wrapper则跳过处理
                        var wrapper = tabsWrapper[current++];
                        if (tab == null || wrapper == null)
                            continue;
 
                        //判断是form类型还是grid类型
                        bool IsGrid = (tab[DATA_TYPE_DELETED] != null && tab[DATA_TYPE_DELETED].Type.ToString() == DATA_TYPE_ARRAY)
                            || (tab[DATA_TYPE_UPDATED] != null && tab[DATA_TYPE_UPDATED].Type.ToString() == DATA_TYPE_ARRAY)
                            || (tab[DATA_TYPE_INSERTED] != null && tab[DATA_TYPE_INSERTED].Type.ToString() == DATA_TYPE_ARRAY);
 
                        //事件参数
                        editArgs.dataWrapper = wrapper;
                        editArgs.tabIndex = current;
                        editArgs.tabType = IsGrid ? TabType.Grid : TabType.Form;
                        editArgs.tabData = tab;
 
                        if (IsGrid)
                        {
                            foreach (JProperty item in tab.Children())
                            {
                                //只处理deleted updated inserted三个节点
                                if (!handles.ContainsKey(item.Name))
                                    continue;
 
                                //循环每一行数据
                                foreach (var row in item.Value.Children())
                                {
                                    //到数据库中取得旧值
                                    wrapper.SetRequestData(row);
                                    var rowOld = BuilderParse(wrapper.ToParamQuery()).QuerySingleDynamic();
 
                                    //事件参数
                                    editArgs.dataNew = row;
                                    editArgs.dataOld = rowOld ?? new JObject();
                                    editArgs.dataAction = actionTypes[item.Name];
 
                                    //行编辑前事件
                                    rtnBefore = this.OnBeforeEditPageRow(editArgs);
                                    if (!rtnBefore) return;
 
                                    //数据处理
                                    wrapper.SetRequestData(editArgs.dataNew);
                                    editArgs.executeValue = handles[item.Name](wrapper);
                                    rowsAffected += editArgs.executeValue;
 
                                    //行编辑后事件
                                    this.OnAfterEditPageRow(editArgs);
                                }
                            }
                        }
                        else
                        {
                            wrapper.SetRequestData(tab);
                            var changedFieldCount = wrapper.ToParamUpdate().GetData().Columns.Count;
 
                            //如果有字段被修改则更新
                            if (changedFieldCount > 0)//更新主表
                            {
                                //到数据库中取得旧值
                                var formOld = BuilderParse(wrapper.ToParamQuery()).QuerySingleDynamic();
                                var strAction = (formOld == null) ? DATA_TYPE_INSERTED : DATA_TYPE_UPDATED;
 
                                //事件参数
                                editArgs.dataNew = tab;
                                editArgs.dataOld = formOld ?? new JObject();
                                editArgs.dataAction = actionTypes[strAction];
                                editArgs.dataWrapper = wrapper;
 
                                //Form编辑前事件
                                rtnBefore = this.OnBeforeEditPageRow(editArgs);
                                if (!rtnBefore) return;
 
                                //Form数据处理
                                wrapper.SetRequestData(editArgs.dataNew);
                                editArgs.executeValue = handles[strAction](wrapper);
                                rowsAffected += editArgs.executeValue;
 
                                //把未修改的数据更新到form新值上
                                if (editArgs.dataAction == OptType.Mod)
                                {
                                    EachHelper.EachObjectProperty(editArgs.dataOld as object, (i, name, value) =>
                                    {
                                        if (editArgs.dataNew[name] == null)
                                            editArgs.dataNew[name] = JToken.FromObject(value ?? string.Empty);
                                    });
                                }
 
                                //Form编辑结束事件
                                this.OnAfterEditPageRow(editArgs);
                            }
                        }
                    }
 
                    //更新全部数据之后事件
                    editArgs.executeValue = rowsAffected;
                    this.OnAfterEditPage(editArgs);
 
                    //提交事务
                    if (rowsAffected > 0)
                    {
                        db.Commit();
                        Msg.Set(MsgType.Success, APP.MSG_SAVE_SUCCESS);
                    }
                }
            }, e => db.Rollback());
 
            return rowsAffected;
        }
    }
}