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

优化计划管理字段

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