yxk-20260731

改善提案
删除流程功能:
为已发起且仍在处理中的改善提案增加“删除流程”操作。删除后终止当前 Flowable 实例、清理本轮流程数据,并将提案回退为草稿,允许重新编辑和发起。
Implementation Changes
后端新增 POST /improvementproposal/improvementProposal/withdrawProcess?id=...,复用现有 improvementproposal:improvement_proposal:delete 权限。
在 ImprovementProposalService 新增事务方法:锁定主表后,仅允许 bpm_status='2' 且存在运行中流程实例的提案撤回;流程已完成、已作废、草稿或实例不存在时拒绝操作。
参考党委会的流程清理方式,终止 Flowable 运行实例并删除该实例的历史、审批意见、抄送、流程中间数据和流程日志;不改动全局流程引擎代码。
删除本轮 improvement_dept_score、improvement_institute_vote 数据,避免重新发起后复用旧评分、投票结果。
将流程衍生字段清空:流程实例、初审/评分/负责人奖项、评分汇总、所级投票人数与结果、最终奖项、人工确认、归档人及归档时间;保留提案基本信息、编号和业务附件。
将主表 bpm_status 重置为 1,使现有编辑、删除和发起流程逻辑自动恢复可用。
前端台账操作菜单在处理中记录显示“删除流程”,增加明确提示“删除后将回退为草稿,当前评分、投票和审批数据将被清空”;成功后刷新列表。
不增加批量删除流程功能,现有批量删除仍只处理草稿。
This commit is contained in:
ye1023
2026-07-31 15:07:33 +08:00
parent a4a7bdf233
commit 4ee340a514
2 changed files with 26 additions and 1 deletions
@@ -17,6 +17,7 @@ enum Api {
improvementInstituteVoteList = '/improvementproposal/improvementProposal/queryImprovementInstituteVoteByMainId',
getLatestProposalSequence = '/improvementproposal/improvementProposal/getLatestProposalSequence',
startProcess = '/improvementproposal/improvementProposal/startProcess',
withdrawProcess = '/improvementproposal/improvementProposal/withdrawProcess',
bpmInitialReview = '/improvementproposal/improvementProposal/bpm/initialReview',
bpmMyDeptScore = '/improvementproposal/improvementProposal/bpm/myDeptScore',
bpmDeptScore = '/improvementproposal/improvementProposal/bpm/deptScore',
@@ -110,6 +111,9 @@ export const getLatestProposalSequence = (year) => defHttp.get({url: Api.getLate
/** 发起改善提案审批流程。 */
export const startProposalProcess = (id: string) => defHttp.post({ url: Api.startProcess, params: { id } });
/** 删除运行中的改善提案流程,并把业务单据回退为草稿。 */
export const withdrawProposalProcess = (id: string) => defHttp.post({ url: Api.withdrawProcess, params: { id } });
/** 流程节点专用接口会在任务提交前保存业务字段和网关变量。 */
export const saveInitialReview = (params) => defHttp.post({ url: Api.bpmInitialReview, params });
export const queryMyDeptScore = (params) => defHttp.get({ url: Api.bpmMyDeptScore, params });
@@ -94,7 +94,7 @@
import {useModal} from '/@/components/Modal';
import ImprovementProposalModal from './components/ImprovementProposalModal.vue'
import {columns, superQuerySchema} from './ImprovementProposal.data';
import {list, deleteOne, batchDelete, getImportUrl, getExportUrl, startProposalProcess} from './ImprovementProposal.api';
import {list, deleteOne, batchDelete, getImportUrl, getExportUrl, startProposalProcess, withdrawProposalProcess} from './ImprovementProposal.api';
import {downloadFile} from '/@/utils/common/renderUtils';
import JInput from "/@/components/Form/src/jeecg/components/JInput.vue";
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
@@ -229,6 +229,17 @@
auth: 'improvementproposal:improvement_proposal:delete'
});
}
if (isProcessing(record)) {
dropDownAction.push({
label: '删除流程',
popConfirm: {
title: '确认删除流程吗?删除后提案将回退为草稿,当前评分、投票和审批数据将被清空。',
confirm: handleWithdrawProcess.bind(null, record),
placement: 'topLeft',
},
auth: 'improvementproposal:improvement_proposal:delete'
});
}
dropDownAction.push(
{
label: '审批进度',
@@ -257,11 +268,21 @@
handleSuccess();
}
/** 仅撤回运行中的流程,成功后服务端会把提案恢复为草稿。 */
async function handleWithdrawProcess(record) {
await withdrawProposalProcess(record.id);
handleSuccess();
}
/** 只有未绑定流程实例的草稿可以继续维护或发起。 */
function isDraft(record) {
return String(record?.bpmStatus || '') === '1' && !record?.processInstanceId;
}
function isProcessing(record) {
return String(record?.bpmStatus || '') === '2' && !!record?.processInstanceId;
}
/**
* 审批进度
*/