feat: [bpm] review 修改

This commit is contained in:
jason
2026-01-16 09:55:45 +08:00
parent 9260346aaa
commit d970dfe481
6 changed files with 116 additions and 170 deletions

View File

@@ -40,8 +40,8 @@
type="primary"
class="flex-1"
plain
:loading="submitting"
:disabled="submitting"
:loading="formLoading"
:disabled="formLoading"
@click="handleSubmit('before')"
>
向前加签
@@ -49,8 +49,8 @@
<wd-button
type="primary"
class="flex-1"
:loading="submitting"
:disabled="submitting"
:loading="formLoading"
:disabled="formLoading"
@click="handleSubmit('after')"
>
向后加签
@@ -84,7 +84,7 @@ definePage({
const taskId = computed(() => props.taskId)
const processInstanceId = computed(() => props.processInstanceId)
const toast = useToast()
const submitting = ref(false)
const formLoading = ref(false)
const formData = reactive({
userIds: [] as number[],
reason: '',
@@ -104,48 +104,40 @@ function handleBack() {
navigateBackPlus(`/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`)
}
// TODO @jason最好放在 onMounted 里?或者其他地方,有个入口方法。
/** 初始化校验 */
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
}
/** 提交操作 */
async function handleSubmit(type: 'before' | 'after') {
if (submitting.value) {
if (formLoading.value) {
return
}
const { valid } = await formRef.value!.validate()
if (!valid) {
return
}
// TODO @jasonsubmitting 改成 formLoading 哇?统一代码风格哈;
submitting.value = true
formLoading.value = true
try {
// TODO @jason这里是不是不用判断 result 哈?
const result = await signCreateTask({
await signCreateTask({
id: taskId.value as string,
type,
userIds: formData.userIds,
reason: formData.reason,
})
if (result) {
const actionText = type === 'before' ? '向前加签' : '向后加签'
toast.success(`${actionText}成功`)
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
}
} catch (error) {
// TODO @jason可以不用这里的 catch 哈?
const actionText = type === 'before' ? '向前加签' : '向后加签'
console.error(`[add-sign] ${actionText}失败:`, error)
toast.error(`${actionText}失败`)
toast.success(`${actionText}成功`)
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
} finally {
submitting.value = false
formLoading.value = false
}
}
/** 页面加载时 */
onMounted(() => {
/** 初始化校验 */
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
}
})
</script>

View File

@@ -31,8 +31,8 @@
<wd-button
:type="isApprove ? 'primary' : 'error'"
block
:loading="submitting"
:disabled="submitting"
:loading="formLoading"
:disabled="formLoading"
@click="handleSubmit"
>
{{ isApprove ? '同意' : '拒绝' }}
@@ -63,7 +63,7 @@ definePage({
const taskId = computed(() => props.id || '')
const isPass = computed(() => props.pass !== 'false') // true: 同意, false: 拒绝
const toast = useToast()
const submitting = ref(false)
const formLoading = ref(false)
const formData = reactive({
reason: '',
})
@@ -93,15 +93,14 @@ function validateForm() {
/** 提交审批 */
async function handleSubmit() {
// TODO @jason看看是不是要用原生的校验
if (submitting.value) {
if (formLoading.value) {
return
}
if (!validateForm()) {
return
}
// TODO @jason要不换成 formLoading保持项目统一
submitting.value = true
formLoading.value = true
try {
const api = isApprove.value ? approveTask : rejectTask
// TODO @jason这里看看不用 result
@@ -116,7 +115,7 @@ async function handleSubmit() {
}, 1500)
}
} finally {
submitting.value = false
formLoading.value = false
}
}
</script>

View File

@@ -40,8 +40,8 @@
<wd-button
type="primary"
block
:loading="submitting"
:disabled="submitting"
:loading="formLoading"
:disabled="formLoading"
@click="handleSubmit"
>
减签
@@ -75,7 +75,7 @@ definePage({
const taskId = computed(() => props.taskId)
const processInstanceId = computed(() => props.processInstanceId)
const toast = useToast()
const submitting = ref(false)
const formLoading = ref(false)
const taskOptions = ref<any[]>([])
const formData = reactive({
deleteSignTaskId: '',
@@ -96,12 +96,6 @@ function handleBack() {
navigateBackPlus(`/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`)
}
/** 初始化校验 */
// TODO @jason最好放在 onMounted 里?或者其他地方,有个入口方法。
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
}
/** 获取减签人员标签 */
function getDeleteSignUserLabel(task: any): string {
const deptName = task?.assigneeUser?.deptName || task?.ownerUser?.deptName
@@ -111,37 +105,30 @@ function getDeleteSignUserLabel(task: any): string {
/** 获取可减签的任务列表 */
async function loadDeleteSignTaskList() {
try {
let childTasks = []
// TODO @jason这里应该是从 props 里获取?
// 从 URL 参数中获取子任务数据
if (props.children) {
try {
childTasks = JSON.parse(decodeURIComponent(props.children))
} catch (parseError) {
console.error('[delete-sign] 解析子任务数据失败:', parseError)
}
let childTasks = []
// 从 props 中获取子任务数据
if (props.children) {
try {
childTasks = JSON.parse(decodeURIComponent(props.children))
} catch (parseError) {
console.error('[delete-sign] 解析子任务数据失败:', parseError)
}
// 提示没有子任务数据
if (childTasks.length === 0) {
toast.show('没有可减签的任务')
return
}
taskOptions.value = childTasks.map(task => ({
id: task.id,
label: getDeleteSignUserLabel(task),
}))
} catch (error) {
// TODO @jason这里不用 try catch 哈
console.error('[delete-sign] 获取可减签任务失败:', error)
toast.error('获取可减签任务失败')
}
// 提示没有子任务数据
if (childTasks.length === 0) {
toast.show('没有可减签的任务')
return
}
taskOptions.value = childTasks.map(task => ({
id: task.id,
label: getDeleteSignUserLabel(task),
}))
}
/** 提交操作 */
async function handleSubmit() {
if (submitting.value) {
if (formLoading.value) {
return
}
const { valid } = await formRef.value!.validate()
@@ -149,33 +136,30 @@ async function handleSubmit() {
return
}
// TODO @jasonsubmitting 改成 formLoading 哇?统一代码风格哈;
submitting.value = true
formLoading.value = true
try {
// TODO @jason这里是不是不用判断 result 哈?
const result = await signDeleteTask({
await signDeleteTask({
id: formData.deleteSignTaskId,
reason: formData.reason,
})
if (result) {
toast.success('减签成功')
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
}
} catch (error) {
// TODO @jason可以不用这里的 catch 哈?
console.error('[delete-sign] 减签失败:', error)
toast.error('减签失败')
toast.success('减签成功')
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
} finally {
submitting.value = false
formLoading.value = false
}
}
/** 页面加载时,获取可减签任务列表 */
onMounted(() => {
/** 初始化校验 */
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
return
}
loadDeleteSignTaskList()
})
</script>

View File

@@ -37,8 +37,8 @@
<wd-button
type="primary"
block
:loading="submitting"
:disabled="submitting"
:loading="formLoading"
:disabled="formLoading"
@click="handleSubmit"
>
确认取消
@@ -71,7 +71,7 @@ definePage({
const processInstanceId = computed(() => props.processInstanceId)
const taskId = computed(() => props.taskId)
const toast = useToast()
const submitting = ref(false)
const formLoading = ref(false)
const formData = reactive({
cancelReason: '',
})
@@ -90,43 +90,37 @@ function handleBack() {
navigateBackPlus(backUrl)
}
/** 初始化校验 */
if (!props.processInstanceId) {
toast.show('参数错误')
}
/** 提交操作 */
async function handleSubmit() {
if (submitting.value) {
if (formLoading.value) {
return
}
const { valid } = await formRef.value!.validate()
if (!valid) {
return
}
// TODO @jason最好放在 onMounted 里?或者其他地方,有个入口方法。
submitting.value = true
formLoading.value = true
try {
// TODO @jason不判断 result 可以哇?
const result = await cancelProcessInstanceByStartUser(
await cancelProcessInstanceByStartUser(
processInstanceId.value,
formData.cancelReason,
)
if (result) {
toast.success('流程取消成功')
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}`,
})
}, 500)
}
} catch (error) {
// TODO @jason错误处理这里可以去掉哈。
console.error('[process-cancel] 取消流程失败:', error)
toast.error('取消流程失败')
toast.success('流程取消成功')
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}`,
})
}, 500)
} finally {
submitting.value = false
formLoading.value = false
}
}
/** 页面加载时 */
onMounted(() => {
/** 初始化校验 */
if (!props.processInstanceId) {
toast.show('参数错误')
}
})
</script>

View File

@@ -95,12 +95,6 @@ function handleBack() {
navigateBackPlus(`/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`)
}
/** 初始化校验 */
// TODO @jason最好放在 onMounted 里?或者其他地方,有个入口方法。
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
}
/** 提交操作 */
async function handleSubmit() {
if (submitting.value) {
@@ -118,33 +112,33 @@ async function handleSubmit() {
id: taskId.value as string,
reason: formData.reason,
}
// todo @jason这里是不是不用判断 result 哈?
let result: boolean
if (isDelegate.value) {
result = await delegateTask({
await delegateTask({
...data,
delegateUserId: String(formData.userId),
})
} else {
result = await transferTask({
await transferTask({
...data,
assigneeUserId: String(formData.userId),
})
}
if (result) {
toast.success(`${isDelegate.value ? '委派' : '转办'}成功`)
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
}
} catch (error) {
// TODO @jason可以不用这里的 catch 哈?
console.error(`[reassign] ${isDelegate.value ? '委派' : '转办'}失败:`, error)
toast.error(`${isDelegate.value ? '委派' : '转办'}失败`)
toast.success(`${isDelegate.value ? '委派' : '转办'}成功`)
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
} finally {
submitting.value = false
}
}
/** 页面加载时 */
onMounted(() => {
/** 初始化校验 */
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
}
})
</script>

View File

@@ -94,25 +94,10 @@ function handleBack() {
navigateBackPlus(`/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`)
}
/** 初始化校验 */
// TODO @jason最好放在 onMounted 里?或者其他地方,有个入口方法。
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
}
/** 获取可退回的节点列表 */
async function loadReturnTaskList() {
try {
const result = await getTaskListByReturn(taskId.value)
// TODO @jason这个判断可以考虑去掉哈。
if (result && Array.isArray(result)) {
activityOptions.value = result
}
} catch (error) {
// TODO @jason错误处理这里可以去掉哈。
console.error('[return] 获取可退回节点失败:', error)
toast.error('获取可退回节点失败')
}
const result = await getTaskListByReturn(taskId.value)
activityOptions.value = result
}
/** 提交操作 */
@@ -124,28 +109,21 @@ async function handleSubmit() {
if (!valid) {
return
}
// TODO @jasonsubmitting 改成 formLoading 哇?统一代码风格哈;
submitting.value = true
try {
// TODO @jason这里是不是不用判断 result 哈?
const result = await returnTask({
await returnTask({
id: taskId.value as string,
targetTaskDefinitionKey: formData.targetActivityId,
reason: formData.reason,
})
if (result) {
toast.success('退回成功')
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
}
} catch (error) {
// TODO @jason可以不用这里的 catch 哈?
console.error('[return] 退回失败:', error)
toast.error('退回失败')
toast.success('退回成功')
setTimeout(() => {
uni.redirectTo({
url: `/pages-bpm/processInstance/detail/index?id=${processInstanceId.value}&taskId=${taskId.value}`,
})
}, 500)
} finally {
submitting.value = false
}
@@ -153,6 +131,11 @@ async function handleSubmit() {
/** 页面加载时获取可退回节点列表 */
onMounted(() => {
/** 初始化校验 */
if (!props.taskId || !props.processInstanceId) {
toast.show('参数错误')
return
}
loadReturnTaskList()
})
</script>