提交 e4c90ebb authored 作者: kxjia's avatar kxjia

完善问题

上级 2d318c87
......@@ -33,10 +33,10 @@
import { ref,onMounted,nextTick } from 'vue'
import { useForm, BasicForm, FormSchema } from '/@/components/Form'
import { CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons-vue'
import { complete, getMyTaskFlow,getRejectNode } from '/@/components/Process/api/todo'
import { complete, getMyTaskFlow,getRejectNode,rejectTask } from '/@/components/Process/api/todo'
import { message } from 'ant-design-vue'
const emit = defineEmits(['update:visible', 'success', 'error', 'close'])
const emit = defineEmits(['update:visible', 'success', 'error', 'close','approval-fail'])
const props = defineProps({
beforeFlowNode: {
type: Object,
......@@ -48,6 +48,8 @@
dataId: { type: String, default: '' },
})
const formSchemas: FormSchema[] = [
{
label: '审批结果',
......@@ -119,10 +121,11 @@
}
const handleSaveApp = async () => {
const formDataTmp = await validate()
const myTaskFlow = await getMyTaskFlow({ deploymentId: props.deployId, dataId: props.dataId })
if (myTaskFlow?.taskId) {
alert(JSON.stringify(myTaskFlow))
const reviewStatus = formDataTmp.reviewStatus;
if (reviewStatus === true) {
await complete({
......@@ -132,28 +135,21 @@
comment: formDataTmp.comment,
values: {
approval: formDataTmp.approvalUser || formDataTmp.approvalRole,
approvalType: formDataTmp.userType
approvalType: props.userType
},
})
} else {
const rejectNode = await getRejectNode({
deployId: props.deployId,
taskId: myTaskFlow.taskId,
isApproved: false,
})
alert(JSON.stringify(rejectNode))
if (rejectNode?.targetNode) {
await complete({
instanceId: myTaskFlow.procInsId || '',
deployId: myTaskFlow.deployId || '',
taskId: myTaskFlow.taskId,
comment: formDataTmp.comment,
values: {
rejectNode: rejectNode.targetNode,
},
})
// await rejectTask({
// instanceId: myTaskFlow.procInsId || '',
// deployId: myTaskFlow.deployId || '',
// taskId: myTaskFlow.taskId,
// comment: formDataTmp.comment,
// values: {
// rejectNode: props.beforeFlowNode,
// },
// })
emit('approval-fail', props.dataId)
}
}
emit('success', props.dataId)
......@@ -162,7 +158,7 @@
handleClose()
})
}
}
onMounted(async() => {
if (props.userType === 'user') {
......
......@@ -4,6 +4,10 @@
<template #title>
<div class="form-header">
<span class="form-title">当前待办[{{ editableNode?.name || '无' }}]</span>
<a-button color="blue" v-if="!isEditStatus" @click="handleSetEditStatus">转阅</a-button>
<a-button color="blue" v-if="!isEditStatus" @click="handleSetEditStatus">转发</a-button>
<a-button color="blue" v-if="!isEditStatus" @click="handleSetEditStatus">退回</a-button>
<a-button color="blue" v-if="!isEditStatus" @click="handleSetEditStatus">编辑</a-button>
<a-button color="blue" v-if="isEditStatus" @click="handleSetEditStatus">只读</a-button>
</div>
......@@ -255,8 +259,9 @@ function createErrorComponent(msg: string) {
// 处理编辑状态切换
function handleSetEditStatus() {
isEditStatus.value = !isEditStatus.value
if (formComponentRef.value&&typeof formComponentRef.value.formDisabled === 'function') {
//formComponentRef.value.formDisabled(isEditStatus.value)
if (formComponentRef.value&&typeof formComponentRef.value.setFormDisabledStatus === 'function') {
formComponentRef.value.setFormDisabledStatus(false)
}
}
......
......@@ -3,29 +3,63 @@
@register="registerBasicDrawer"
:header-style="{ backgroundColor: '#018ffb', borderBottom: '1px solid #e8eef2' }">
<div class="drawer-content">
<a-tabs v-model:activeKey="activeKey" type="card" @change="handleTabChange">
<a-tab-pane key="chart" tab="流程图">
<FlowHistoryChart ref="refFlowHistoryChart" />
<FlowHistoryRecord :procInsId="procInsId" />
</a-tab-pane>
<a-tab-pane key="record" tab="记录">
<FlowHistoryRecord ref="refFlowHistoryRecord" />
</a-tab-pane>
</a-tabs>
</div>
</BasicDrawer>
</template>
<script lang="ts" setup>
import { defineComponent,ref } from 'vue';
import { nextTick, ref } from 'vue';
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
import FlowHistoryChart from './FlowHistoryChart.vue';
import FlowHistoryRecord from './FlowHistoryRecord.vue';
const activeKey = ref('chart');
const procInsId = ref('');
const dataId = ref('');
const deployId = ref('');
const refFlowHistoryChart = ref();
const refFlowHistoryRecord = ref();
const curData = ref({});
const callback = (data) => {
refFlowHistoryChart.value.loadData(data);
curData.value = data;
handleTabChange('chart');
}
const [registerBasicDrawer, { closeDrawer, setDrawerProps }] = useDrawerInner(callback);
const handleCloseDrawer = () => {
closeDrawer();
const handleTabChange = (key) => {
if (key === 'chart') {
nextTick(() => {
refFlowHistoryChart.value.loadData(curData.value);
})
} else if (key === 'record') {
nextTick(() => {
refFlowHistoryRecord.value.loadData(curData.value);
})
}
activeKey.value = key;
}
const [registerBasicDrawer, { closeDrawer, setDrawerProps }] = useDrawerInner(callback);
</script>
<style scoped>
.drawer-content {
height: 100%;
}
.drawer-content :deep(.ant-tabs) {
height: 100%;
}
.drawer-content :deep(.ant-tabs-content) {
height: calc(100% - 40px);
overflow-y: auto;
}
</style>
\ No newline at end of file
......@@ -82,16 +82,10 @@
import { flowRecord } from '/@/components/Process/api/finished';
import dayjs from 'dayjs';
// Props
const props = defineProps<{
procInsId: string;
}>();
// 响应式数据
const loading = ref(false);
const flowRecordList = ref<any[]>([]);
// 方法
const formatTime = (time: string) => {
if (!time) return '';
return dayjs(time).format('YYYY-MM-DD HH:mm:ss');
......@@ -113,10 +107,9 @@
const loadData = async (data) => {
try {
loading.value = true;
const res = await flowRecord({ procInsId: props.procInsId });
const res = await flowRecord({ procInsId: data.procInsId,deployId: data.deployId });
flowRecordList.value = res.flowList || [];
} catch (error) {
console.error('加载流转记录失败:', error);
message.error('加载流转记录失败');
throw error;
} finally {
......
<template>
<a-drawer
<BasicDrawer
title="任务指派"
:visible="visible"
width="30%"
:closable="true"
:mask-closable="false"
:destroy-on-close="true"
:footer="null"
@close="handleClose"
class="task-assignee-drawer"
@register="registerBasicDrawer"
:header-style="{ backgroundColor: '#018ffb', borderBottom: '1px solid #e8eef2' }"
>
<div class="drawer-content">
<div class="drawer-content" style="height: 80vh">
<a-card title="选择任务指派人" :bordered="false" class="assignee-card">
<a-form layout="vertical">
<a-form-item label="用户类型" required>
......@@ -88,30 +87,30 @@
:showButton="false"
labelKey="realname"
/>
</a-drawer>
</BasicDrawer>
</template>
<script lang="ts" setup>
import { ref, computed, watch,nextTick } from 'vue'
import { ref, computed, watch, nextTick } from 'vue'
import { message } from 'ant-design-vue'
import { useModal } from '/@/components/Modal'
import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'
import { UserOutlined, TeamOutlined } from '@ant-design/icons-vue'
import UserSelectModal from '/@/components/Form/src/jeecg/components/modal/UserSelectModal.vue'
import RoleSelectModal from '/@/components/Form/src/jeecg/components/modal/RoleSelectModal.vue'
import { complete, getMyTaskFlow } from '/@/components/Process/api/todo'
const props = defineProps({
visible: { type: Boolean, default: false },
formData: { type: Object, default: () => ({}) },
assignee: { type: String, default: null },
userType: { type: String, default: 'user' },
deployId: { type: String, default: '' },
required: { type: Boolean, default: true },
assigneeName: { type: String, default: null },
dataId: { type: String, default: '' }
})
const emit = defineEmits(['update:visible', 'success', 'error', 'close'])
interface formDadta {
assignee: string
userType: string
deployId?: string
required?: string
assigneeName?: string
dataId?: string
}
const emit = defineEmits(['success', 'error', 'close'])
const [registerSelUserModal, { openModal: userOpenModal }] = useModal()
const [registerSelRoleModal, { openModal: roleOpenModal }] = useModal()
......@@ -121,41 +120,25 @@ const localUserType = ref<'user' | 'role'>('user')
const assigneeId = ref('')
const assigneeDisplayName = ref('')
const confirmLoading = ref(false)
const drawerHistoryVisible = ref(false)
// 计算属性
const hasAssignee = computed(() => !!assigneeId.value)
const validateStatus = computed(() => {
if (!props.required || hasAssignee.value) return ''
return 'error'
})
const validateHelp = computed(() =>
validateStatus.value === 'error' ? `请选择${localUserType.value === 'user' ? '用户' : '角色'}` : ''
)
// 初始化数据
const initData = () => {
assigneeId.value = ''
assigneeDisplayName.value = ''
if (props.assignee) {
localUserType.value = props.userType === 'role' ? 'role' : 'user'
assigneeId.value = props.assignee
if (props.assigneeName) {
assigneeDisplayName.value = props.assigneeName
const dataId = ref('')
const deployId = ref('')
// 使用 useDrawerInner 接收外部传入的数据
const [registerBasicDrawer, { closeDrawer, setDrawerProps }] = useDrawerInner((data) => {
if (data) {
dataId.value = data.dataId || ''
deployId.value = data.deployId || ''
if (data.assignee) {
localUserType.value = data.userType === 'role' ? 'role' : 'user'
assigneeId.value = data.assignee
if (data.assigneeName) {
assigneeDisplayName.value = data.assigneeName
}
} else {
localUserType.value = props.userType === 'role' ? 'role' : 'user'
localUserType.value = data.userType === 'role' ? 'role' : 'user'
}
}
const resetDrawer = () => {
localUserType.value = props.userType === 'role' ? 'role' : 'user'
assigneeId.value = ''
assigneeDisplayName.value = ''
}
}
})
const clearAssignee = () => {
assigneeId.value = ''
......@@ -172,7 +155,6 @@ const handleSelect = () => {
// 选择用户回调
const onSelectUserOk = (options: any[], values: any[]) => {
alert(JSON.stringify(options))
if (!values?.length) return
assigneeId.value = values[0]
assigneeDisplayName.value = options[0]?.label || ''
......@@ -181,7 +163,6 @@ const onSelectUserOk = (options: any[], values: any[]) => {
// 选择角色回调
const onSelectRoleOk = (options: any[], values: any[]) => {
alert(JSON.stringify(options))
if (!values?.length) return
assigneeId.value = values[0]
assigneeDisplayName.value = options[0]?.label || ''
......@@ -189,27 +170,23 @@ const onSelectRoleOk = (options: any[], values: any[]) => {
}
const handleClose = () => {
emit('update:visible', false)
closeDrawer()
emit('close')
}
const handleConfirm = async () => {
if (props.required && !assigneeId.value) {
message.error(`请选择${localUserType.value === 'user' ? '用户' : '角色'}`)
return
}
confirmLoading.value = true
try {
const dataId = props.dataId?.id || ''
if (dataId && props.deployId) {
const myTaskFlow = await getMyTaskFlow({ deploymentId: props.deployId, dataId })
if (dataId.value && deployId.value) {
const myTaskFlow = await getMyTaskFlow({ deploymentId: deployId.value, dataId: dataId.value })
if (myTaskFlow?.taskId) {
await complete({
instanceId: myTaskFlow.procInsId || '',
deployId: myTaskFlow.deployId || '',
taskId: myTaskFlow.taskId,
comment: '',
dataId: dataId.value,
comment: 'eeeeeee',
values: {
approval: assigneeId.value,
approvalType: localUserType.value
......@@ -218,7 +195,7 @@ const handleConfirm = async () => {
}
}
emit('success', props.dataId)
emit('success', dataId.value)
nextTick(() => {
message.success('任务发送成功')
handleClose()
......@@ -229,7 +206,7 @@ const handleConfirm = async () => {
} finally {
confirmLoading.value = false
}
}
}
// 对外暴露的方法
const getAssigneeData = () => ({
......@@ -251,32 +228,7 @@ const setRoleInfo = (roleId: string, roleNameValue: string) => {
localUserType.value = 'role'
}
const openHistoryDrawer = () => {
drawerHistoryVisible.value = true;
};
// 监听 visible 变化
watch(() => props.visible, (newVal) => {
if (newVal) {
initData()
} else {
resetDrawer()
}
}, { immediate: true })
watch(() => props.assignee, () => {
if (props.visible) initData()
})
watch(() => props.userType, () => {
if (props.visible && !props.assignee) {
localUserType.value = props.userType === 'role' ? 'role' : 'user'
}
})
defineExpose({
resetDrawer,
getAssigneeData,
submit: handleConfirm,
setUserInfo,
......@@ -285,34 +237,6 @@ defineExpose({
</script>
<style scoped lang="scss">
.task-assignee-drawer {
:deep(.ant-drawer-body) {
padding: 0;
height: 100%;
overflow: hidden;
}
:deep(.ant-drawer-header) {
background-color: #f5f7fa;
border-bottom: 1px solid #e8eef2;
padding: 16px 24px;
.ant-drawer-title {
font-size: 16px;
font-weight: 500;
color: #1f2f3d;
}
.ant-drawer-close {
color: #8c8c8c;
&:hover {
color: #1f2f3d;
}
}
}
}
.drawer-content {
height: 100%;
overflow-y: auto;
......
......@@ -43,12 +43,14 @@
<ApprovalPanel style="width: 100%;height: 100%;"
ref="approvalPanelRef"
:current-node="editableNode"
:before-flow-node="workflowNodes[props.currentNodeIndex - 1]"
:deploy-id="props.deployId"
:data-id="props.dataId"
:assignee="props.assignee"
:user-type="props.userType"
@update:approval-data="handleApprovalDataUpdate"
@success="handleApprovalSuccess"
@approval-fail="handleApprovalFail"
/>
</a-col>
......@@ -197,7 +199,7 @@ const props = defineProps({
})
const emit = defineEmits(['update:visible', 'submit', 'close', 'form-data-update'])
const emit = defineEmits(['update:visible', 'submit', 'close', 'form-data-update','success','approval-fail'])
// 状态
const submitLoading = ref(false)
......@@ -251,6 +253,7 @@ function handleFormMounted({ nodeId, instance }: { nodeId: string; instance: any
function handleApprovalSuccess(dataId: string) {
if (dataId === props.dataId) {
message.success('审核成功')
emit('success',dataId)
handleClose()
}
}
......@@ -319,6 +322,15 @@ function handleClose() {
emit('close')
}
// 处理审核失败
function handleApprovalFail(dataId: string) {
if (dataId === props.dataId) {
message.error('审核失败')
emit('approval-fail',dataId)
handleClose()
}
}
// 重置数据
function resetFormData() {
if (currentFormPanelRef.value) {
......
......@@ -206,7 +206,6 @@ if (key === '3') {
deployId: taskForm.deployId,
}).then((res) => {
flowData.value = res
console.log("xml88888888888888888",JSON.stringify(res))
})
}
}
......
......@@ -170,15 +170,15 @@
emit("sendWorkFlow",record)
}
async function handleUpdate(dataId) {
async function handleUpdate(dataId,flowNode) {
let record = {
bmpNodeId: props.nextFlowNode.id,
deployId: props.nextFlowNode.deployId,
bmpNodeId: flowNode.id,
deployId: flowNode.deployId,
bpmStatus: 2,
id:dataId
}
await saveOrUpdate(record,true).then(res => {
handleSuccess(null);
(selectedRowKeys.value = []) && reload();
})
}
......@@ -192,8 +192,6 @@
})
}
defineExpose({
handleUpdate,
handleStartUpdate
......
......@@ -89,11 +89,14 @@
}
async function handleUpdate(dataId) {
await saveOrUpdate({
bmpNodeId: props.nextFlowNode.id,
id:dataId,
},true).then(res => {
async function handleUpdate(dataId,flowNode) {
let record = {
bmpNodeId: flowNode.id,
deployId: flowNode.deployId,
bpmStatus: 2,
id:dataId
}
await saveOrUpdate(record,true).then(res => {
handleSuccess();
})
}
......
......@@ -34,20 +34,15 @@
@close="handleDrawerClose"
@form-data-update="handleMultiFormDataUpdate"
width="90%"
@success="handlSendSuccess"
@approval-fail="handlApprovalFail"
/>
<TaskAssigneeDrawer
v-model:visible="drawerTaskVisible"
:user-type="userType"
:assignee="assignee"
:deploy-id="deployId"
:custom-next-api="customNextApi"
:form-data="formData"
:data-id="dataId"
<task-assignee-drawer @register="registerAssigneeDrawer"
@success="handlSendSuccess"
@error="handleError"
/>
</div>
</template>
......@@ -57,7 +52,9 @@
import { definitionStart, definitionStartByDeployId,addMyTaskFlow } from "/@/components/Process/api/definition";
import WorkFlowFormDrawer from '/@/views/common/WorkFlowFormDrawer.vue';
import TaskAssigneeDrawer from '/@/views/common/TaskAssigneeDrawer.vue'
import { CONNREFUSED } from 'dns';
import { useDrawer } from '/@/components/Drawer';
const [ registerAssigneeDrawer, { openDrawer: openAssigneeDrawer }] = useDrawer();
const formTableName = "st_problem_check";
const workflowNodes = ref<any[]>([]);
......@@ -104,7 +101,7 @@ import { CONNREFUSED } from 'dns';
function handleTabChange(key) {
activeTab.value = key;
currentMultiFormIndex.value = key - 1;
currentNode.value = workflowNodes.value[key - 1];
currentNode.value = workflowNodes.value[currentMultiFormIndex.value];
}
function loadComponent(url: string) {
......@@ -154,13 +151,14 @@ import { CONNREFUSED } from 'dns';
const deployId = currentNode.value.deployId || '';
const startResRaw = await definitionStartByDeployId(deployId, formData);
let myTaskFlow = {}
if (startResRaw?.procInsId) {
procInsId.value = startResRaw.procInsId;
if (startResRaw?.instanceId) {
procInsId.value = startResRaw.instanceId;
alert(procInsId.value)
myTaskFlow["taskId"] = startResRaw.taskId;
myTaskFlow["deployId"] = startResRaw.deployId;
myTaskFlow["procInsId"] = startResRaw.procInsId;
myTaskFlow["procInsId"] = startResRaw.instanceId;
myTaskFlow["executionId"] = startResRaw.executionId;
myTaskFlow["procDefId"] = startResRaw.instanceId ;
myTaskFlow["targetId"] = data.id;
myTaskFlow["taskDefinitionKey"] = currentNode.value.id;
myTaskFlow["formTableName"] = formTableName;
......@@ -179,7 +177,7 @@ import { CONNREFUSED } from 'dns';
if (currentFormComponent && typeof currentFormComponent.handleUpdate === 'function') {
currentFormComponent.handleStartUpdate({
dataId:data.id,
procInsId: startResRaw.procInsId,
procInsId: procInsId.value,
});
} else {
console.warn('当前组件实例不存在或没有 handleUpdate 方法');
......@@ -191,10 +189,16 @@ import { CONNREFUSED } from 'dns';
drawerTaskVisible.value = true;
dataId.value = data.id;
deployId.value = currentNode.value.deployId || '';
await setNextNodeUser();
openAssigneeDrawer(true, {
assignee: assignee.value,
assigneeName: '',
userType: userType.value,
dataId: data.id,
deployId: deployId.value,
})
await setNextNodeUser();
}
const setNextNodeUser = async () => {
......@@ -205,7 +209,7 @@ import { CONNREFUSED } from 'dns';
if (userTypes.length > 0) {
userType.value = userTypes[0].value || '';
if(userType.value==="role"){
if(nextNode.candidateGroups){
if(nextNode.candidateGroups&&nextNode.candidateGroups.length>0){
assignee.value = nextNode.candidateGroups[0].id;
}
} else {
......@@ -215,37 +219,6 @@ import { CONNREFUSED } from 'dns';
}
// const handleOpenMultiForm = (params: {
// nodeIndex?: number;
// title?: string;
// procDefId?: string;
// formData?: Record<string, any>;
// }) => {
// if (params.nodeIndex !== undefined) {
// currentMultiFormIndex.value = params.nodeIndex;
// } else {
// currentMultiFormIndex.value = activeTab.value - 1;
// }
// if (params.title) {
// drawerTitle.value = params.title;
// } else {
// const currentNode = workflowNodes.value[currentMultiFormIndex.value];
// drawerTitle.value = currentNode ? `${currentNode.name} - 历史表单查看` : '表单处理';
// }
// if (params.procDefId) {
// currentProcDefId.value = params.procDefId;
// } else if (workflowNodes.value[currentMultiFormIndex.value]) {
// currentProcDefId.value = workflowNodes.value[currentMultiFormIndex.value].procDefId || '';
// }
// if (params.formData) {
// externalFormData.value = params.formData;
// } else {
// externalFormData.value = {};
// }
// drawerVisible.value = true;
// };
const handleMultiFormSubmit = async (submitData: {
nodeId: string;nodeName: string;formData: any;procDefId: string;
}) => {
......@@ -268,6 +241,7 @@ import { CONNREFUSED } from 'dns';
};
const handleMultiFormDataUpdate = (data: any) => {
//alert(JSON.stringify(data))
console.log('多表单数据更新:', data);
// 可以在这里实时保存数据到本地
};
......@@ -276,7 +250,8 @@ import { CONNREFUSED } from 'dns';
function handlSendSuccess(dataId: any) {
const currentFormComponent = getCurrentFormComponent();
if (currentFormComponent && typeof currentFormComponent.handleUpdate === 'function') {
currentFormComponent.handleUpdate(dataId);
const nextNode = workflowNodes.value[currentMultiFormIndex.value+1];
currentFormComponent.handleUpdate(dataId,nextNode);
} else {
console.warn('当前组件实例不存在或没有 handleUpdate 方法');
}
......@@ -286,6 +261,17 @@ import { CONNREFUSED } from 'dns';
console.error('任务处理失败:', error)
}
async function handlApprovalFail (dataId: any) {
const currentFormComponent = getCurrentFormComponent();
if (currentFormComponent && typeof currentFormComponent.handleUpdate === 'function') {
const beforeNode = workflowNodes.value[currentMultiFormIndex.value-1];
alert(JSON.stringify(beforeNode))
await currentFormComponent.handleUpdate(dataId,beforeNode);
} else {
console.warn('当前组件实例不存在或没有 handleUpdate 方法');
}
}
async function handleOpenMultiForm(data: any) {
......
......@@ -81,18 +81,21 @@
label: '计划审核',
onClick: handlePlanApproval.bind(null, record),
},
{
label: '提交',
onClick: handleSendNext.bind(null, record),
},
// {
// label: '提交',
// onClick: handleSendNext.bind(null, record),
// },
];
}
async function handleUpdate(dataId) {
await saveOrUpdate({
bmpNodeId: props.nextFlowNode.id,
id:dataId,
},true).then(res => {
async function handleUpdate(dataId,flowNode) {
let record = {
bmpNodeId: flowNode.id,
deployId: flowNode.deployId,
bpmStatus: 2,
id:dataId
}
await saveOrUpdate(record,true).then(res => {
handleSuccess();
})
}
......
......@@ -86,10 +86,10 @@
];
}
async function handleUpdate(dataId) {
async function handleUpdate(dataId,flowNode) {
let record = {
bmpNodeId: props.nextFlowNode.id,
deployId: props.nextFlowNode.deployId,
bmpNodeId: flowNode.id,
deployId: flowNode.deployId,
bpmStatus: 2,
id:dataId
}
......@@ -103,7 +103,6 @@
})
</script>
<style scoped></style>
......@@ -118,10 +118,8 @@
initFormData(props.dataId);
const setFormDisabledStatus = (isEdit: boolean) => {
if (props.disabled === false) {
return false;
}
return true;
setProps({ disabled: isEdit });
return isEdit
};
return {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论