Skip to content

Commit 6475f81

Browse files
committed
Merge remote-tracking branch 'origin/dev' into dev
2 parents c322fb3 + fb94ae9 commit 6475f81

File tree

15 files changed

+372
-34
lines changed

15 files changed

+372
-34
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "yudao-ui-admin-vue3",
3-
"version": "1.8.1-snapshot",
3+
"version": "1.8.2-snapshot",
44
"description": "基于vue3、vite4、element-plus、typesScript",
55
"author": "xingyu",
66
"private": false,

src/api/bpm/task/index.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,20 @@ export const getTaskListByProcessInstanceId = async (processInstanceId) => {
4141
export const exportTask = async (params) => {
4242
return await request.download({ url: '/bpm/task/export', params })
4343
}
44+
45+
// 获取所有可回退的节点
46+
export const getReturnList = async (params) => {
47+
return await request.get({ url: '/bpm/task/get-return-list', params })
48+
}
49+
50+
// 回退
51+
export const returnTask = async (data) => {
52+
return await request.put({ url: '/bpm/task/return', data })
53+
}
54+
55+
/**
56+
* 委派
57+
*/
58+
export const delegateTask = async (data) => {
59+
return await request.put({ url: '/bpm/task/delegate', data })
60+
}

src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import BpmnViewer from 'bpmn-js/lib/Viewer'
1111
import DefaultEmptyXML from './plugins/defaultEmpty'
1212
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
1313
import { formatDate } from '@/utils/formatTime'
14+
import { isEmpty } from '@/utils/is'
1415
1516
defineOptions({ name: 'MyProcessViewer' })
1617
@@ -85,6 +86,7 @@ const createNewDiagram = async (xml) => {
8586
// console.error(`[Process Designer Warn]: ${e?.message || e}`);
8687
}
8788
}
89+
8890
/* 高亮流程图 */
8991
// TODO 芋艿:如果多个 endActivity 的话,目前的逻辑可能有一定的问题。https://www.jdon.com/workflow/multi-events.html
9092
const highlightDiagram = async () => {
@@ -97,6 +99,9 @@ const highlightDiagram = async () => {
9799
let canvas = bpmnModeler.get('canvas')
98100
let todoActivity: any = activityList.find((m: any) => !m.endTime) // 找到待办的任务
99101
let endActivity: any = activityList[activityList.length - 1] // 获得最后一个任务
102+
let findProcessTask = false //是否已经高亮了进行中的任务
103+
//进行中高亮之后的任务 key 集合,用于过滤掉 taskList 进行中后面的任务,避免进行中后面的数据 Hover 还有数据
104+
let removeTaskDefinitionKeyList = []
100105
// debugger
101106
bpmnModeler.getDefinitions().rootElements[0].flowElements?.forEach((n: any) => {
102107
let activity: any = activityList.find((m: any) => m.key === n.id) // 找到对应的活动
@@ -110,9 +115,17 @@ const highlightDiagram = async () => {
110115
if (!task) {
111116
return
112117
}
118+
//进行中的任务已经高亮过了,则不高亮后面的任务了
119+
if (findProcessTask) {
120+
removeTaskDefinitionKeyList.push(n.id)
121+
return
122+
}
113123
// 高亮任务
114124
canvas.addMarker(n.id, getResultCss(task.result))
115-
125+
//标记是否高亮了进行中任务
126+
if (task.result === 1) {
127+
findProcessTask = true
128+
}
116129
// 如果非通过,就不走后面的线条了
117130
if (task.result !== 2) {
118131
return
@@ -212,6 +225,11 @@ const highlightDiagram = async () => {
212225
}
213226
}
214227
})
228+
if (!isEmpty(removeTaskDefinitionKeyList)) {
229+
taskList.value = taskList.value.filter(
230+
(item) => !removeTaskDefinitionKeyList.includes(item.definitionKey)
231+
)
232+
}
215233
}
216234
const getActivityHighlightCss = (activity) => {
217235
return activity.endTime ? 'highlight' : 'highlight-todo'
@@ -229,6 +247,9 @@ const getResultCss = (result) => {
229247
} else if (result === 4) {
230248
// 已取消
231249
return 'highlight-cancel'
250+
} else if (result === 5) {
251+
// 退回
252+
return 'highlight-return'
232253
}
233254
return ''
234255
}
@@ -273,9 +294,9 @@ const elementHover = (element) => {
273294
console.log(element.value, 'element.value')
274295
const activity = activityLists.value.find((m) => m.key === element.value.id)
275296
console.log(activity, 'activityactivityactivityactivity')
276-
// if (!activity) {
277-
// return
278-
// }
297+
if (!activity) {
298+
return
299+
}
279300
if (!elementOverlayIds.value[element.value.id] && element.value.type !== 'bpmn:Process') {
280301
let html = `<div class="element-overlays">
281302
<p>Elemet id: ${element.value.id}</p>
@@ -564,6 +585,45 @@ watch(
564585
stroke: grey !important;
565586
}
566587
588+
/** 回退 */
589+
.highlight-return.djs-shape .djs-visual > :nth-child(1) {
590+
fill: #e6a23c !important;
591+
stroke: #e6a23c !important;
592+
fill-opacity: 0.2 !important;
593+
}
594+
.highlight-return.djs-shape .djs-visual > :nth-child(2) {
595+
fill: #e6a23c !important;
596+
}
597+
.highlight-return.djs-shape .djs-visual > path {
598+
fill: #e6a23c !important;
599+
fill-opacity: 0.2 !important;
600+
stroke: #e6a23c !important;
601+
}
602+
.highlight-return.djs-connection > .djs-visual > path {
603+
stroke: #e6a23c !important;
604+
}
605+
606+
.highlight-return:not(.djs-connection) .djs-visual > :nth-child(1) {
607+
fill: #e6a23c !important; /* color elements as green */
608+
}
609+
610+
:deep(.highlight-return.djs-shape .djs-visual > :nth-child(1)) {
611+
fill: #e6a23c !important;
612+
stroke: #e6a23c !important;
613+
fill-opacity: 0.2 !important;
614+
}
615+
:deep(.highlight-return.djs-shape .djs-visual > :nth-child(2)) {
616+
fill: #e6a23c !important;
617+
}
618+
:deep(.highlight-return.djs-shape .djs-visual > path) {
619+
fill: #e6a23c !important;
620+
fill-opacity: 0.2 !important;
621+
stroke: #e6a23c !important;
622+
}
623+
:deep(.highlight-return.djs-connection > .djs-visual > path) {
624+
stroke: #e6a23c !important;
625+
}
626+
567627
.element-overlays {
568628
width: 200px;
569629
padding: 8px;

src/utils/constants.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,24 +278,28 @@ export const PromotionDiscountTypeEnum = {
278278
*/
279279
export const BrokerageBindModeEnum = {
280280
ANYTIME: {
281-
mode: 0,
282-
name: '没有推广人'
281+
mode: 1,
282+
name: '首次绑定'
283283
},
284284
REGISTER: {
285-
mode: 1,
286-
name: '新用户'
285+
mode: 2,
286+
name: '注册绑定'
287+
},
288+
OVERRIDE: {
289+
mode: 3,
290+
name: '覆盖绑定'
287291
}
288292
}
289293
/**
290294
* 分佣模式枚举
291295
*/
292296
export const BrokerageEnabledConditionEnum = {
293297
ALL: {
294-
condition: 0,
298+
condition: 1,
295299
name: '人人分销'
296300
},
297301
ADMIN: {
298-
condition: 1,
302+
condition: 2,
299303
name: '指定分销'
300304
}
301305
}

src/views/bpm/processInstance/detail/ProcessInstanceTaskList.vue

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ const getTimelineItemIcon = (item) => {
6969
if (item.result === 4) {
7070
return 'el-icon-remove-outline'
7171
}
72+
if (item.result === 5) {
73+
return 'el-icon-back'
74+
}
7275
return ''
7376
}
7477
@@ -86,6 +89,12 @@ const getTimelineItemType = (item) => {
8689
if (item.result === 4) {
8790
return 'info'
8891
}
92+
if (item.result === 5) {
93+
return 'warning'
94+
}
95+
if (item.result === 6) {
96+
return 'default'
97+
}
8998
return ''
9099
}
91100
</script>
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<template>
2+
<Dialog v-model="dialogVisible" title="委派任务" width="500">
3+
<el-form
4+
ref="formRef"
5+
v-loading="formLoading"
6+
:model="formData"
7+
:rules="formRules"
8+
label-width="110px"
9+
>
10+
<el-form-item label="接收人" prop="delegateUserId">
11+
<el-select v-model="formData.delegateUserId" clearable style="width: 100%">
12+
<el-option
13+
v-for="item in userList"
14+
:key="item.id"
15+
:label="item.nickname"
16+
:value="item.id"
17+
/>
18+
</el-select>
19+
</el-form-item>
20+
<el-form-item label="委派理由" prop="reason">
21+
<el-input v-model="formData.reason" clearable placeholder="请输入委派理由" />
22+
</el-form-item>
23+
</el-form>
24+
<template #footer>
25+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
26+
<el-button @click="dialogVisible = false">取 消</el-button>
27+
</template>
28+
</Dialog>
29+
</template>
30+
<script lang="ts" setup>
31+
import * as TaskApi from '@/api/bpm/task'
32+
import * as UserApi from '@/api/system/user'
33+
34+
defineOptions({ name: 'BpmTaskDelegateForm' })
35+
36+
const dialogVisible = ref(false) // 弹窗的是否展示
37+
const formLoading = ref(false) // 表单的加载中
38+
const formData = ref({
39+
id: '',
40+
delegateUserId: undefined
41+
})
42+
const formRules = ref({
43+
delegateUserId: [{ required: true, message: '接收人不能为空', trigger: 'change' }]
44+
})
45+
46+
const formRef = ref() // 表单 Ref
47+
const userList = ref<any[]>([]) // 用户列表
48+
49+
/** 打开弹窗 */
50+
const open = async (id: string) => {
51+
dialogVisible.value = true
52+
resetForm()
53+
formData.value.id = id
54+
// 获得用户列表
55+
userList.value = await UserApi.getSimpleUserList()
56+
}
57+
defineExpose({ open }) // 提供 openModal 方法,用于打开弹窗
58+
59+
/** 提交表单 */
60+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
61+
const submitForm = async () => {
62+
// 校验表单
63+
if (!formRef) return
64+
const valid = await formRef.value.validate()
65+
if (!valid) return
66+
// 提交请求
67+
formLoading.value = true
68+
try {
69+
await TaskApi.delegateTask(formData.value)
70+
dialogVisible.value = false
71+
// 发送操作成功的事件
72+
emit('success')
73+
} finally {
74+
formLoading.value = false
75+
}
76+
}
77+
78+
/** 重置表单 */
79+
const resetForm = () => {
80+
formData.value = {
81+
id: '',
82+
delegateUserId: undefined
83+
}
84+
formRef.value?.resetFields()
85+
}
86+
</script>
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<template>
2+
<Dialog v-model="dialogVisible" title="回退" width="500">
3+
<el-form
4+
ref="formRef"
5+
v-loading="formLoading"
6+
:model="formData"
7+
:rules="formRules"
8+
label-width="110px"
9+
>
10+
<el-form-item label="退回节点" prop="targetDefinitionKey">
11+
<el-select v-model="formData.targetDefinitionKey" clearable style="width: 100%">
12+
<el-option
13+
v-for="item in returnList"
14+
:key="item.definitionKey"
15+
:label="item.name"
16+
:value="item.definitionKey"
17+
/>
18+
</el-select>
19+
</el-form-item>
20+
<el-form-item label="回退理由" prop="reason">
21+
<el-input v-model="formData.reason" clearable placeholder="请输入回退理由" />
22+
</el-form-item>
23+
</el-form>
24+
<template #footer>
25+
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
26+
<el-button @click="dialogVisible = false">取 消</el-button>
27+
</template>
28+
</Dialog>
29+
</template>
30+
<script lang="ts" name="TaskRollbackDialogForm" setup>
31+
import * as TaskApi from '@/api/bpm/task'
32+
33+
const message = useMessage() // 消息弹窗
34+
const dialogVisible = ref(false) // 弹窗的是否展示
35+
const formLoading = ref(false) // 表单的加载中
36+
const formData = ref({
37+
id: '',
38+
targetDefinitionKey: undefined,
39+
reason: ''
40+
})
41+
const formRules = ref({
42+
targetDefinitionKey: [{ required: true, message: '必须选择回退节点', trigger: 'change' }],
43+
reason: [{ required: true, message: '回退理由不能为空', trigger: 'blur' }]
44+
})
45+
46+
const formRef = ref() // 表单 Ref
47+
const returnList = ref([])
48+
/** 打开弹窗 */
49+
const open = async (id: string) => {
50+
returnList.value = await TaskApi.getReturnList({ taskId: id })
51+
if (returnList.value.length === 0) {
52+
message.warning('当前没有可回退的节点')
53+
return false
54+
}
55+
dialogVisible.value = true
56+
resetForm()
57+
formData.value.id = id
58+
}
59+
defineExpose({ open }) // 提供 openModal 方法,用于打开弹窗
60+
61+
/** 提交表单 */
62+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
63+
const submitForm = async () => {
64+
// 校验表单
65+
if (!formRef) return
66+
const valid = await formRef.value.validate()
67+
if (!valid) return
68+
// 提交请求
69+
formLoading.value = true
70+
try {
71+
await TaskApi.returnTask(formData.value)
72+
message.success('回退成功')
73+
dialogVisible.value = false
74+
// 发送操作成功的事件
75+
emit('success')
76+
} finally {
77+
formLoading.value = false
78+
}
79+
}
80+
81+
/** 重置表单 */
82+
const resetForm = () => {
83+
formData.value = {
84+
id: '',
85+
targetDefinitionKey: undefined,
86+
reason: ''
87+
}
88+
formRef.value?.resetFields()
89+
}
90+
</script>

0 commit comments

Comments
 (0)