Skip to content

Commit d852103

Browse files
YunaiVgitee-org
authored andcommitted
!365 流程增加抄送功能
Merge pull request !365 from 云开/feature/BPM_CC
2 parents 804859b + 2c93937 commit d852103

File tree

4 files changed

+414
-0
lines changed

4 files changed

+414
-0
lines changed

src/api/bpm/processInstance/index.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ export type ProcessInstanceVO = {
2020
endTime: string
2121
}
2222

23+
export type ProcessInstanceCCVO = {
24+
type: number,
25+
taskName: string,
26+
taskKey: string,
27+
processInstanceName: string,
28+
processInstanceKey: string,
29+
startUserId: string,
30+
options:string [],
31+
reason: string
32+
}
33+
2334
export const getMyProcessInstancePage = async (params) => {
2435
return await request.get({ url: '/bpm/process-instance/my-page', params })
2536
}
@@ -39,3 +50,21 @@ export const cancelProcessInstance = async (id: number, reason: string) => {
3950
export const getProcessInstance = async (id: number) => {
4051
return await request.get({ url: '/bpm/process-instance/get?id=' + id })
4152
}
53+
54+
/**
55+
* 抄送
56+
* @param data 抄送数据
57+
* @returns 是否抄送成功
58+
*/
59+
export const createProcessInstanceCC = async (data) => {
60+
return await request.post({ url: '/bpm/process-instance/cc/create', data: data })
61+
}
62+
63+
/**
64+
* 抄送列表
65+
* @param params
66+
* @returns
67+
*/
68+
export const getProcessInstanceCCPage = async (params) => {
69+
return await request.get({ url: '/bpm/process-instance/cc/my-page', params })
70+
}
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
<template>
2+
<Dialog v-model="dialogVisible" title="修改任务规则" width="600">
3+
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
4+
<el-form-item label="任务名称" prop="taskName">
5+
<el-input v-model="formData.taskName" disabled placeholder="请输入任务名称" />
6+
</el-form-item>
7+
<el-form-item label="任务标识" prop="taskKey">
8+
<el-input v-model="formData.taskKey" disabled placeholder="请输入任务标识" />
9+
</el-form-item>
10+
<el-form-item label="流程名称" prop="processInstanceName">
11+
<el-input v-model="formData.processInstanceName" disabled placeholder="请输入流程名称" />
12+
</el-form-item>
13+
<el-form-item label="流程标识" prop="processInstanceKey">
14+
<el-input v-model="formData.processInstanceKey" disabled placeholder="请输入流程标识" />
15+
</el-form-item>
16+
17+
<el-form-item label="规则类型" prop="type">
18+
<el-select v-model="formData.type" clearable style="width: 100%">
19+
<el-option
20+
v-for="dict in getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)"
21+
:key="dict.value"
22+
:label="dict.label"
23+
:value="dict.value"
24+
/>
25+
</el-select>
26+
</el-form-item>
27+
<el-form-item v-if="formData.type === 10" label="指定角色" prop="roleIds">
28+
<el-select v-model="formData.roleIds" clearable multiple style="width: 100%">
29+
<el-option
30+
v-for="item in roleOptions"
31+
:key="item.id"
32+
:label="item.name"
33+
:value="item.id"
34+
/>
35+
</el-select>
36+
</el-form-item>
37+
<el-form-item
38+
v-if="formData.type === 20 || formData.type === 21"
39+
label="指定部门"
40+
prop="deptIds"
41+
span="24"
42+
>
43+
<el-tree-select
44+
ref="treeRef"
45+
v-model="formData.deptIds"
46+
:data="deptTreeOptions"
47+
:props="defaultProps"
48+
empty-text="加载中,请稍后"
49+
multiple
50+
node-key="id"
51+
show-checkbox
52+
/>
53+
</el-form-item>
54+
<el-form-item v-if="formData.type === 22" label="指定岗位" prop="postIds" span="24">
55+
<el-select v-model="formData.postIds" clearable multiple style="width: 100%">
56+
<el-option
57+
v-for="item in postOptions"
58+
:key="parseInt(item.id)"
59+
:label="item.name"
60+
:value="parseInt(item.id)"
61+
/>
62+
</el-select>
63+
</el-form-item>
64+
<el-form-item
65+
v-if="formData.type === 30 || formData.type === 31 || formData.type === 32"
66+
label="指定用户"
67+
prop="userIds"
68+
span="24"
69+
>
70+
<el-select v-model="formData.userIds" clearable multiple style="width: 100%">
71+
<el-option
72+
v-for="item in userOptions"
73+
:key="parseInt(item.id)"
74+
:label="item.nickname"
75+
:value="parseInt(item.id)"
76+
/>
77+
</el-select>
78+
</el-form-item>
79+
<el-form-item v-if="formData.type === 40" label="指定用户组" prop="userGroupIds">
80+
<el-select v-model="formData.userGroupIds" clearable multiple style="width: 100%">
81+
<el-option
82+
v-for="item in userGroupOptions"
83+
:key="parseInt(item.id)"
84+
:label="item.name"
85+
:value="parseInt(item.id)"
86+
/>
87+
</el-select>
88+
</el-form-item>
89+
<el-form-item v-if="formData.type === 50" label="指定脚本" prop="scripts">
90+
<el-select v-model="formData.scripts" clearable multiple style="width: 100%">
91+
<el-option
92+
v-for="dict in taskAssignScriptDictDatas"
93+
:key="dict.value"
94+
:label="dict.label"
95+
:value="dict.value"
96+
/>
97+
</el-select>
98+
</el-form-item>
99+
<el-form-item label="抄送原因" prop="reason">
100+
<el-input v-model="formData.reason" placeholder="请输入抄送原因" type="textarea" />
101+
</el-form-item>
102+
</el-form>
103+
<!-- 操作按钮 -->
104+
<template #footer>
105+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
106+
<el-button @click="dialogVisible = false">取 消</el-button>
107+
</template>
108+
</Dialog>
109+
</template>
110+
<script lang="ts" setup>
111+
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
112+
import { defaultProps, handleTree } from '@/utils/tree'
113+
import * as ProcessInstanceApi from '@/api/bpm/processInstance'
114+
import * as RoleApi from '@/api/system/role'
115+
import * as DeptApi from '@/api/system/dept'
116+
import * as PostApi from '@/api/system/post'
117+
import * as UserApi from '@/api/system/user'
118+
import * as UserGroupApi from '@/api/bpm/userGroup'
119+
120+
const { t } = useI18n() // 国际化
121+
const message = useMessage() // 消息弹窗
122+
123+
const dialogVisible = ref(false) // 弹窗的是否展示
124+
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
125+
const formData = ref({
126+
type: Number(undefined),
127+
taskName: '',
128+
taskKey: '',
129+
processInstanceName: '',
130+
processInstanceKey: '',
131+
startUserId: '',
132+
options: [],
133+
roleIds: [],
134+
deptIds: [],
135+
postIds: [],
136+
userIds: [],
137+
userGroupIds: [],
138+
scripts: [],
139+
reason: ''
140+
})
141+
const formRules = reactive({
142+
type: [{ required: true, message: '规则类型不能为空', trigger: 'change' }],
143+
roleIds: [{ required: true, message: '指定角色不能为空', trigger: 'change' }],
144+
deptIds: [{ required: true, message: '指定部门不能为空', trigger: 'change' }],
145+
postIds: [{ required: true, message: '指定岗位不能为空', trigger: 'change' }],
146+
userIds: [{ required: true, message: '指定用户不能为空', trigger: 'change' }],
147+
userGroupIds: [{ required: true, message: '指定用户组不能为空', trigger: 'change' }],
148+
scripts: [{ required: true, message: '指定脚本不能为空', trigger: 'change' }],
149+
reason: [{ required: true, message: '抄送原因不能为空', trigger: 'change' }]
150+
})
151+
const formRef = ref() // 表单 Ref
152+
const roleOptions = ref<RoleApi.RoleVO[]>([]) // 角色列表
153+
const deptOptions = ref<DeptApi.DeptVO[]>([]) // 部门列表
154+
const deptTreeOptions = ref() // 部门树
155+
const postOptions = ref<PostApi.PostVO[]>([]) // 岗位列表
156+
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
157+
const userGroupOptions = ref<UserGroupApi.UserGroupVO[]>([]) // 用户组列表
158+
const taskAssignScriptDictDatas = getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_SCRIPT)
159+
160+
/** 打开弹窗 */
161+
const open = async (row) => {
162+
// 1. 先重置表单
163+
resetForm()
164+
// 2. 再设置表单
165+
if (row != null) {
166+
formData.value.type = undefined as unknown as number
167+
formData.value.taskName = row.name
168+
formData.value.taskKey = row.id
169+
formData.value.processInstanceName = row.processInstance.name
170+
formData.value.processInstanceKey = row.processInstance.id
171+
formData.value.startUserId = row.processInstance.startUserId
172+
}
173+
// 打开弹窗
174+
dialogVisible.value = true
175+
176+
// 获得角色列表
177+
roleOptions.value = await RoleApi.getSimpleRoleList()
178+
// 获得部门列表
179+
deptOptions.value = await DeptApi.getSimpleDeptList()
180+
deptTreeOptions.value = handleTree(deptOptions.value, 'id')
181+
// 获得岗位列表
182+
postOptions.value = await PostApi.getSimplePostList()
183+
// 获得用户列表
184+
userOptions.value = await UserApi.getSimpleUserList()
185+
// 获得用户组列表
186+
userGroupOptions.value = await UserGroupApi.getSimpleUserGroupList()
187+
}
188+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
189+
190+
/** 提交表单 */
191+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
192+
const submitForm = async () => {
193+
// 校验表单
194+
if (!formRef) return
195+
const valid = await formRef.value.validate()
196+
if (!valid) return
197+
198+
// 构建表单
199+
const form = {
200+
...formData.value
201+
}
202+
// 将 roleIds 等选项赋值到 options 中
203+
if (form.type === 10) {
204+
form.options = form.roleIds
205+
} else if (form.type === 20 || form.type === 21) {
206+
form.options = form.deptIds
207+
} else if (form.type === 22) {
208+
form.options = form.postIds
209+
} else if (form.type === 30 || form.type === 31 || form.type === 32) {
210+
form.options = form.userIds
211+
} else if (form.type === 40) {
212+
form.options = form.userGroupIds
213+
} else if (form.type === 50) {
214+
form.options = form.scripts
215+
}
216+
form.roleIds = undefined
217+
form.deptIds = undefined
218+
form.postIds = undefined
219+
form.userIds = undefined
220+
form.userGroupIds = undefined
221+
form.scripts = undefined
222+
223+
// 提交请求
224+
formLoading.value = true
225+
try {
226+
const data = form as unknown as ProcessInstanceApi.ProcessInstanceCCVO
227+
await ProcessInstanceApi.createProcessInstanceCC(data)
228+
console.log(data)
229+
message.success(t('common.createSuccess'))
230+
dialogVisible.value = false
231+
// 发送操作成功的事件
232+
emit('success')
233+
} finally {
234+
formLoading.value = false
235+
}
236+
}
237+
238+
/** 重置表单 */
239+
const resetForm = () => {
240+
formRef.value?.resetFields()
241+
}
242+
</script>

0 commit comments

Comments
 (0)