vue2-client 1.14.42 → 1.14.43

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.
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div>
3
3
  <!-- 上方流程显示 -->
4
- <a-card :bordered="false" :loading="loading" title="项目进度">
4
+ <a-card :bordered="false" :loading="loading">
5
5
  <!-- 项目进度流程 -->
6
6
  <work-flow-timeline
7
7
  :current-step-id="currentStepId"
@@ -12,75 +12,93 @@
12
12
  change-able
13
13
  @activeStep="activeStep"/>
14
14
  </a-card>
15
- <!-- 如果不是当前步骤,显示历史记录 -->
16
- <a-tabs default-active-key="1" @change="note = ''">
17
- <a-tab-pane key="1" :tab="!beforeStepActive && !workflowState ? '表单' : '进度详情'">
18
- <a-card :bordered="false" :loading="loadingHistory">
19
- <div v-if="beforeStepActive || workflowState">
20
- <!-- 当前步骤无记录 -->
21
- <div v-show="!formCompletedDataPreview" style="text-align: center">
22
- <h1>该步骤暂无记录</h1>
23
- </div>
24
- <!-- 当前步骤历史记录 -->
25
- <div v-if="formCompletedDataPreview">
26
- <a-descriptions
27
- v-show="formCompletedDataPreview.data"
28
- :column="{ xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1 }"
29
- title="历史记录"
30
- bordered
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 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作时间:{{ currentStep.back.f_date }}</div>
30
+ <div>原因:{{ currentStep.back.f_notes }}</div>
53
31
  </div>
54
- <!-- 如果是当前步骤,填写表单,控制流程等 -->
55
- <div v-if="!beforeStepActive && !workflowState">
56
- <div v-if="canSubmit">
57
- <!-- 退回提示 -->
58
- <a-alert v-if="currentStep && currentStep.back" type="info" show-icon style="margin-bottom: 14px">
59
- <div slot="message">
60
- <span style="color: #000">被退回</span>
61
- <span style="margin-left: 14px; font-size: 14px; color: rgba(0, 0, 0, 0.65)">{{
62
- currentStep.back.f_desc
63
- }}</span>
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 slot="description">
66
- <div>操作人:{{ currentStep.back.f_operator }}</div>
67
- <div>操作时间:{{ currentStep.back.f_date }}</div>
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
- </a-alert>
71
- <!-- 任务时间提示 -->
72
- <!-- <a-alert-->
73
- <!-- v-if="taskIsOverdue"-->
74
- <!-- type="warning"-->
75
- <!-- message="当前任务已超过限定完成时间,联系发起人修改完成时间后即可提交"-->
76
- <!-- show-icon-->
77
- <!-- style="margin-bottom: 14px"/>-->
78
- <!-- 当前步骤,填写表单 -->
79
- <x-add-native-form
80
- v-if="stepDefine.length > 0"
81
- ref="xAddForm"
82
- @onSubmit="submitForm">
83
- </x-add-native-form>
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="指定下一环节处理人" required v-if="needSelectPerson">
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
- </div>
178
- <p v-else style="font-size:16px">
179
- <a-icon type="info-circle"/>
180
- <span style="margin-left:6px">无权操作</span>
181
- </p>
182
- </div>
183
- </a-card>
184
- </a-tab-pane>
185
- <!-- 退回 -->
186
- <a-tab-pane v-if="canSubmit && !beforeStepActive && showPrevBtn && !workflowState" key="2" tab="退回">
187
- <a-form layout="vertical">
188
- <a-form-item label="退回原因" :wrapper-col="{ span: 10 }" required>
189
- <a-textarea
190
- v-model="note"
191
- :auto-size="{ minRows: 4, maxRows: 10 }"
192
- placeholder="请填写退回原因 / 备注"
193
- />
194
- </a-form-item>
195
- <a-form-item :wrapper-col="{ offset: 4 }">
196
- <a-popover :title="preBtnTitle">
197
- <template slot="content">
198
- <p v-for="(item,index) in preBtnText" :key="index">{{ item }}</p>
199
- </template>
200
- <a-button
201
- type="danger"
202
- @click="preClick"
203
- >
204
- <a-icon type="left"/>
205
- 退回
206
- </a-button>
207
- </a-popover>
208
- </a-form-item>
209
- </a-form>
210
- </a-tab-pane>
211
- <a-tab-pane v-if="canSubmit && !beforeStepActive && showPrevBtn && !workflowState" key="3" tab="工单拆分">
212
- <!-- 分配工单 -->
213
- <workflow-list-resolution :workflow-project-id="workflowId" :details="details"></workflow-list-resolution>
214
- </a-tab-pane>
215
- </a-tabs>
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
- openForm () {
670
- this.stepDefine = this.stepsDefine[this.currentStep.id - 1].properties.form.formJson
671
- this.showForm = true
672
- this.$nextTick(() => {
673
- this.$refs.xAddForm && this.$refs.xAddForm.init({
674
- businessType: '修改',
675
- formItems: this.stepDefine,
676
- layout: this.stepsDefine[this.currentStep.id - 1].properties.form.xAddFormLayout,
677
- showSubmitBtn: false
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.openForm()
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 defineProperties = this.stepsDefine[stepId - 1].properties
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>
@@ -124,7 +124,7 @@ export default {
124
124
  return
125
125
  }
126
126
  if (stepId > this.currentStepId) {
127
- return this.$message.info('您要访问的步骤超出了当前进度!')
127
+ return this.$message.warn('请先完成当前步骤')
128
128
  }
129
129
  this.$emit('activeStep', stepId)
130
130
  this.displayStepId = stepId
@@ -142,6 +142,7 @@ export default {
142
142
  <style lang="less" scoped>
143
143
  .timeline {
144
144
  /deep/ .ant-steps-dot {
145
+ margin-bottom: 6px;
145
146
  .ant-steps-item-tail {
146
147
  top: 7px;
147
148
  margin-left: 106px;
@@ -152,7 +153,7 @@ export default {
152
153
  }
153
154
  .ant-steps-item-content {
154
155
  width: 200px;
155
- margin-top: 16px;
156
+ margin-top: 24px;
156
157
  .ant-steps-item-description {
157
158
  text-align: left;
158
159
  margin: 6px 0 0 60px;