vue2-client 1.14.49 → 1.14.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +1 -1
- package/package.json +1 -1
- package/src/base-client/components/common/XTab/XTab.vue +22 -7
- package/src/base-client/components/common/XTable/XTable.vue +3 -1
- package/src/base-client/components/common/XUploadFilesView/index.vue +485 -0
- package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +1 -1
- package/src/pages/WorkflowDetail/WorkFlowDemo.vue +1 -1
- package/src/pages/WorkflowDetail/WorkflowDetail.vue +45 -29
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +0 -15
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +185 -136
- package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +1 -1
package/.env
CHANGED
|
@@ -15,6 +15,6 @@ VUE_APP_DIVISIONSOHCHINA=admin.divisionsohchina
|
|
|
15
15
|
VUE_APP_WEB_CONFIG_KEY=admin.webconfig
|
|
16
16
|
VUE_APP_WEB_STYLES_KEY=admin.webstylesconfig
|
|
17
17
|
VUE_APP_API_BASE_URL=http://123.60.214.109:8405
|
|
18
|
-
VUE_APP_SYSTEM_NAME=af-
|
|
18
|
+
VUE_APP_SYSTEM_NAME=af-apply
|
|
19
19
|
VUE_APP_LOGIN_VERSION=V4
|
|
20
20
|
|
package/package.json
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<a-card :bordered="false">
|
|
3
|
-
<a-tabs :tabBarGutter="
|
|
2
|
+
<a-card :bordered="false" :body-style="bodyStyle">
|
|
3
|
+
<a-tabs :tabBarGutter="tabBarGutter" :activeKey="activeKey" @change="tabPaneChange" :hideAdd="true" :tabBarStyle="{ display: showTabBar ? 'block' : 'none' }">
|
|
4
|
+
<slot name="extraBeforeTabs"></slot>
|
|
4
5
|
<a-tab-pane
|
|
5
6
|
:forceRender="true"
|
|
6
7
|
v-for="(tab, index) in config.data"
|
|
7
|
-
:key="index"
|
|
8
|
+
:key="'xTabPane' + index"
|
|
8
9
|
:tab="tab.title"
|
|
9
10
|
>
|
|
10
11
|
<component
|
|
11
12
|
:is="tab.slotType"
|
|
12
|
-
:key="index"
|
|
13
|
+
:key="'xTabPane' + index"
|
|
13
14
|
:ref="`tab_com_${tab.slotType}_${index}`"
|
|
14
15
|
:serviceName="tab.serviceName"
|
|
15
16
|
:serverName="tab.serviceName"
|
|
@@ -57,6 +58,9 @@ export default {
|
|
|
57
58
|
computed: {
|
|
58
59
|
...mapState('account', { currUser: 'user' })
|
|
59
60
|
},
|
|
61
|
+
mounted () {
|
|
62
|
+
this.activeKey = this.defaultActiveKey
|
|
63
|
+
},
|
|
60
64
|
methods: {
|
|
61
65
|
// 自定义函数中调用的方法 这个不能删
|
|
62
66
|
getWindow,
|
|
@@ -211,6 +215,20 @@ export default {
|
|
|
211
215
|
type: Object,
|
|
212
216
|
default: undefined
|
|
213
217
|
},
|
|
218
|
+
tabBarGutter: {
|
|
219
|
+
type: Number,
|
|
220
|
+
default: 10
|
|
221
|
+
},
|
|
222
|
+
bodyStyle: {
|
|
223
|
+
type: Object,
|
|
224
|
+
default: () => {
|
|
225
|
+
return {}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
defaultActiveKey: {
|
|
229
|
+
type: String,
|
|
230
|
+
default: 'xTabPane0'
|
|
231
|
+
},
|
|
214
232
|
},
|
|
215
233
|
watch: {
|
|
216
234
|
configName: {
|
|
@@ -232,7 +250,4 @@ export default {
|
|
|
232
250
|
}
|
|
233
251
|
</script>
|
|
234
252
|
<style scoped>
|
|
235
|
-
:deep(.ant-tabs-bar) {
|
|
236
|
-
margin: 0
|
|
237
|
-
}
|
|
238
253
|
</style>
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="upload-files-container">
|
|
3
|
+
<div class="filter-container">
|
|
4
|
+
<div class="filter-group">
|
|
5
|
+
<a-date-picker
|
|
6
|
+
v-model="upload_date"
|
|
7
|
+
placeholder="上传日期"
|
|
8
|
+
@change="selfSearch"
|
|
9
|
+
class="filter-item"
|
|
10
|
+
/>
|
|
11
|
+
<a-select
|
|
12
|
+
class="filter-item"
|
|
13
|
+
v-model="fusetype"
|
|
14
|
+
:options="fusetypes"
|
|
15
|
+
placeholder="分类"
|
|
16
|
+
@change="selfSearch"
|
|
17
|
+
allow-clear
|
|
18
|
+
/>
|
|
19
|
+
<a-button type="primary" @click="selfSearch" class="search-btn">
|
|
20
|
+
查询
|
|
21
|
+
</a-button>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div v-if="files.length === 0" class="empty-state">
|
|
26
|
+
<i class="anticon anticon-inbox empty-icon"></i>
|
|
27
|
+
<p>暂无附件数据</p>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div v-else class="file-timeline">
|
|
31
|
+
<div v-for="(item, index) in files" :key="'fileGroup' + index" class="date-group">
|
|
32
|
+
<div class="date-header">
|
|
33
|
+
<i class="anticon anticon-calendar"></i>
|
|
34
|
+
<span>{{ item.days }}</span>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="file-grid">
|
|
37
|
+
<div v-for="file in item.arrays" :key="'fileItem' + file.id" class="file-card">
|
|
38
|
+
<div class="card-content">
|
|
39
|
+
<div class="file-preview">
|
|
40
|
+
<img
|
|
41
|
+
v-if="file.f_filetype.includes('jpg') || file.f_filetype.includes('png')"
|
|
42
|
+
:src="file.f_downloadpath"
|
|
43
|
+
class="preview-image"
|
|
44
|
+
@click="previewImage(file.f_downloadpath)"
|
|
45
|
+
/>
|
|
46
|
+
<div v-else class="file-icon">
|
|
47
|
+
<i class="anticon anticon-file"></i>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
<div class="file-info">
|
|
51
|
+
<div class="info-row">
|
|
52
|
+
<span class="info-label"><i class="anticon anticon-clock-circle"></i> 上传时间:</span>
|
|
53
|
+
<span class="info-value">{{ file.f_uploaddate }}</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="info-row">
|
|
56
|
+
<span class="info-label"><i class="anticon anticon-user"></i> 操作员:</span>
|
|
57
|
+
<span class="info-value">{{ file.f_username }}</span>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="info-row">
|
|
60
|
+
<span class="info-label"><i class="anticon anticon-tag"></i> 分类:</span>
|
|
61
|
+
<span class="info-value">{{ file.fusetype }}</span>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="info-row remarks">
|
|
64
|
+
<span class="info-label"><i class="anticon anticon-message"></i> 说明:</span>
|
|
65
|
+
<span class="info-value">{{ file.fremarks || '无' }}</span>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="file-actions">
|
|
69
|
+
<a-button
|
|
70
|
+
type="link"
|
|
71
|
+
:href="file.f_downloadpath"
|
|
72
|
+
target="_blank"
|
|
73
|
+
class="action-btn preview-btn"
|
|
74
|
+
>
|
|
75
|
+
<i class="anticon anticon-eye"></i>
|
|
76
|
+
预览
|
|
77
|
+
</a-button>
|
|
78
|
+
<a-button
|
|
79
|
+
v-if="isDelete === '1'"
|
|
80
|
+
type="link"
|
|
81
|
+
danger
|
|
82
|
+
@click="delet(file.id)"
|
|
83
|
+
class="action-btn delete-btn"
|
|
84
|
+
>
|
|
85
|
+
<i class="anticon anticon-delete"></i>
|
|
86
|
+
删除
|
|
87
|
+
</a-button>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</template>
|
|
96
|
+
|
|
97
|
+
<script>
|
|
98
|
+
import { post } from '@vue2-client/services/api'
|
|
99
|
+
import { del } from '@vue2-client/services/api/restTools'
|
|
100
|
+
|
|
101
|
+
export default {
|
|
102
|
+
name: 'XUploadFilesView',
|
|
103
|
+
props: {
|
|
104
|
+
currUserInfo: {
|
|
105
|
+
type: Object,
|
|
106
|
+
default: () => undefined
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
data () {
|
|
110
|
+
return {
|
|
111
|
+
upload_date: null,
|
|
112
|
+
fusetype: null,
|
|
113
|
+
files: [],
|
|
114
|
+
fusetypes: [],
|
|
115
|
+
isDelete: '0'
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
methods: {
|
|
119
|
+
async getfusetypes () {
|
|
120
|
+
this.fusetypes = [{ label: '全部', value: '' }]
|
|
121
|
+
const res = await post('/api/af-revenue/logic/getFileUseType', {})
|
|
122
|
+
this.fusetypes.push(...res
|
|
123
|
+
.filter(item => item.fusetype && item.fusetype.trim() !== '')
|
|
124
|
+
.map(item => ({ label: item.fusetype, value: item.fusetype })))
|
|
125
|
+
this.fusetype = ''
|
|
126
|
+
},
|
|
127
|
+
async getFiles () {
|
|
128
|
+
if (!this.currUserInfo) return
|
|
129
|
+
this.files = []
|
|
130
|
+
let condition = `f_blobid = '${this.currUserInfo.f_userinfo_id}'`
|
|
131
|
+
if (this.upload_date) {
|
|
132
|
+
condition += ` and CONVERT(VARCHAR(100), f_uploaddate, 23) = '${this.upload_date}'`
|
|
133
|
+
}
|
|
134
|
+
if (this.fusetype) {
|
|
135
|
+
condition += ` and fusetype = '${this.fusetype}'`
|
|
136
|
+
}
|
|
137
|
+
const res = await post('/api/af-revenue/logic/getAllFiles', { data: { condition } })
|
|
138
|
+
this.files = res.days.map(day => ({
|
|
139
|
+
days: day.uploadday,
|
|
140
|
+
arrays: res.array.filter(file => file.uploadday === day.uploadday)
|
|
141
|
+
}))
|
|
142
|
+
},
|
|
143
|
+
async delet (fileId) {
|
|
144
|
+
await del('api/af-revenue/entity/save/t_files', { id: fileId }, { resolveMsg: '删除成功', rejectMsg: '删除失败' })
|
|
145
|
+
this.getFiles()
|
|
146
|
+
},
|
|
147
|
+
selfSearch () {
|
|
148
|
+
this.getFiles()
|
|
149
|
+
},
|
|
150
|
+
previewImage (url) {
|
|
151
|
+
window.open(url, '_blank')
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
mounted () {
|
|
155
|
+
if (this.$login.r.includes('上传附件删除')) {
|
|
156
|
+
this.isDelete = '1'
|
|
157
|
+
}
|
|
158
|
+
this.getFiles()
|
|
159
|
+
this.getfusetypes()
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
</script>
|
|
163
|
+
|
|
164
|
+
<style scoped>
|
|
165
|
+
.upload-files-container {
|
|
166
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
167
|
+
background-color: #f9fafc;
|
|
168
|
+
border-radius: 12px;
|
|
169
|
+
padding: 24px;
|
|
170
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* 过滤区样式 */
|
|
174
|
+
.filter-container {
|
|
175
|
+
background-color: #fff;
|
|
176
|
+
border-radius: 10px;
|
|
177
|
+
padding: 20px;
|
|
178
|
+
margin-bottom: 24px;
|
|
179
|
+
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
|
|
180
|
+
border: 1px solid rgba(240, 240, 240, 0.8);
|
|
181
|
+
transition: all 0.3s ease;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.filter-container:hover {
|
|
185
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.filter-group {
|
|
189
|
+
display: flex;
|
|
190
|
+
flex-wrap: wrap;
|
|
191
|
+
gap: 16px;
|
|
192
|
+
align-items: center;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.filter-item {
|
|
196
|
+
min-width: 200px;
|
|
197
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.02);
|
|
198
|
+
border-radius: 6px;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.search-btn {
|
|
202
|
+
display: flex;
|
|
203
|
+
align-items: center;
|
|
204
|
+
gap: 6px;
|
|
205
|
+
height: 32px;
|
|
206
|
+
border-radius: 6px;
|
|
207
|
+
padding: 0 16px;
|
|
208
|
+
font-weight: 500;
|
|
209
|
+
transition: all 0.3s ease;
|
|
210
|
+
box-shadow: 0 2px 5px rgba(24, 144, 255, 0.2);
|
|
211
|
+
justify-content: center;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.search-btn:hover {
|
|
215
|
+
transform: translateY(-1px);
|
|
216
|
+
box-shadow: 0 4px 8px rgba(24, 144, 255, 0.3);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* 空状态样式 */
|
|
220
|
+
.empty-state {
|
|
221
|
+
display: flex;
|
|
222
|
+
flex-direction: column;
|
|
223
|
+
align-items: center;
|
|
224
|
+
justify-content: center;
|
|
225
|
+
padding: 80px 0;
|
|
226
|
+
background-color: #fff;
|
|
227
|
+
border-radius: 10px;
|
|
228
|
+
color: #8c8c8c;
|
|
229
|
+
border: 1px dashed #e8e8e8;
|
|
230
|
+
transition: all 0.3s ease;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.empty-icon {
|
|
234
|
+
font-size: 48px;
|
|
235
|
+
color: #bfbfbf;
|
|
236
|
+
margin-bottom: 16px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.empty-state p {
|
|
240
|
+
font-size: 16px;
|
|
241
|
+
margin-top: 8px;
|
|
242
|
+
color: #8c8c8c;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* 文件时间线 */
|
|
246
|
+
.file-timeline {
|
|
247
|
+
display: flex;
|
|
248
|
+
flex-direction: column;
|
|
249
|
+
gap: 28px;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.date-group {
|
|
253
|
+
background-color: #fff;
|
|
254
|
+
border-radius: 10px;
|
|
255
|
+
overflow: hidden;
|
|
256
|
+
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
|
|
257
|
+
border: 1px solid rgba(240, 240, 240, 0.8);
|
|
258
|
+
transition: all 0.3s ease;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.date-group:hover {
|
|
262
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
|
|
263
|
+
transform: translateY(-2px);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.date-header {
|
|
267
|
+
display: flex;
|
|
268
|
+
align-items: center;
|
|
269
|
+
gap: 10px;
|
|
270
|
+
padding: 16px 20px;
|
|
271
|
+
background: linear-gradient(135deg, #e6f7ff, #f0f5ff);
|
|
272
|
+
border-bottom: 1px solid #e6f0ff;
|
|
273
|
+
font-weight: 500;
|
|
274
|
+
color: #1890ff;
|
|
275
|
+
font-size: 15px;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
.date-header i {
|
|
279
|
+
font-size: 18px;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* 文件网格 */
|
|
283
|
+
.file-grid {
|
|
284
|
+
display: grid;
|
|
285
|
+
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
|
|
286
|
+
gap: 20px;
|
|
287
|
+
padding: 20px;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* 文件卡片 */
|
|
291
|
+
.file-card {
|
|
292
|
+
border-radius: 10px;
|
|
293
|
+
overflow: hidden;
|
|
294
|
+
transition: all 0.3s ease;
|
|
295
|
+
border: 1px solid #f0f0f0;
|
|
296
|
+
height: 100%;
|
|
297
|
+
background-color: #fff;
|
|
298
|
+
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.03);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.file-card:hover {
|
|
302
|
+
transform: translateY(-5px);
|
|
303
|
+
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
|
|
304
|
+
border-color: #e6f7ff;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.card-content {
|
|
308
|
+
display: flex;
|
|
309
|
+
flex-direction: column;
|
|
310
|
+
height: 100%;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/* 文件预览 */
|
|
314
|
+
.file-preview {
|
|
315
|
+
height: 200px;
|
|
316
|
+
background-color: #f5f5f5;
|
|
317
|
+
display: flex;
|
|
318
|
+
align-items: center;
|
|
319
|
+
justify-content: center;
|
|
320
|
+
overflow: hidden;
|
|
321
|
+
position: relative;
|
|
322
|
+
border-bottom: 1px solid #f0f0f0;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.preview-image {
|
|
326
|
+
width: 100%;
|
|
327
|
+
height: 100%;
|
|
328
|
+
object-fit: cover;
|
|
329
|
+
transition: transform 0.5s ease;
|
|
330
|
+
cursor: zoom-in;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.preview-image:hover {
|
|
334
|
+
transform: scale(1.08);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
.file-icon {
|
|
338
|
+
display: flex;
|
|
339
|
+
align-items: center;
|
|
340
|
+
justify-content: center;
|
|
341
|
+
width: 100%;
|
|
342
|
+
height: 100%;
|
|
343
|
+
font-size: 64px;
|
|
344
|
+
color: #bfbfbf;
|
|
345
|
+
background-color: #fafafa;
|
|
346
|
+
transition: all 0.3s ease;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.file-icon:hover {
|
|
350
|
+
color: #1890ff;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.file-icon i {
|
|
354
|
+
opacity: 0.7;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/* 文件信息 */
|
|
358
|
+
.file-info {
|
|
359
|
+
padding: 16px;
|
|
360
|
+
flex-grow: 1;
|
|
361
|
+
display: flex;
|
|
362
|
+
flex-direction: column;
|
|
363
|
+
gap: 10px;
|
|
364
|
+
background-color: #fff;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.info-row {
|
|
368
|
+
display: flex;
|
|
369
|
+
align-items: flex-start;
|
|
370
|
+
gap: 8px;
|
|
371
|
+
font-size: 14px;
|
|
372
|
+
color: #595959;
|
|
373
|
+
line-height: 1.5;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
.info-label {
|
|
377
|
+
font-weight: 500;
|
|
378
|
+
color: #8c8c8c;
|
|
379
|
+
display: flex;
|
|
380
|
+
align-items: center;
|
|
381
|
+
gap: 4px;
|
|
382
|
+
min-width: 80px;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.info-label i {
|
|
386
|
+
font-size: 14px;
|
|
387
|
+
color: #1890ff;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
.info-value {
|
|
391
|
+
color: #262626;
|
|
392
|
+
flex: 1;
|
|
393
|
+
overflow: hidden;
|
|
394
|
+
text-overflow: ellipsis;
|
|
395
|
+
white-space: nowrap;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
.remarks .info-value {
|
|
399
|
+
white-space: normal;
|
|
400
|
+
display: -webkit-box;
|
|
401
|
+
-webkit-line-clamp: 2;
|
|
402
|
+
-webkit-box-orient: vertical;
|
|
403
|
+
line-height: 1.6;
|
|
404
|
+
color: #434343;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* 操作按钮 */
|
|
408
|
+
.file-actions {
|
|
409
|
+
display: flex;
|
|
410
|
+
justify-content: space-between;
|
|
411
|
+
padding: 12px 16px;
|
|
412
|
+
border-top: 1px solid #f0f0f0;
|
|
413
|
+
background-color: #fafafa;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.action-btn {
|
|
417
|
+
display: flex;
|
|
418
|
+
align-items: center;
|
|
419
|
+
gap: 6px;
|
|
420
|
+
font-size: 14px;
|
|
421
|
+
border-radius: 4px;
|
|
422
|
+
padding: 4px 12px;
|
|
423
|
+
transition: all 0.3s ease;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.action-btn i {
|
|
427
|
+
font-size: 14px;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.preview-btn {
|
|
431
|
+
color: #1890ff;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.preview-btn:hover {
|
|
435
|
+
background-color: #e6f7ff;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.delete-btn {
|
|
439
|
+
color: #ff4d4f;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.delete-btn:hover {
|
|
443
|
+
background-color: #fff1f0;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/* 响应式调整 */
|
|
447
|
+
@media (max-width: 768px) {
|
|
448
|
+
.filter-group {
|
|
449
|
+
flex-direction: column;
|
|
450
|
+
align-items: stretch;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.filter-item {
|
|
454
|
+
width: 100%;
|
|
455
|
+
min-width: auto;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.search-btn {
|
|
459
|
+
width: 100%;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
.file-grid {
|
|
463
|
+
grid-template-columns: 1fr;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.upload-files-container {
|
|
467
|
+
padding: 16px;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
@media (max-width: 480px) {
|
|
472
|
+
.file-preview {
|
|
473
|
+
height: 160px;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
.date-header {
|
|
477
|
+
padding: 12px 16px;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
.file-grid {
|
|
481
|
+
padding: 12px;
|
|
482
|
+
gap: 12px;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
</style>
|
|
@@ -34,21 +34,23 @@
|
|
|
34
34
|
>
|
|
35
35
|
<!-- 查看/编辑进度标签页 -->
|
|
36
36
|
<a-tab-pane key="1" tab="开始工作">
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
37
|
+
<template v-if="details">
|
|
38
|
+
<WorkFlowHandle
|
|
39
|
+
v-if="activeKey === '1' && details.f_state !== undefined && steps !== undefined"
|
|
40
|
+
ref="workflowHandle"
|
|
41
|
+
:workflow-id="workflowId"
|
|
42
|
+
:workflowState="details.f_state === 1"
|
|
43
|
+
:complete-time="details.f_complete_time"
|
|
44
|
+
:stepsForChild="steps"
|
|
45
|
+
:visible="visible"
|
|
46
|
+
:taskName="details.f_task_name"
|
|
47
|
+
:details="details"
|
|
48
|
+
@refresh="stepChanged"
|
|
49
|
+
@success="success"
|
|
50
|
+
@nextClick="nextClick"
|
|
51
|
+
class="handle-content"
|
|
52
|
+
/>
|
|
53
|
+
</template>
|
|
52
54
|
</a-tab-pane>
|
|
53
55
|
|
|
54
56
|
<!-- 任务流转记录标签页 -->
|
|
@@ -71,16 +73,27 @@
|
|
|
71
73
|
/>
|
|
72
74
|
</span>
|
|
73
75
|
<div class="message-content">
|
|
74
|
-
<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
<template v-if="details">
|
|
77
|
+
<leave-message
|
|
78
|
+
:workflowId="workflowId"
|
|
79
|
+
:projectName="details.f_task_name"
|
|
80
|
+
:data="messageList"
|
|
81
|
+
:loading="messageLoading"
|
|
82
|
+
@success="success"
|
|
83
|
+
class="leave-message-component"
|
|
84
|
+
/>
|
|
85
|
+
</template>
|
|
82
86
|
</div>
|
|
83
87
|
</a-tab-pane>
|
|
88
|
+
|
|
89
|
+
<!-- 查看附件标签页 -->
|
|
90
|
+
<a-tab-pane key="5" tab="查看附件">
|
|
91
|
+
<template v-if="details">
|
|
92
|
+
<XUploadFilesView
|
|
93
|
+
:currUserInfo="{ f_userinfo_id: 90613 }"
|
|
94
|
+
/>
|
|
95
|
+
</template>
|
|
96
|
+
</a-tab-pane>
|
|
84
97
|
</a-tabs>
|
|
85
98
|
</a-card>
|
|
86
99
|
</div>
|
|
@@ -97,6 +110,7 @@ import { postByServiceName } from '@vue2-client/services/api/restTools'
|
|
|
97
110
|
import { workFlowViewApi } from '@vue2-client/services/api/workFlow'
|
|
98
111
|
import WorkflowLog from './WorkflowPageDetail/WorkflowLog.vue'
|
|
99
112
|
import LeaveMessage from './WorkflowPageDetail/LeaveMessage'
|
|
113
|
+
import XUploadFilesView from '@vue2-client/base-client/components/common/XUploadFilesView/index.vue'
|
|
100
114
|
|
|
101
115
|
export default {
|
|
102
116
|
name: 'WorkflowDetail',
|
|
@@ -105,7 +119,8 @@ export default {
|
|
|
105
119
|
WorkFlowHandle,
|
|
106
120
|
XFormTable,
|
|
107
121
|
WorkflowLog,
|
|
108
|
-
LeaveMessage
|
|
122
|
+
LeaveMessage,
|
|
123
|
+
XUploadFilesView
|
|
109
124
|
},
|
|
110
125
|
data () {
|
|
111
126
|
return {
|
|
@@ -118,7 +133,7 @@ export default {
|
|
|
118
133
|
// 保存流程和留言信息
|
|
119
134
|
steps: undefined,
|
|
120
135
|
// 基础信息
|
|
121
|
-
details:
|
|
136
|
+
details: undefined,
|
|
122
137
|
// 是否已完成
|
|
123
138
|
allStepDown: false,
|
|
124
139
|
// 给XFormTable增加额外查询条件
|
|
@@ -133,7 +148,7 @@ export default {
|
|
|
133
148
|
messageList: [],
|
|
134
149
|
messageLoading: true,
|
|
135
150
|
workflowId: '',
|
|
136
|
-
direction: '',
|
|
151
|
+
direction: 'right',
|
|
137
152
|
visible: false
|
|
138
153
|
}
|
|
139
154
|
},
|
|
@@ -170,7 +185,7 @@ export default {
|
|
|
170
185
|
this.visible = false
|
|
171
186
|
this.activeKey = '1'
|
|
172
187
|
this.allStepDown = false
|
|
173
|
-
this.details =
|
|
188
|
+
this.details = undefined
|
|
174
189
|
this.fixedAddForm = {}
|
|
175
190
|
this.fixedQueryForm = {}
|
|
176
191
|
this.steps = undefined
|
|
@@ -200,7 +215,7 @@ export default {
|
|
|
200
215
|
this.fixedAddForm.a_f_workflow_id = this.workflowId
|
|
201
216
|
},
|
|
202
217
|
// 初始化两张固定表
|
|
203
|
-
async init ({ workflowId, direction, visible = true }) {
|
|
218
|
+
async init ({ workflowId, direction = 'right', visible = true }) {
|
|
204
219
|
this.workflowId = workflowId
|
|
205
220
|
this.direction = direction
|
|
206
221
|
this.visible = visible
|
|
@@ -242,9 +257,10 @@ export default {
|
|
|
242
257
|
.content-card {
|
|
243
258
|
border-radius: 8px;
|
|
244
259
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
|
260
|
+
height: 100%;
|
|
245
261
|
|
|
246
262
|
/deep/ .ant-card-body {
|
|
247
|
-
padding:
|
|
263
|
+
padding: 0px 24px 24px;
|
|
248
264
|
}
|
|
249
265
|
}
|
|
250
266
|
}
|
|
@@ -202,7 +202,6 @@ export default {
|
|
|
202
202
|
methods: {
|
|
203
203
|
init () {
|
|
204
204
|
this.loading = this.details.f_entry_name === undefined
|
|
205
|
-
console.log(this.currUser)
|
|
206
205
|
// this.isCreatedBy = this.currUser.roles.includes('14524271')
|
|
207
206
|
this.completeTime = undefined
|
|
208
207
|
this.overdueTime = undefined
|
|
@@ -258,20 +257,6 @@ export default {
|
|
|
258
257
|
if (newVal) {
|
|
259
258
|
this.init()
|
|
260
259
|
}
|
|
261
|
-
},
|
|
262
|
-
details: {
|
|
263
|
-
deep: true,
|
|
264
|
-
handler (newVal) {
|
|
265
|
-
if (newVal.person) {
|
|
266
|
-
// 删除值为空的键
|
|
267
|
-
for (const key in newVal.person) {
|
|
268
|
-
if (!newVal.person[key]) {
|
|
269
|
-
delete newVal.person[key]
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
this.init()
|
|
274
|
-
}
|
|
275
260
|
}
|
|
276
261
|
}
|
|
277
262
|
}
|
|
@@ -12,75 +12,93 @@
|
|
|
12
12
|
change-able
|
|
13
13
|
@activeStep="activeStep"/>
|
|
14
14
|
</a-card>
|
|
15
|
-
<!--
|
|
16
|
-
<
|
|
17
|
-
<a-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
>
|
|
32
|
-
<a-descriptions-item
|
|
33
|
-
v-for="(value,key) in formCompletedDataPreview.data"
|
|
34
|
-
:key="key"
|
|
35
|
-
>
|
|
36
|
-
<span slot="label" style="color: #000">{{ key }}</span>
|
|
37
|
-
<div style="white-space: pre-wrap">{{ value }}</div>
|
|
38
|
-
</a-descriptions-item>
|
|
39
|
-
</a-descriptions>
|
|
40
|
-
<div v-if="formCompletedDataPreview.note">
|
|
41
|
-
<div class="ant-descriptions-title complete-data-title">备注</div>
|
|
42
|
-
<p style="white-space: pre-wrap">{{ formCompletedDataPreview.note }}</p>
|
|
43
|
-
</div>
|
|
44
|
-
<div v-if="formCompletedDataPreview.images.length">
|
|
45
|
-
<div class="ant-descriptions-title complete-data-title">图片</div>
|
|
46
|
-
<image-item :images="formCompletedDataPreview.images" @preview="handlePreviewFile"/>
|
|
47
|
-
</div>
|
|
48
|
-
<div v-if="formCompletedDataPreview.files.length">
|
|
49
|
-
<div class="ant-descriptions-title complete-data-title">附件</div>
|
|
50
|
-
<file-item :files="formCompletedDataPreview.files" @preview="handlePreviewFile"/>
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
15
|
+
<!-- 无权访问的提示 -->
|
|
16
|
+
<template v-if="!canSubmit">
|
|
17
|
+
<a-result status="403" title="无权操作" sub-title="您没有访问该步骤的权限.">
|
|
18
|
+
</a-result>
|
|
19
|
+
</template>
|
|
20
|
+
<template v-else>
|
|
21
|
+
<!-- 流程被退回的提示 -->
|
|
22
|
+
<template v-if="currentStep && currentStep.back && !(beforeStepActive || workflowState)">
|
|
23
|
+
<a-alert type="info" show-icon style="margin-bottom: 14px">
|
|
24
|
+
<div slot="message">
|
|
25
|
+
<span style="font-weight: bold">流程被退回</span>
|
|
26
|
+
<span style="margin-left: 14px; font-size: 14px; color: rgba(0, 0, 0, 0.65)">请重新填写信息发起提交</span>
|
|
27
|
+
</div>
|
|
28
|
+
<div slot="description">
|
|
29
|
+
<div>操作人:{{ currentStep.back.f_operator }} 操作时间:{{ currentStep.back.f_date }}</div>
|
|
30
|
+
<div>原因:{{ currentStep.back.f_notes }}</div>
|
|
53
31
|
</div>
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
32
|
+
</a-alert>
|
|
33
|
+
</template>
|
|
34
|
+
<!-- 步骤内容主体 -->
|
|
35
|
+
<a-tabs default-active-key="1" @change="note = ''" type="card">
|
|
36
|
+
<template v-if="beforeStepActive || workflowState">
|
|
37
|
+
<a-tab-pane key="0" tab="步骤详情">
|
|
38
|
+
<a-card :bordered="false" :loading="loadingHistory">
|
|
39
|
+
<!-- 当前步骤历史记录 -->
|
|
40
|
+
<template v-if="formCompletedDataPreview">
|
|
41
|
+
<a-descriptions
|
|
42
|
+
v-show="formCompletedDataPreview.data"
|
|
43
|
+
:column="{ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }"
|
|
44
|
+
title="步骤历史记录"
|
|
45
|
+
bordered
|
|
46
|
+
>
|
|
47
|
+
<a-descriptions-item
|
|
48
|
+
v-for="(value,key) in formCompletedDataPreview.data"
|
|
49
|
+
:key="key"
|
|
50
|
+
>
|
|
51
|
+
<span slot="label" style="color: #000">{{ key }}</span>
|
|
52
|
+
<div style="white-space: pre-wrap">{{ value }}</div>
|
|
53
|
+
</a-descriptions-item>
|
|
54
|
+
</a-descriptions>
|
|
55
|
+
<div v-if="formCompletedDataPreview.note">
|
|
56
|
+
<div class="ant-descriptions-title complete-data-title">备注</div>
|
|
57
|
+
<p style="white-space: pre-wrap">{{ formCompletedDataPreview.note }}</p>
|
|
58
|
+
</div>
|
|
59
|
+
<div v-if="formCompletedDataPreview.images.length">
|
|
60
|
+
<div class="ant-descriptions-title complete-data-title">图片</div>
|
|
61
|
+
<image-item :images="formCompletedDataPreview.images" @preview="handlePreviewFile"/>
|
|
64
62
|
</div>
|
|
65
|
-
<div
|
|
66
|
-
<div
|
|
67
|
-
<
|
|
68
|
-
<div>退回原因:{{ currentStep.back.f_notes }}</div>
|
|
63
|
+
<div v-if="formCompletedDataPreview.files.length">
|
|
64
|
+
<div class="ant-descriptions-title complete-data-title">附件</div>
|
|
65
|
+
<file-item :files="formCompletedDataPreview.files" @preview="handlePreviewFile"/>
|
|
69
66
|
</div>
|
|
70
|
-
</
|
|
71
|
-
<!--
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
67
|
+
</template>
|
|
68
|
+
<!-- 当前步骤无记录 -->
|
|
69
|
+
<template v-else>
|
|
70
|
+
<a-result status="404" title="暂无数据" sub-title="该步骤暂无数据。">
|
|
71
|
+
</a-result>
|
|
72
|
+
</template>
|
|
73
|
+
</a-card>
|
|
74
|
+
</a-tab-pane>
|
|
75
|
+
</template>
|
|
76
|
+
<template v-else>
|
|
77
|
+
<a-tab-pane key="1" tab="业务操作">
|
|
78
|
+
<a-card :bordered="false" :loading="loadingHistory">
|
|
79
|
+
<template v-if="showTab">
|
|
80
|
+
<x-tab :local-config="tabDesigner" :body-style="{ padding: 0 }" :tabBarGutter="24" default-active-key="workFlowTab">
|
|
81
|
+
<a-tab-pane
|
|
82
|
+
:forceRender="true"
|
|
83
|
+
v-if="showForm"
|
|
84
|
+
slot="extraBeforeTabs"
|
|
85
|
+
key="workFlowTab"
|
|
86
|
+
tab="表单"
|
|
87
|
+
>
|
|
88
|
+
<x-add-native-form
|
|
89
|
+
ref="xAddForm"
|
|
90
|
+
@onSubmit="submitForm"/>
|
|
91
|
+
</a-tab-pane>
|
|
92
|
+
</x-tab>
|
|
93
|
+
</template>
|
|
94
|
+
<template v-else>
|
|
95
|
+
<template v-if="showForm">
|
|
96
|
+
<x-add-native-form
|
|
97
|
+
ref="xAddForm"
|
|
98
|
+
@onSubmit="submitForm"/>
|
|
99
|
+
</template>
|
|
100
|
+
</template>
|
|
101
|
+
<a-divider />
|
|
84
102
|
<a-form v-if="!lastStep" label-align="left" :label-col="{ span: 3 }" :wrapper-col="{ span: 13 }">
|
|
85
103
|
<a-form-item v-if="showStepNextBtn" label="操作类型" required>
|
|
86
104
|
<a-radio-group v-model="operationType" @change="handleOperationTypeChange">
|
|
@@ -88,7 +106,7 @@
|
|
|
88
106
|
<a-radio value="skip">{{ stepNextBtnTitle }}</a-radio>
|
|
89
107
|
</a-radio-group>
|
|
90
108
|
</a-form-item>
|
|
91
|
-
<a-form-item label="
|
|
109
|
+
<a-form-item label="下一环节处理人" required v-if="needSelectPerson">
|
|
92
110
|
<a-select
|
|
93
111
|
v-model="checkedChargePerson"
|
|
94
112
|
placeholder="请选择或搜索"
|
|
@@ -112,12 +130,12 @@
|
|
|
112
130
|
placeholder="请选择"/>
|
|
113
131
|
</a-form-item>
|
|
114
132
|
</a-form>
|
|
133
|
+
<a-divider />
|
|
115
134
|
<!-- 备注信息 -->
|
|
116
|
-
<div class="line"></div>
|
|
117
135
|
<a-textarea
|
|
118
136
|
v-model="note"
|
|
119
137
|
:auto-size="{ minRows: 3, maxRows: 5 }"
|
|
120
|
-
placeholder="
|
|
138
|
+
placeholder="填写本环节备注事项"
|
|
121
139
|
/>
|
|
122
140
|
<!-- 当前步骤完成后,控制流程按钮 -->
|
|
123
141
|
<div style="text-align: center">
|
|
@@ -147,7 +165,7 @@
|
|
|
147
165
|
type="primary"
|
|
148
166
|
@click="nextClick"
|
|
149
167
|
>
|
|
150
|
-
|
|
168
|
+
完成提交
|
|
151
169
|
<a-icon type="right"/>
|
|
152
170
|
</a-button>
|
|
153
171
|
</a-popover>
|
|
@@ -160,7 +178,7 @@
|
|
|
160
178
|
type="primary"
|
|
161
179
|
@click="stepNextClick"
|
|
162
180
|
>
|
|
163
|
-
|
|
181
|
+
跳过
|
|
164
182
|
</a-button>
|
|
165
183
|
</a-popover>
|
|
166
184
|
<a-button
|
|
@@ -168,55 +186,51 @@
|
|
|
168
186
|
type="primary"
|
|
169
187
|
@click="lastStepNextClick"
|
|
170
188
|
>
|
|
171
|
-
|
|
189
|
+
确认完成
|
|
172
190
|
</a-button>
|
|
173
191
|
</template>
|
|
174
192
|
</a-space>
|
|
175
193
|
</a-radio-group>
|
|
176
194
|
</div>
|
|
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
|
-
</a-
|
|
210
|
-
</a-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
<
|
|
214
|
-
</a-
|
|
215
|
-
</
|
|
216
|
-
<!-- 文件预览 -->
|
|
217
|
-
<a-modal v-model="previewFileVisible" :footer="null" :dialog-style="{ top: '20px' }" width="85%" :z-index="1001">
|
|
218
|
-
<file-preview :path="filePath"/>
|
|
219
|
-
</a-modal>
|
|
195
|
+
</a-card>
|
|
196
|
+
</a-tab-pane>
|
|
197
|
+
</template>
|
|
198
|
+
<!-- 退回 -->
|
|
199
|
+
<a-tab-pane v-if="canSubmit && !beforeStepActive && showPrevBtn && !workflowState" key="2" tab="退回">
|
|
200
|
+
<a-form layout="vertical">
|
|
201
|
+
<a-form-item label="退回原因" :wrapper-col="{ span: 10 }" required>
|
|
202
|
+
<a-textarea
|
|
203
|
+
v-model="note"
|
|
204
|
+
:auto-size="{ minRows: 4, maxRows: 10 }"
|
|
205
|
+
placeholder="请填写退回原因 / 备注"
|
|
206
|
+
/>
|
|
207
|
+
</a-form-item>
|
|
208
|
+
<a-form-item :wrapper-col="{ offset: 4 }">
|
|
209
|
+
<a-popover :title="preBtnTitle">
|
|
210
|
+
<template slot="content">
|
|
211
|
+
<p v-for="(item,index) in preBtnText" :key="index">{{ item }}</p>
|
|
212
|
+
</template>
|
|
213
|
+
<a-button
|
|
214
|
+
type="danger"
|
|
215
|
+
@click="preClick"
|
|
216
|
+
>
|
|
217
|
+
<a-icon type="left"/>
|
|
218
|
+
退回
|
|
219
|
+
</a-button>
|
|
220
|
+
</a-popover>
|
|
221
|
+
</a-form-item>
|
|
222
|
+
</a-form>
|
|
223
|
+
</a-tab-pane>
|
|
224
|
+
<a-tab-pane v-if="canSubmit && !beforeStepActive && showPrevBtn && !workflowState" key="3" tab="工单拆分">
|
|
225
|
+
<!-- 分配工单 -->
|
|
226
|
+
<workflow-list-resolution :workflow-project-id="workflowId" :details="details"></workflow-list-resolution>
|
|
227
|
+
</a-tab-pane>
|
|
228
|
+
</a-tabs>
|
|
229
|
+
<!-- 文件预览 -->
|
|
230
|
+
<a-modal v-model="previewFileVisible" :footer="null" :dialog-style="{ top: '20px' }" width="85%" :z-index="1001">
|
|
231
|
+
<file-preview :path="filePath"/>
|
|
232
|
+
</a-modal>
|
|
233
|
+
</template>
|
|
220
234
|
</div>
|
|
221
235
|
</template>
|
|
222
236
|
|
|
@@ -238,10 +252,12 @@ import { commonApi } from '@vue2-client/services/api'
|
|
|
238
252
|
import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
|
|
239
253
|
import * as util from '@vue2-client/utils/util'
|
|
240
254
|
import { getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
|
|
255
|
+
import XTab from '@vue2-client/base-client/components/common/XTab/XTab.vue'
|
|
241
256
|
|
|
242
257
|
export default {
|
|
243
258
|
name: 'WorkFlowHandle',
|
|
244
259
|
components: {
|
|
260
|
+
XTab,
|
|
245
261
|
WorkflowListResolution,
|
|
246
262
|
XAddNativeForm,
|
|
247
263
|
WorkFlowTimeline,
|
|
@@ -254,10 +270,23 @@ export default {
|
|
|
254
270
|
computed: {
|
|
255
271
|
...mapState('account', { currUser: 'user' }),
|
|
256
272
|
canSubmit () {
|
|
273
|
+
// 对于超级管理员直接认为可以提交
|
|
274
|
+
if (this.currUser.ename === '1') {
|
|
275
|
+
return true
|
|
276
|
+
}
|
|
277
|
+
// currentStepId可能还没初始化,此处拿不到先返回false
|
|
278
|
+
if (!this.currentStepId) {
|
|
279
|
+
return false
|
|
280
|
+
}
|
|
257
281
|
const step = this.stepsForChild[this.currentStepId - 1]
|
|
258
|
-
|
|
259
282
|
// 检查角色和部门权限
|
|
260
283
|
if (step && step.properties && step.properties.chargePerson) {
|
|
284
|
+
// chargePerson 改造 旧数据类型是 {chrgePerson: {role: '1', department: '1'}}
|
|
285
|
+
// 如果是旧的格式 转换成新的格式后再作处理
|
|
286
|
+
if (step.properties.chargePerson.role || step.properties.chargePerson.department) {
|
|
287
|
+
step.properties.chargePerson.needSelectPerson = true
|
|
288
|
+
step.properties.chargePerson.personList = [{ type: step.properties.chargePerson.role ? 'role' : 'department', name: step.properties.chargePerson.role || step.properties.chargePerson.department }]
|
|
289
|
+
}
|
|
261
290
|
if (step.properties.chargePerson.personList && step.properties.chargePerson.personList.length > 0) {
|
|
262
291
|
// 使用some方法判断当前人员是否满足任一条件
|
|
263
292
|
return step.properties.chargePerson.personList.some(item => {
|
|
@@ -286,6 +315,10 @@ export default {
|
|
|
286
315
|
return {
|
|
287
316
|
// 显示供用户填写的当前步骤表单
|
|
288
317
|
showForm: false,
|
|
318
|
+
// 显示步骤的tab页
|
|
319
|
+
showTab: false,
|
|
320
|
+
// tab页的配置
|
|
321
|
+
tabDesigner: undefined,
|
|
289
322
|
// 当前步骤表单标题
|
|
290
323
|
formTitle: '',
|
|
291
324
|
// 当前步骤表单定义Json
|
|
@@ -631,6 +664,7 @@ export default {
|
|
|
631
664
|
}
|
|
632
665
|
this.isLastStep(this.currentStepId)
|
|
633
666
|
if (!this.lastStep) {
|
|
667
|
+
// 设置下一步的操作人
|
|
634
668
|
this.setChargePersonOptions(this.currentStepId + 1)
|
|
635
669
|
}
|
|
636
670
|
this.workflowControl()
|
|
@@ -665,18 +699,31 @@ export default {
|
|
|
665
699
|
}
|
|
666
700
|
)
|
|
667
701
|
},
|
|
668
|
-
//
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
this
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
702
|
+
// 获取当前步骤定义内容,构建组件
|
|
703
|
+
buildComp () {
|
|
704
|
+
const properties = this.stepsDefine[this.currentStep.id - 1].properties
|
|
705
|
+
// 表单的渲染
|
|
706
|
+
if (properties.form && properties.form.formJson) {
|
|
707
|
+
this.stepDefine = properties.form.formJson
|
|
708
|
+
this.showForm = true
|
|
709
|
+
this.$nextTick(() => {
|
|
710
|
+
this.$refs.xAddForm && this.$refs.xAddForm.init({
|
|
711
|
+
businessType: '修改',
|
|
712
|
+
formItems: this.stepDefine,
|
|
713
|
+
layout: properties.form.xAddFormLayout,
|
|
714
|
+
showSubmitBtn: false
|
|
715
|
+
})
|
|
678
716
|
})
|
|
679
|
-
}
|
|
717
|
+
} else {
|
|
718
|
+
this.showForm = false
|
|
719
|
+
}
|
|
720
|
+
// Tab的渲染
|
|
721
|
+
this.tabDesigner = properties.tabDesigner
|
|
722
|
+
if (this.tabDesigner) {
|
|
723
|
+
this.showTab = true
|
|
724
|
+
} else {
|
|
725
|
+
this.showTab = false
|
|
726
|
+
}
|
|
680
727
|
},
|
|
681
728
|
// 根据当前节点,判断之后流程,以及按钮的显示
|
|
682
729
|
workflowControl () {
|
|
@@ -778,7 +825,7 @@ export default {
|
|
|
778
825
|
} else {
|
|
779
826
|
this.loadingHistory = false
|
|
780
827
|
this.beforeStepActive = false
|
|
781
|
-
this.
|
|
828
|
+
this.buildComp()
|
|
782
829
|
}
|
|
783
830
|
},
|
|
784
831
|
// 获取已经完成步骤的数据
|
|
@@ -908,7 +955,8 @@ export default {
|
|
|
908
955
|
// 从指定步骤设置负责人下拉选择框
|
|
909
956
|
async setChargePersonOptions (stepId) {
|
|
910
957
|
this.checkedChargePerson = undefined
|
|
911
|
-
const
|
|
958
|
+
const define = this.stepsDefine[stepId - 1]
|
|
959
|
+
const defineProperties = define.properties
|
|
912
960
|
// chargePerson 改造 旧数据类型是 {chrgePerson: {role: '1', department: '1'}}
|
|
913
961
|
// 新数据类型是
|
|
914
962
|
// "chargePerson": {
|
|
@@ -925,6 +973,11 @@ export default {
|
|
|
925
973
|
// "needSelectPerson": true
|
|
926
974
|
// }
|
|
927
975
|
const chargePerson = defineProperties.chargePerson
|
|
976
|
+
if (!chargePerson) {
|
|
977
|
+
this.needSelectPerson = false
|
|
978
|
+
this.chargePersonOptions = []
|
|
979
|
+
return
|
|
980
|
+
}
|
|
928
981
|
// 如果是旧的格式 转换成新的格式后再作处理
|
|
929
982
|
if (chargePerson.role || chargePerson.department) {
|
|
930
983
|
chargePerson.needSelectPerson = true
|
|
@@ -1008,15 +1061,11 @@ export default {
|
|
|
1008
1061
|
}
|
|
1009
1062
|
</script>
|
|
1010
1063
|
<style lang="less" scoped>
|
|
1011
|
-
.line {
|
|
1012
|
-
width: 100%;
|
|
1013
|
-
height: 5px;
|
|
1014
|
-
border-bottom: rgb(240, 240, 240) solid 1px;
|
|
1015
|
-
margin-bottom: 30px;
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
1064
|
.complete-data-title {
|
|
1019
1065
|
margin-top: 8px;
|
|
1020
1066
|
margin-bottom: 8px;
|
|
1021
1067
|
}
|
|
1068
|
+
:deep(.ant-result){
|
|
1069
|
+
padding: 0;
|
|
1070
|
+
}
|
|
1022
1071
|
</style>
|