提交 e9d3668a authored 作者: liuluyu's avatar liuluyu

优化计划管理字段

上级 04a473ce
......@@ -4,7 +4,7 @@
@register="register"
:centered="true"
title="驳回"
destroyOnClose
destroyOnClose
width="50%"
@cancel="handleCancel"
:helpMessage="['帮助']"
......@@ -14,107 +14,103 @@
</BasicModal>
</template>
<script lang="ts" setup>
import { ref, reactive,nextTick } from 'vue'
import { useForm, BasicForm, FormSchema } from '/@/components/Form'
import { BasicModal, useModalInner } from '/@/components/Modal'
import { rejectTask, getNextFlowNode} from "/@/components/Process/api/todo"
import { ref, reactive, nextTick } from 'vue';
import { useForm, BasicForm, FormSchema } from '/@/components/Form';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { rejectTask, getNextFlowNode } from '/@/components/Process/api/todo';
const checkSendUser = ref()
const checkType = ref()
const checkSendRole = ref()
const multiInstanceVars = ref()
const checkSendUser = ref();
const checkType = ref();
const checkSendRole = ref();
const multiInstanceVars = ref();
const flowTodoTask = ref({})
const flowTodoTask = ref({});
const onSuccess = ref();
const [register, { closeModal, setModalProps }] = useModalInner(async (data) => {
const params = { taskId: data.data.taskId }
flowTodoTask.value = data.data
//alert(JSON.stringify(flowTodoTask.value))
//alert(JSON.stringify(data))
await setNextNode(params)
const params = { taskId: data.data.taskId };
flowTodoTask.value = data.data;
// 保存传入的onSuccess回调
onSuccess.value = data.onSuccess;
await setNextNode(params);
});
const formSchemas: FormSchema[] = [
{
label: '驳回原因',
field: 'comment',
component:'InputTextArea',
required:true,
componentProps:{
component: 'InputTextArea',
required: true,
componentProps: {
allowClear: true,
showCount: true,
autoSize:{
autoSize: {
minRows: 6,
maxRows: 10
maxRows: 10,
},
}
}
},
},
];
const [registerForm, { setProps, validate }] = useForm({
schemas: formSchemas,
showActionButtonGroup: false,
});
const handleCancel = ()=> {
const handleCancel = () => {
closeModal();
}
};
const handleSetModalProps = ()=> {
const handleSetModalProps = () => {
setModalProps({
title:"流程审批"
})
}
title: '流程审批',
});
};
const setNextNode = async (params) => {
getNextFlowNode(params).then((res) => {
if(res==null) {
if (res == null) {
closeModal();
}
const data = res.data
const data = res.data;
if (data) {
if (data.dataType === 'dynamic') {
if (data.type === 'assignee') {
// 指定人员
checkSendUser.value = true
checkType.value = 'single'
checkSendUser.value = true;
checkType.value = 'single';
} else if (data.type === 'candidateUsers') {
// 候选人员(多个)
checkSendUser.value = true
checkType.value = 'multiple'
checkSendUser.value = true;
checkType.value = 'multiple';
} else if (data.type === 'candidateGroups') {
// 指定组(所属角色接收任务)
checkSendRole.value = true
checkSendRole.value = true;
} else {
// 会签
// 流程设计指定的 elementVariable 作为会签人员列表
multiInstanceVars.value = data.vars
checkSendUser.value = true
checkType.value = 'multiple'
multiInstanceVars.value = data.vars;
checkSendUser.value = true;
checkType.value = 'multiple';
}
}
}
})
}
});
};
const saveReject = async () => {
const formDataTmp = await validate();
formDataTmp['procInsId'] = flowTodoTask.value.procInsId;
formDataTmp['deployId'] = flowTodoTask.value.deployId;
formDataTmp['taskId'] = flowTodoTask.value.taskId;
const formDataTmp = await validate();
// alert(flowTodoTask.value.procInsId)
formDataTmp["procInsId"] = flowTodoTask.value.procInsId
formDataTmp["deployId"] = flowTodoTask.value.deployId
formDataTmp["taskId"] = flowTodoTask.value.taskId
await rejectTask(formDataTmp).then(res => {
closeModal()
});
}
await rejectTask(formDataTmp).then((res) => {
closeModal();
// 调用传入的onSuccess回调
if (onSuccess.value) {
onSuccess.value();
}
});
};
</script>
<style scoped>
</style>
<style scoped></style>
......@@ -14,19 +14,15 @@
<div class="action-header">
<div class="action-left">
<a-space>
<a-button type="primary" size="large" @click="handleSendTask" :loading="sending" class="action-btn">
<template #icon><SendOutlined /></template>
发送
</a-button>
<a-button type="danger" size="large" @click="handleReject" :loading="rejecting" class="action-btn">
<a-button type="primary" @click="handleReject" :loading="rejecting">
<template #icon><CloseCircleOutlined /></template>
驳回
</a-button>
<a-button type="danger" size="large" @click="handleAssignTask" :loading="assigning" class="action-btn">
<a-button type="primary" @click="handleAssignTask" :loading="assigning">
<template #icon><CloseCircleOutlined /></template>
转办
</a-button>
<a-button type="danger" size="large" @click="handleAssignReadTask" :loading="assiReadgning" class="action-btn">
<a-button type="primary" @click="handleAssignReadTask" :loading="assiReadgning">
<template #icon><CloseCircleOutlined /></template>
转阅
</a-button>
......@@ -76,17 +72,12 @@
<!-- 右侧审批栏 -->
<div class="sidebar-section" v-if="showApprovalUi">
<a-card :title="approvalTitle" :bordered="false" class="approval-card">
<BasicForm @register="registerForm" style="width: 100%s" />
<!-- <div class="form-tips" v-if="isApproval">
<a-alert
message="提示"
description="请认真填写审批意见,审批完成后将无法修改"
type="info"
show-icon
class="tips-alert"
/>
</div> -->
<BasicForm @register="registerForm" style="width: 100%" />
<div class="form-footer">
<a-space :size="12">
<a-button @click="handleSendTask" type="primary">提交</a-button>
</a-space>
</div>
</a-card>
</div>
</div>
......@@ -201,7 +192,7 @@
</template>
<script lang="ts" setup>
import { ref, reactive, nextTick, computed } from 'vue';
import { ref, reactive, nextTick, computed, watch } from 'vue';
import { message } from 'ant-design-vue';
import {
UserOutlined,
......@@ -258,7 +249,6 @@
const res0 = ref();
const res1 = ref();
const res3 = ref();
const taskForm = reactive({
returnTaskShow: false,
......@@ -300,6 +290,34 @@
return nextNode.value?.type || '';
});
// // 3. 监听依赖项变化,动态更新 label、ifShow 和 componentProps
// watch(
// [isApproval, userType],
// async () => {
// const isApp = isApproval.value;
// const isNotRole = userType.value !== 'role';
// // 等待 DOM 更新完成后再执行更新
// await nextTick();
// updateSchema({
// field: 'checkSendUser',
// label: isApp ? '接收人' : '审批人',
// ifShow: isNotRole,
// componentProps: {
// allowClear: true,
// rowKey: 'id',
// labelKey: 'realname',
// showButton: false,
// mode: 'multiple',
// modalTitle: isApp ? '选择接收人' : '选择审批人',
// placeholder: isApp ? '请选择接收人' : '请选择审批人',
// },
// });
// },
// { immediate: true }
// ); // immediate: true 保证初始状态也能正确配置
// 表单配置
const formSchemas = [
{
......@@ -326,8 +344,7 @@
label: '接收人',
field: 'checkSendUser',
component: 'JSelectUser',
required: false,
ifShow: computed(() => userType.value !== 'role'),
required: true,
componentProps: {
allowClear: true,
rowKey: 'id',
......@@ -337,7 +354,40 @@
placeholder: '请选择接收人',
mode: 'multiple',
},
rules: [{ required: true, message: '请选择接收人' }],
},
// {
// label: '用户',
// field: 'checkSendUser',
// component: 'JSelectUser',
// rules: [
// {
// required: true,
// validator: async (_rule, value) => {
// if (!value || value.length === 0) {
// // 在这里动态获取提示文本
// const errorMsg = isApproval.value ? '请选择接收人' : '请选择审批人';
// throw new Error(errorMsg);
// }
// return Promise.resolve();
// },
// trigger: 'change', // 触发时机:change 或 blur
// },
// ],
// },
{
label: '抄送人',
field: 'copyUser',
component: 'JSelectUser',
required: false,
componentProps: {
allowClear: true,
rowKey: 'id',
labelKey: 'realname',
showButton: false,
modalTitle: '选择抄送人',
placeholder: '请选择抄送人',
mode: 'multiple',
},
},
{
label: '接收角色',
......@@ -357,17 +407,20 @@
},
];
const [registerForm, { validate, setFieldsValue, removeSchemaByFiled, resetFields }] = useForm({
const [registerForm, { validate, setFieldsValue, removeSchemaByFiled, resetFields, updateSchema }] = useForm({
schemas: formSchemas as any,
showActionButtonGroup: false,
baseColProps: { span: 24 },
labelWidth: 100,
layout: 'vertical',
autoSubmitOnEnter: false,
//不显示重置按钮
showResetButton: false,
//自定义提交按钮文本和图标
submitButtonOptions: { text: '提交', preIcon: '' },
});
const emit = defineEmits(['callback', 'success', 'error']);
// 方法
const handleTabClick = async (key: string) => {
if (key === '1' && !formLoading.value) {
......@@ -536,16 +589,14 @@
submitData.values['userTaskid'] = nextNodeNameSelevue.value;
}
if (!showApprovalUi.value) {
const result =await complete(submitData);
const result = await complete(submitData);
message.success('任务结束成功');
emit('success', result);
emit('callback');
return false;
}
const formData = await validate();
Object.assign(submitData, formData);
......@@ -566,9 +617,6 @@
submitData.values['approval'] = formData.checkSendRole;
submitData.values['approvalType'] = 'role';
}
// }
console.log("-----------submitData ",submitData);
// 执行发送
const result = await complete(submitData);
......@@ -579,7 +627,6 @@
if (error.errorFields) {
message.error('请完善表单信息');
} else {
console.error('发送任务失败:', error);
message.error(error.message || '发送任务失败');
}
} finally {
......@@ -592,6 +639,7 @@
isUpdate: false,
data: workFlowData.value,
onSuccess: () => {
message.error('任务已驳回');
emit('callback');
},
});
......@@ -661,10 +709,10 @@
isApproval.value = data.nodeisApprove;
if (!isApproval.value) {
approvalTitle.value = '选择接收人';
approvalTitle.value = '选择人员';
removeSchemaByFiled('comment');
} else {
approvalTitle.value = '填写审批意见和接收人';
approvalTitle.value = '填写意见';
}
if (taskForm.taskId) {
......@@ -928,16 +976,6 @@
flex: 1;
}
.action-btn {
height: 40px;
padding: 0 24px;
font-weight: 500;
:deep(.anticon) {
font-size: 16px;
}
}
.action-right {
.next-node-info {
display: flex;
......
......@@ -53,20 +53,6 @@ export const columns: BasicColumn[] = [
width: 120,
ellipsis: true,
},
{
title: '执行部门',
align: 'center',
dataIndex: 'execDepName',
width: 140,
ellipsis: true,
},
{
title: '负责人',
align: 'center',
dataIndex: 'headName',
width: 100,
ellipsis: true,
},
{
title: '优先级',
align: 'center',
......@@ -117,13 +103,6 @@ export const columns: BasicColumn[] = [
return !text ? '-' : text.length > 10 ? text.substr(0, 10) : text;
},
},
{
title: '计划状态',
align: 'center',
dataIndex: 'statusName',
width: 100,
ellipsis: true,
},
{
title: '流程状态',
align: 'center',
......@@ -161,16 +140,6 @@ export const searchFormSchema: FormSchema[] = [
placeholder: '请选择类型',
},
},
{
label: '执行部门',
field: 'execDepCode',
component: 'Select',
colProps: { span: 6 },
componentProps: {
allowClear: true,
placeholder: '请选择执行部门',
},
},
{
label: '计划状态',
field: 'status',
......@@ -241,26 +210,6 @@ export const formSchema: FormSchema[] = [
return [{ required: true, message: '请选择计划类型!' }];
},
},
{
label: '执行部门',
field: 'execDepCode',
component: 'JSelectDept',
colProps: { lg: 12 },
itemProps: { labelCol: { xs: { span: 24 }, sm: { span: 6 } }, wrapperCol: { xs: { span: 24 }, sm: { span: 18 } } },
dynamicRules: ({ model, schema }) => {
return [{ required: false, message: '请选择执行部门!' }];
},
},
{
label: '负责人',
field: 'headId',
component: 'JSearchSelectDuty',
colProps: { lg: 12 },
itemProps: { labelCol: { xs: { span: 24 }, sm: { span: 6 } }, wrapperCol: { xs: { span: 24 }, sm: { span: 18 } } },
dynamicRules: ({ model, schema }) => {
return [{ required: false, message: '请选择负责人!' }];
},
},
{
label: '计划开始日期',
field: 'planStartDate',
......
<template>
<div class="plan-management-page">
<!-- 页面头部区域 -->
<!-- <div class="page-header">
<div class="header-content">
<div class="header-left">
<h1 class="page-title">计划编制管理</h1>
<p class="page-desc">统一管理和追踪所有业务计划的编制与审批流程</p>
</div>
<div class="header-stats">
<div class="stat-item">
<span class="stat-value">--</span>
<span class="stat-label">计划总数</span>
</div>
<div class="stat-item warning">
<span class="stat-value">--</span>
<span class="stat-label">待处理</span>
</div>
<div class="stat-item success">
<span class="stat-value">--</span>
<span class="stat-label">已完成</span>
</div>
</div>
</div>
</div> -->
<!-- 主内容区 -->
<div class="main-content">
<!-- 搜索区域 -->
......@@ -44,11 +20,6 @@
</a-form-item>
</a-col>
<a-col :xl="5" :lg="8" :md="12" :sm="24">
<a-form-item label="执行部门">
<JSelectDept placeholder="请选择执行部门" v-model:value="queryParam['execDepCode']" />
</a-form-item>
</a-col>
<a-col :xl="4" :lg="8" :md="12" :sm="24">
<a-form-item label="计划状态">
<a-select
v-model:value="queryParam['status']"
......@@ -408,7 +379,7 @@
if (needStartFlow && record.deployId) {
try {
const formData = { dataId, dataName: 'id',tasktitle:record.projectName };
const formData = { dataId, dataName: 'id', tasktitle: record.projectName };
const startResRaw = await definitionStartByDeployId(record.deployId, formData);
const startRes = pickStartResult(startResRaw);
......@@ -545,8 +516,8 @@
{
label: '待办',
ifShow: () => {
console.log("-------------record['uid'] ",record['uid']);
console.log("-------------userStore.getUserInfo.id ",userStore.getUserInfo.id);
console.log("-------------record['uid'] ", record['uid']);
console.log('-------------userStore.getUserInfo.id ', userStore.getUserInfo.id);
if (record['bpmStatus'] == '2' && record['uid'] == userStore.getUserInfo.id) return true;
else return false;
},
......
......@@ -36,19 +36,6 @@
</a-form-item>
</a-col>
</a-row>
<!-- 第二行:执行部门 + 负责人 -->
<a-row :gutter="16">
<a-col :span="12">
<a-form-item label="执行部门" name="execDepCode" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
<JSelectDept v-model:value="formModel.execDepCode" placeholder="请选择执行部门" :disabled="isDetail" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="负责人" name="headId" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
<JSearchSelectDuty v-model:value="formModel.headId" placeholder="请选择负责人" :disabled="isDetail" />
</a-form-item>
</a-col>
</a-row>
<!-- 第三行:开始日期 + 结束日期 -->
<a-row :gutter="16">
<a-col :span="12">
......@@ -256,17 +243,11 @@
const formModel = reactive({
projectName: '',
projectType: '',
execDepCode: '',
execDepName: '',
headId: '',
headName: '',
priority: '2',
planRequest: '',
planDeliverable: '',
planStartDate: '',
planEndDate: '',
basisList: [],
executeType: '',
projectDesc: '',
fileUploadPath: '',
planBasis: '',
......@@ -275,7 +256,6 @@
exePeriod: undefined,
firstExecDate: '',
completionRate: 0,
statusName: '',
id: '',
});
......@@ -283,17 +263,11 @@
Object.assign(formModel, {
projectName: '',
projectType: '',
execDepCode: '',
execDepName: '',
headId: '',
headName: '',
priority: '2',
planRequest: '',
planDeliverable: '',
planStartDate: '',
planEndDate: '',
basisList: [],
executeType: '',
projectDesc: '',
fileUploadPath: '',
planBasis: '',
......@@ -302,7 +276,6 @@
exePeriod: undefined,
firstExecDate: '',
completionRate: 0,
statusName: '',
id: '',
});
};
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论