1
1
<template >
2
- <ContentWrap :bodyStyle = " { padding: '10px 20px 0' } " >
3
- <el-row :gutter = " 20 " >
4
- <el-col :span = " 16 "
5
- > <el-form
2
+ <el-row :gutter = " 20 " >
3
+ <el-col :span = " 16 " >
4
+ <ContentWrap title = " 申请信息 " >
5
+ <el-form
6
6
ref =" formRef"
7
7
v-loading =" formLoading"
8
8
:model =" formData"
41
41
<el-input v-model =" formData.reason" placeholder =" 请输入请假原因" type =" textarea" />
42
42
</el-form-item >
43
43
<el-form-item >
44
- <el-button :disabled =" formLoading" type =" primary" @click =" submitForm" >确 定</el-button >
44
+ <el-button :disabled =" formLoading" type =" primary" @click =" submitForm" >
45
+ 确 定
46
+ </el-button >
45
47
</el-form-item >
46
- </el-form ></el-col
47
- >
48
- <!-- 新增 ====== begin ======== -->
49
- <el-col :span =" 8"
50
- ><!-- 流程时间线 -->
48
+ </el-form >
49
+ </ContentWrap >
50
+ </el-col >
51
+
52
+ <!-- 审批相关:流程信息 -->
53
+ <el-col :span =" 8" >
54
+ <ContentWrap title =" 审批流程" :bodyStyle =" { padding: '0 20px 0' }" >
51
55
<ProcessInstanceTimeline
52
56
ref =" timelineRef"
53
57
:activity-nodes =" activityNodes"
54
58
:show-status-icon =" false"
55
59
@select-user-confirm =" selectUserConfirm"
56
60
/>
57
- </el-col >
58
- <!-- 新增 ====== end ======== -->
59
- </el-row >
60
- </ContentWrap >
61
+ </ContentWrap >
62
+ </el-col >
63
+ </el-row >
61
64
</template >
62
65
<script lang="ts" setup>
63
66
import { DICT_TYPE , getIntDictOptions } from ' @/utils/dict'
64
67
import * as LeaveApi from ' @/api/bpm/leave'
65
68
import { useTagsViewStore } from ' @/store/modules/tagsView'
69
+
70
+ // 审批相关:import
66
71
import * as DefinitionApi from ' @/api/bpm/definition'
67
- // 新增 ====== begin ========
68
- import ProcessInstanceTimeline from ' ../../processInstance/detail/ProcessInstanceTimeline.vue'
72
+ import ProcessInstanceTimeline from ' @/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue'
69
73
import * as ProcessInstanceApi from ' @/api/bpm/processInstance'
70
74
import { CandidateStrategy , NodeId } from ' @/components/SimpleProcessDesignerV2/src/consts'
71
75
import { ApprovalNodeInfo } from ' @/api/bpm/processInstance'
72
- // 新增 ====== end ========
76
+
73
77
defineOptions ({ name: ' BpmOALeaveCreate' })
74
78
75
79
const message = useMessage () // 消息弹窗
@@ -91,22 +95,21 @@ const formRules = reactive({
91
95
})
92
96
const formRef = ref () // 表单 Ref
93
97
94
- // 指定审批人
98
+ // 审批相关:变量
95
99
const processDefineKey = ' oa_leave' // 流程定义 Key
96
100
const startUserSelectTasks = ref ([]) // 发起人需要选择审批人的用户任务列表
97
101
const startUserSelectAssignees = ref ({}) // 发起人选择审批人的数据
98
- // 新增 ====== begin ========
99
102
const tempStartUserSelectAssignees = ref ({}) // 历史发起人选择审批人的数据,用于每次表单变更时,临时保存
100
103
const activityNodes = ref <ProcessInstanceApi .ApprovalNodeInfo []>([]) // 审批节点信息
101
104
const processDefinitionId = ref (' ' )
102
- // 新增 ====== end ========
105
+
103
106
/** 提交表单 */
104
107
const submitForm = async () => {
105
- // 校验表单
108
+ // 1.1 校验表单
106
109
if (! formRef ) return
107
110
const valid = await formRef .value .validate ()
108
111
if (! valid ) return
109
- // 校验指定审批人
112
+ // 1.2 审批相关: 校验指定审批人
110
113
if (startUserSelectTasks .value ?.length > 0 ) {
111
114
for (const userTask of startUserSelectTasks .value ) {
112
115
if (
@@ -118,11 +121,11 @@ const submitForm = async () => {
118
121
}
119
122
}
120
123
121
- // 提交请求
124
+ // 2. 提交请求
122
125
formLoading .value = true
123
126
try {
124
127
const data = { ... formData .value } as unknown as LeaveApi .LeaveVO
125
- // 设置指定审批人
128
+ // 审批相关: 设置指定审批人
126
129
if (startUserSelectTasks .value ?.length > 0 ) {
127
130
data .startUserSelectAssignees = startUserSelectAssignees .value
128
131
}
@@ -136,12 +139,12 @@ const submitForm = async () => {
136
139
}
137
140
}
138
141
139
- // 新增 ====== begin ========
140
- /** 获取审批详情 */
142
+ /** 审批相关:获取审批详情 */
141
143
const getApprovalDetail = async () => {
142
144
try {
143
145
const data = await ProcessInstanceApi .getApprovalDetail ({
144
146
processDefinitionId: processDefinitionId .value ,
147
+ // TODO 小北:可以支持 processDefinitionKey 查询
145
148
activityId: NodeId .START_USER_NODE_ID ,
146
149
processVariablesStr: JSON .stringify ({ day: daysDifference () }) // 解决 GET 无法传递对象的问题,后端 String 再转 JSON
147
150
})
@@ -174,21 +177,22 @@ const getApprovalDetail = async () => {
174
177
}
175
178
}
176
179
177
- /** 选择发起人 */
180
+ /** 审批相关: 选择发起人 */
178
181
const selectUserConfirm = (id : string , userList : any []) => {
179
182
startUserSelectAssignees .value [id ] = userList ?.map ((item : any ) => item .id )
180
183
}
181
184
182
185
// 计算天数差
186
+ // TODO @小北:可以搞到 formatTime 里面去,然后看看 dayjs 里面有没有现成的方法,或者辅助计算的方法。
183
187
const daysDifference = () => {
184
188
const oneDay = 24 * 60 * 60 * 1000 // 一天的毫秒数
185
189
const diffTime = Math .abs (Number (formData .value .endTime ) - Number (formData .value .startTime ))
186
190
return Math .floor (diffTime / oneDay )
187
191
}
188
- // 新增 ====== end ========
189
192
190
193
/** 初始化 */
191
194
onMounted (async () => {
195
+ // TODO @小北:这里可以简化,统一通过 getApprovalDetail 处理么?
192
196
const processDefinitionDetail = await DefinitionApi .getProcessDefinition (
193
197
undefined ,
194
198
processDefineKey
@@ -200,13 +204,12 @@ onMounted(async () => {
200
204
}
201
205
processDefinitionId .value = processDefinitionDetail .id
202
206
startUserSelectTasks .value = processDefinitionDetail .startUserSelectTasks
203
- // 新增 ====== begin ========
204
- // 加载最新的审批详情,主要用于节点预测
205
- getApprovalDetail ()
206
- // 新增 ====== end ========
207
+
208
+ // 审批相关:加载最新的审批详情,主要用于节点预测
209
+ await getApprovalDetail ()
207
210
})
208
- // 新增 ====== begin ========
209
- /** 预测流程节点会因为输入的参数值而产生新的预测结果值,所以需重新预测一次, formData.value可改成实际业务中的特定字段 */
211
+
212
+ /** 审批相关: 预测流程节点会因为输入的参数值而产生新的预测结果值,所以需重新预测一次, formData.value可改成实际业务中的特定字段 */
210
213
watch (
211
214
formData .value ,
212
215
(newValue , oldValue ) => {
@@ -224,6 +227,5 @@ watch(
224
227
{
225
228
immediate: true
226
229
}
227
- // 新增 ====== end ========
228
230
)
229
231
</script >
0 commit comments