1
zhangyanpeng
2024-05-29 af8f46ca6853ca06fdd0145ba61b57a958fa3afe
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
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
/* ********** */
Root = window.top.Root;
RootRole = window.top.RootRole;
dataRoot = window.top.dataRoot;
dataRootFields = window.top.dataRootFields;
buttonsconfig = window.top.buttonsconfig;
Server = window.top.Server;
 
Sortable = window.top.Sortable;
system_config = window.top.config.system_config;
 
//显示大小基准
//分辨率基准
var screen_draft = [1920, 1080];
//var screen_draft = [1366, 768];
//可视范围基准
var wh_draft = [1366, 728];
var h_language = localStorage.getItem("userlanguage") || "zh";
 
dateFormat = window.top.dateFormat;
 
/* 流程架构 */
Vue.component("h-flow", {
    template: [
        '<div :class="[\'z_left_menu_tree\', isCheckbox ? \'z_left_menu_checkbox\' : \'\']">',
            '<div v-if="isfilter" style="height: 38px; line-height: 38px; padding: 0px 12px;">',
                '<el-input placeholder="输入关键字搜索" v-model="filterText"></el-input>',
            '</div>',
            
            '<div v-if="treeheight" :style="{height: treeheight - 38 + \'px\', overflow: \'auto\'}">',
                '<el-tree ref="hierTree" class="filter-tree" :node-key="nodekey" :indent="indent" ',
                ' :default-expand-all="defaultExpandAll" ',
                ' highlight-current ',
                ' :data="treeData" ',
                ' show-checkbox ',
                ' :accordion="accordion" ',
                ' :expand-on-click-node="expandOnClickNode" ',
                ' :current-node-key="currentnodekey" ',
                ' :default-expanded-keys="defaultExpandedKeys" ',
                ' :default-checked-keys="selectCheckedKeys" ',
                ' :filter-node-method="filterNode" ',
                ' :icon-class="iconclass" ',
                ' :icon-expanded-class="iconExpandedClass" ',
                ' :draggable="isDraggable" ',
                ' :allow-drop="allowDrop" ',
                ' :allow-drag="allowDrag" ',
                ' :check-strictly="checkstrictly"',
                ' :check-on-click-node="checkOnClickNode"',
                
                ' @node-drag-end="handleDragEnd" ',
                ' @node-drop="handleDrop" ',
                ' @node-click="nodeClick" ',
                ' @check-change="checkClick" ',
                ' >',
                    '<span class="custom-tree-node z_menu_tree" slot-scope="{ node, data, itm }"',
                    ' @mouseenter="node_isShow(data, true)"',
                    ' @mouseleave="node_isShow(data, false)"',
                    '>',
                        '<span>',
                            // '<div class="nodeLabel nodeLabel_l" style="height: 32px; line-height: 32px;">',
                            // '</div>',
                            
                            // '<div class="nodeLabel z_left_menu_tree_txt">',
                            //     '<i v-if="!node.isLeaf" :class="!node.expanded ? \'el-icon-plus\':\'el-icon-minus\'" style="font-size: 12px; margin-right: 10px; border: 1px solid #a7a9a9; color: #a7a9a9;"></i>',
                            //     '<i v-else-if="!data.parent_id" style="font-size: 12px;"></i>',
                            //     '<i v-else style="font-size: 12px; margin-right: 10px;"></i>',
                            // '</div>',
                            '<div v-if="data.nodeformatfield" class="nodeLabel z_left_menu_tree_txt">',
                                '<span>{{ data[data.nodeformatfield] }}</span>',
                            '</div>',
                            '<div v-else class="nodeLabel z_left_menu_tree_txt">',
                                '<span v-for="(nodeTxt, k) in treeTxtList">',
                                    '<span v-if="nodeTxt.type == \'value\'">{{ nodeTxt.value }}</span>',
                                    '<span v-else-if="nodeTxt.type == \'field\'">{{ data[nodeTxt.value] }}</span>',
                                '</span>',
                                // '<el-badge :ref="\'dadgeid_\' + data.id" v-show="data.isBadge ? true : false" is-dot class="item">',
                                // '<el-badge :ref="\'dadgeid_\' + data.id" v-show="(data.isBadge || data.badgeval) ? true : false" :value="data.badgeval" :is-dot="data.badgeval ? false : true" class="h_tree_badge_dot">',
                                // '</el-badge>',
                            '</div>',
                            '<template v-if="markfields && markfields.length" v-for="(markfield, mfk) in markfields">',
                                // 标记
                                '<div v-if="markfield.field && data[markfield.field]" class="nodeLabel z_left_menu_tree_txt">',
                                    '<el-tag v-if="markfield.isclick" :type="markfield.tagtype" size="mini"',
                                    '@click.stop="onMarkClick(markfield, data, node)" class="z_node_button_mb">{{markfield.name ? markfield.name : data[markfield.field]}}</el-tag>',
                                    
                                    '<el-tag v-else size="mini" :type="markfield.tagtype" class="z_node_button_mt">{{markfield.name ? markfield.name : data[markfield.field]}}</el-tag>',
                                '</div>',
                            '</template>',
                            
                            '<el-badge :ref="\'dadgeid_\' + data.id" v-show="(data.isBadge || data.badgeval) ? true : false" :value="data.badgeval" :is-dot="data.badgeval ? false : true" class="h_tree_badge_dot">',
                            '</el-badge>',
                        '</span>',
                        '<span v-if="data.isnotnode_edit || (markdelfield && data[markdelfield])">',
                        '</span>',
                        '<span v-else>',
                            '<div :ref="data.id" v-show="false" class="nodeLabel" style="max-width: 128px;">',
                                '<template v-if="maxlevel" >',
                                    '<el-button v-if="node.level < maxlevel &&  (!data.parent_id || (data.children && data.children.length) || data.ishnodeadd || isbottomadd) && editTreeButton.add.isshow && !data.isnot_nodeadd" type="text" ',
                                    '@click.stop="addNode(data,node)" class="z_node_button aaa1" icon="el-icon-circle-plus-outline">',
                                    '</el-button>',
                                '</template>',
                                '<template v-else>',
                                    '<el-button v-if="(!data.parent_id || (data.children && data.children.length) || data.ishnodeadd || isbottomadd) && editTreeButton.add.isshow && !data.isnot_nodeadd" type="text" ',
                                    '@click.stop="addNode(data,node)" class="z_node_button bbb" icon="el-icon-circle-plus-outline">',
                                    '</el-button>',
                                '</template>',
                                
                                // '<el-button v-if="editTreeButton.edit.isshow && !data.edit_disabled" type="text" ',
                                '<el-button v-if="editTreeButton.edit.isshow && !data.isnot_nodeedit" type="text" ',
                                '@click.stop="editNode(data,node)" class="z_node_button" icon="el-icon-edit">',
                                '</el-button>',
                                '<el-button v-if="!(data.children && data.children.length) && editTreeButton.del.isshow && !data.isnot_nodedel" type="text" ',
                                '@click.stop="delNode(data,node)" class="z_node_button" icon="el-icon-delete">',
                                '</el-button>',
                            '</div>',
                            
                            /* '<div class="nodeLabel" style="margin-right: 30px;">',
                                // '<span v-if="!node.isLeaf && !data.badgeval">{{data.children.length}}</span>',
                                // '<span v-if="!node.isLeaf && data.badgeval">{{data.badgeval}}</span>',
                            '</div>', */
                        '</span>',
                    '</span>',
                '</el-tree>',
            '</div>',
            
            '<div v-else>',
                '<el-tree ref="hierTree" class="filter-tree" :node-key="nodekey" :indent="indent" ',
                ' :default-expand-all="defaultExpandAll" ',
                ' highlight-current ',
                ' :data="treeData" ',
                ' show-checkbox ',
                ' :accordion="accordion" ',
                ' :draggable="isDraggable" ',
                ' :expand-on-click-node="expandOnClickNode" ',
                ' :current-node-key="currentnodekey" ',
                ' :default-expanded-keys="defaultExpandedKeys" ',
                ' :default-checked-keys="selectCheckedKeys" ',
                ' :filter-node-method="filterNode" ',
                ' :icon-class="iconclass" ',
                ' :icon-expanded-class="iconExpandedClass" ',
                ' :allow-drop="allowDrop" ',
                ' :allow-drag="allowDrag" ',
                ' :check-strictly="checkstrictly"',
                ' :check-on-click-node="checkOnClickNode"',
                
                ' @node-drag-end="handleDragEnd" ',
                ' @node-drop="handleDrop" ',
                ' @node-click="nodeClick" ',
                ' @check-change="checkClick" ',
                ' >',
                    '<span class="custom-tree-node z_menu_tree" slot-scope="{ node, data, itm }"',
                    ' @mouseenter="node_isShow(data, true)"',
                    ' @mouseleave="node_isShow(data, false)"',
                    '>',
                        '<span>',
                            // '<div class="nodeLabel nodeLabel_l" style="height: 32px; line-height: 32px;">',
                            // '</div>',
                            
                            // '<div class="nodeLabel z_left_menu_tree_txt">',
                            //     '<i v-if="!node.isLeaf" :class="!node.expanded ? \'el-icon-plus\':\'el-icon-minus\'" style="font-size: 12px; margin-right: 10px; border: 1px solid #a7a9a9; color: #a7a9a9;"></i>',
                            //     '<i v-else-if="!data.parent_id" style="font-size: 12px;"></i>',
                            //     '<i v-else style="font-size: 12px; margin-right: 10px;"></i>',
                            // '</div>',
                            '<div class="nodeLabel z_left_menu_tree_txt">',
                                '<span v-for="(nodeTxt, k) in treeTxtList">',
                                    '<span v-if="nodeTxt.type == \'value\'">{{ nodeTxt.value }}</span>',
                                    '<span v-else-if="nodeTxt.type == \'field\'">{{ data[nodeTxt.value] }}</span>',
                                '</span>',
                                // '<el-badge :ref="\'dadgeid_\' + data.id" v-show="data.isBadge ? true : false" is-dot class="item">',
                                // '<el-badge :ref="\'dadgeid_\' + data.id" v-show="(data.isBadge || data.badgeval) ? true : false" :value="data.badgeval" :is-dot="data.badgeval ? false : true" class="h_tree_badge_dot">',
                                // '</el-badge>',
                            '</div>',
                            '<el-badge :ref="\'dadgeid_\' + data.id" v-show="(data.isBadge || data.badgeval) ? true : false" :value="data.badgeval" :is-dot="data.badgeval ? false : true" class="h_tree_badge_dot">',
                            '</el-badge>',
                        '</span>',
                        '<span v-if="!data.isnotnode_edit">',
                            '<div :ref="data.id" v-show="false" class="nodeLabel" style="max-width: 128px;">',
                                '<template v-if="maxlevel" >'+
                                    '<el-button v-if="node.level < maxlevel &&  (!data.parent_id || (data.children && data.children.length) || data.ishnodeadd || isbottomadd) && editTreeButton.add.isshow && !data.isnot_nodeadd" type="text" ',
                                    '@click.stop="addNode(data,node)" class="z_node_button aaa2" icon="el-icon-circle-plus-outline">',
                                    '</el-button>',
                                '</template>'+
                                '<template v-else>'+
                                    '<el-button v-if="(!data.parent_id || (data.children && data.children.length) || data.ishnodeadd || isbottomadd) && editTreeButton.add.isshow && !data.isnot_nodeadd" type="text" ',
                                    '@click.stop="addNode(data,node)" class="z_node_button bbb" icon="el-icon-circle-plus-outline">',
                                    '</el-button>',
                                '</template>'+
                                
                                // '<el-button v-if="editTreeButton.edit.isshow && !data.edit_disabled" type="text" ',
                                '<el-button v-if="editTreeButton.edit.isshow && !data.isnot_nodeedit" type="text" ',
                                '@click.stop="editNode(data,node)" class="z_node_button" icon="el-icon-edit">',
                                '</el-button>',
                                '<el-button v-if="!(data.children && data.children.length) && editTreeButton.del.isshow && !data.isnot_nodedel" type="text" ',
                                '@click.stop="delNode(data,node)" class="z_node_button" icon="el-icon-delete">',
                                '</el-button>',
                            '</div>',
                            
                            /* '<div class="nodeLabel" style="margin-right: 30px;">',
                                // '<span v-if="!node.isLeaf && !data.badgeval">{{data.children.length}}</span>',
                                // '<span v-if="!node.isLeaf && data.badgeval">{{data.badgeval}}</span>',
                            '</div>', */
                        '</span>',
                    '</span>',
                '</el-tree>',
            '</div>',
        '</div>'].join(""),
    props: {
        flowData: Array, // 全部节点
        highlightData: Array, // 高亮节点
        isReadonly: {//是否只读
            type: Boolean,
            default: false
        },
        nodeDictionary: { // 节点字典
            type: Array,
            default: function(){
                return [
                    {code: "ApprovalNode", name: "审批人"},
                    {code: "ConditionsNode", name: "条件分支"},
                ]
            }
        },
        
        isDraggable: {//是否可拖拽节点
            type: Boolean,
            default: false
        },
        draggableType: {// 允许拖拽节泛范围, sameLevel同级拖拽, 
            type: String,
            default: ""
        },
        
        isCheckbox: {//是否显示复选框
            type: Boolean,
            default: false
        },
        checkstrictly: {//在显示复选框的情况下,是否严格的遵循父子不互相关联的做法
            type: Boolean,
            default: false
        },
        checkOnClickNode: { // 是否可以点击节点进行选中
            type: Boolean,
            default: false
        },
        isfilter: {//是否可查询
            type: Boolean,
            default: false
        },
        isfilterchildren: { // 关键字查询结果是否带出子节点 
            type: Boolean,
            default: true
        }, 
        
        defaultExpandAll: {//是否全部展开
            type: Boolean,
            default: true
        },
        expandOnClickNode: { // 是否在点击节点的时候展开或者收缩节点
            type: Boolean,
            default: false
        },
        accordion: {//是否手风琴
            type: Boolean,
            default: false
        },
        nodekey: { //
            type: String,
            default: "id"
        },
        markdelfield: { // 标记删除的字段,和标记字段没有关系
            type: String,
            default: "is_delete"
        }, 
        markfields: { // 标记字段
            type: Array,
            default: function(){
                return [
                    {
                        field: "is_delete",
                        name: "已删除",
                        tagtype: "danger", // 标记
                        isclick: false,
                    }
                ] 
            }
        },
        treeTxtFormatter: {//
            type: String,
            default: "#{name}-{name}%"
        },
        
        defaultExpandedKeys: {//默认展开节点数组
            type: Array,
            default: function(){
                return [];
            }
        },
        defaultCheckedKeys: {//默认勾选节点数组
            type: Array,
            default: function(){
                return [];
            }
        },
        maxlevel: {//最大层级,可用来控制添加按键的显示
            type: Number,
            default: 0
        },
        isbottomadd: { // 最底层是否允许添加按键
            type: Boolean,
            default: false
        },
        currentnodekey: "",//默认选中节点
        
        editTreeButton: {//编辑界面行按键(编辑,删除)
            type: Object,
            default: function(){
                return {
                    add: {
                        isshow:true,
                        txt:"编辑"
                    },
                    edit: {
                        isshow:true,
                        txt:"编辑"
                    },
                    del: {
                        isshow:true,
                        txt:"删除"
                    },
                }
            }
        },
        
        treeheight: {// 树容器的高度
            type: Number,
            default: 0
        },
    },
    
    data() {
        return {
            selectCheckedKeys: clone(this.defaultCheckedKeys),
            iconclass: "el-icon-plus",
            iconExpandedClass: "el-icon-minus", // 需要改element-ui中的index.js
            indent: 24,
            filterText: "", // 关键字查询
            filterField: [], // 关键字查询的字段
            treeTxtList: [
                {value: "", type: "value/field"}
            ],
            
            filterDataObj: {}, // 关键字查询的结果对象
        }
    },
    watch: {
        filterText(val) {
            this.filterDataObj = {};
            this.$refs.hierTree.filter(val);
        },
        defaultCheckedKeys() {
            this.selectCheckedKeys = clone(this.defaultCheckedKeys)
        }
    },
        
    mounted() {
        this.nodeTxtFormatter();
    },
    methods: {
        
    }
});
 
 
/* 节点(审批人)、、、预览、新增、删除、编辑 */
 
 
/* 节点(条件分支) */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
//**************通用事件*******************
//根据分辨率和基准分辨率设置缩放
function bodyScale(el) {
    var win_ratio = window.devicePixelRatio; // 当前显示设备的物理像素分辨率与CSS像素分辨率之比
    var screen_width = window.screen.width; //document.documentElement.clientWidth;//获取当前分辨率下的可是区域宽度
    var screen_height = window.screen.height; //document.documentElement.clientHeight;//获取当前分辨率下的可是区域宽度
    var scale_w = screen_width / win_ratio / screen_draft[0]; // 分母——设计稿的分辨率
    var scale_h = screen_height / win_ratio / screen_draft[1]; // 分母——设计稿的分辨率
    
    var win_width = document.documentElement.clientWidth;//获取当前分辨率下的可是区域宽度
    var win_height = document.documentElement.clientHeight;//获取当前分辨率下的可是区域宽度
    var win_w = win_width / win_ratio / wh_draft[0]; // 分母——设计稿的尺寸
    var win_h = win_height / win_ratio / wh_draft[1]; // 分母——设计稿的尺寸
    
    if (scale_w > 1 && scale_h > 1) {
        el.style.transform = "scale(" + scale_w + "," + scale_h + ")";//放大缩小相应倍数
    }
    else {
        el.style.width = win_width - 2 + "px";
        el.style.height = win_height - 2 + "px";
    }
    
    //el.style.transform = "scale(" + scale_w * win_w + "," + scale_h * win_h + ")";//放大缩小相应倍数
    //document.getElementById('sys_iframe').style.transform = "scale(" + scale_w + "," + scale_h + ")";//放大缩小相应倍数
}
 
//滚屏效果
const cubic = value => Math.pow(value, 3);
const easeInOutCubic = value => value < 0.5 ? cubic(value * 2) / 2 : 1 - cubic((1 - value) * 2) / 2;