From 37a23f156a8e1bc24f7175005aa0c94616f553d6 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Mon, 27 Jul 2026 15:06:40 +0800 Subject: [PATCH] =?UTF-8?q?yxk-20260727=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E9=87=8D=E6=9E=84=20ImprovementProposalBPMForm.vue?= =?UTF-8?q?=20=E4=B8=BA=E2=80=9C=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E2=80=9D=E5=92=8C=E2=80=9C=E6=B5=81=E7=A8=8B=E5=8A=9E=E7=90=86?= =?UTF-8?q?=E2=80=9D=E4=B8=A4=E4=B8=AA=E5=8C=BA=E5=9F=9F=E3=80=82=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E8=AF=86=E5=88=AB=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=20formData.taskDefKey=EF=BC=8C=E4=B8=8D=E9=80=9A=E8=BF=87=20PC?= =?UTF-8?q?=20=E8=A1=A8=E5=8D=95=20URL=20=E5=8F=82=E6=95=B0=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E8=8A=82=E7=82=B9=EF=BC=9BURL=20=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BB=85=E4=BF=9D=E7=95=99=E7=BB=99=E5=B0=86=E6=9D=A5=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E5=BC=80=E5=85=B3=E7=B1=BB=E9=9C=80=E6=B1=82=E3=80=82?= =?UTF-8?q?=20=E5=A5=96=E9=A1=B9=E5=AD=97=E6=AE=B5=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=8C=89=20=E9=87=91=E5=A5=96=3D0=E3=80=81=E9=93=B6=E5=A5=96?= =?UTF-8?q?=3D1=E3=80=81=E9=93=9C=E5=A5=96=3D2=E3=80=81=E5=8F=82=E4=B8=8E?= =?UTF-8?q?=E5=A5=96=3D3=20=E5=AD=98=E5=82=A8=EF=BC=8C=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E4=B8=AD=E6=96=87=E3=80=82need=5Fdept=5Fscor?= =?UTF-8?q?e=E3=80=81isneedvote=20=E5=9D=87=E4=BD=BF=E7=94=A8=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=201/0=E3=80=82=20Key=20Changes=20=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF=E5=8C=BA=E5=9F=9F=E5=9C=A8=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=B5=81=E7=A8=8B=E8=8A=82=E7=82=B9=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=8F=AA=E8=AF=BB?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=B1=95=E7=A4=BA=E6=8F=90=E6=A1=88=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E5=AD=97=E6=AE=B5=E3=80=81=E6=94=B9=E5=96=84=E5=89=8D?= =?UTF-8?q?=E5=90=8E=E8=AF=B4=E6=98=8E=E5=8F=8A=E4=B8=89=E4=B8=AA=E9=99=84?= =?UTF-8?q?=E4=BB=B6=E5=88=86=E7=BB=84=EF=BC=9B=E4=B8=8D=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=BC=8F=E7=BC=96=E8=BE=91=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E4=B9=9F=E4=B8=8D=E5=85=81=E8=AE=B8=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=E5=8A=9E=E7=90=86=E4=BA=BA=E4=BF=AE=E6=94=B9=E7=94=B3=E8=AF=B7?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 流程办理区域仅在运行中的待办显示:formBpm=true、PROCESS_TAB_TYPE='run' 且存在 taskId。提取统一 processInfo,包含 taskId、taskDefKey、processInstanceId、mainId。 继续使用 TaskHandleInnerContent 的 beforeHandle 钩子;按当前 taskDefKey 完成节点专属数据校验、保存和流程变量写入后,再调用通用提交办理。 Task_improve001: 提供初步评定奖项 initial_award 必填选择。 金奖、银奖自动保存 need_dept_score='1';铜奖、参与奖保存 '0'。 后端在同一节点保存接口中更新主表,并通过 Flowable runtimeService.setVariable 写入全局流程变量 need_dept_score。 BPMN 排他网关配置:${need_dept_score == '1'} 流向 Task_improve002,${need_dept_score == '0'} 流向 Task_improve003。 Task_improve002: 展示部门评分记录及“打分”入口,入口按当前登录评委定位其 improvement_dept_score 记录。 本轮仅建立评分弹窗/页面入口和子表查询展示;四维度录入、加权计算、全部评委完成校验、平均分和建议奖项计算留待下一轮实现。 Task_improve003: 只读展示初步奖项;存在评分结果时展示 dept_avg_score、suggested_award。 部门负责人必选 leader_final_award;金奖写入 isneedvote='1',其他奖项写入 '0',并同步为全局流程变量。 BPMN 排他网关配置:${isneedvote == '1'} 流向 Task_improve004,${isneedvote == '0'} 流向 Task_improve006。 Task_improve004: 本轮预留“所级评议人员”办理区域和投票名单展示,不开发专用选人组件及投票记录初始化。 后续选人功能负责创建每位评委一条 improvement_institute_vote 待投票记录,并设置 institute_total_voters;流程需同时配置所级投票任务的多实例人员集合。 Task_improve005: 提供“同意”“不同意”操作,按当前登录用户更新其已有的待投票记录,写入 vote_result、vote_status='voted'、vote_time 与当前 process_task_id。 不信任前端传入的投票人 ID;后端以登录用户定位记录,并禁止非名单人员、重复投票或已完成记录再次修改。 提交办理前校验当前评委已投票。投票统计和三分之二结果计算留待选人及多实例规则完成后统一实现。 Task_improve006: 展示部门负责人确认奖项;如经过所级投票,同时展示投票统计和投票结果。 经办人必须选择 final_award。若金奖所级投票未通过,同时将 manual_confirm_result 固定保存为 confirmed,表示已由经办人手动确认最终奖项。 后端新增流程节点专用 DTO 与接口,分别处理初审奖项、负责人奖项、归档最终奖项和个人投票;接口校验主表、流程实例、活动任务定义键及当前办理人,避免通过普通 /edit 篡改流程数据。 不使用生成代码的 updateMain 保存流程数据,避免删除并重建评分、投票子表,也避免草稿状态校验阻断流程办理。 补齐数据库定义:在 improvement_proposal 增加 isneedvote char(1),同步建表 SQL、数据库 Markdown 与实体注释;将 need_dept_score 的说明统一改为 1/0。为已建库环境提供单独的增量 ALTER TABLE 脚本。 --- .../ImprovementProposal.api.ts | 10 + .../components/ImprovementProposalBPMForm.vue | 383 +++++++++++++++--- 2 files changed, 340 insertions(+), 53 deletions(-) diff --git a/src/views/gh/improvementProposal/ImprovementProposal.api.ts b/src/views/gh/improvementProposal/ImprovementProposal.api.ts index 83e937b..42df4f7 100644 --- a/src/views/gh/improvementProposal/ImprovementProposal.api.ts +++ b/src/views/gh/improvementProposal/ImprovementProposal.api.ts @@ -15,6 +15,10 @@ enum Api { improvementDeptScoreList = '/improvementproposal/improvementProposal/queryImprovementDeptScoreByMainId', improvementInstituteVoteList = '/improvementproposal/improvementProposal/queryImprovementInstituteVoteByMainId', startProcess = '/improvementproposal/improvementProposal/startProcess', + bpmInitialReview = '/improvementproposal/improvementProposal/bpm/initialReview', + bpmLeaderAward = '/improvementproposal/improvementProposal/bpm/leaderAward', + bpmArchiveAward = '/improvementproposal/improvementProposal/bpm/archiveAward', + bpmInstituteVote = '/improvementproposal/improvementProposal/bpm/instituteVote', } /** * 导出api @@ -88,3 +92,9 @@ export const queryDataById = (id) => defHttp.get({url: Api.queryDataById, params /** 发起改善提案审批流程。 */ export const startProposalProcess = (id: string) => defHttp.post({ url: Api.startProcess, params: { id } }); + +/** 流程节点专用接口会在任务提交前保存业务字段和网关变量。 */ +export const saveInitialReview = (params) => defHttp.post({ url: Api.bpmInitialReview, params }); +export const saveLeaderAward = (params) => defHttp.post({ url: Api.bpmLeaderAward, params }); +export const saveArchiveAward = (params) => defHttp.post({ url: Api.bpmArchiveAward, params }); +export const castInstituteVote = (params) => defHttp.post({ url: Api.bpmInstituteVote, params }); diff --git a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue index 512bf23..47f06e6 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -1,76 +1,316 @@ - + + 基本信息 + + {{ proposal.proposalNo || '-' }} {{ proposal.proposalName || '-' }} - {{ proposal.proposalDate || '-' }} + {{ formatDate(proposal.proposalDate) }} {{ proposal.proposalCategory || '-' }} {{ proposal.proposalDeptName || '-' }} {{ proposal.applicantName || '-' }} - {{ proposal.teamName || '-' }} - {{ proposal.finalAward || '-' }} + {{ proposal.teamName || '-' }} {{ proposal.problemDesc || '-' }} {{ proposal.improvementMethod || '-' }} - {{ proposal.beforeDesc || '-' }} - {{ proposal.afterDesc || '-' }} + {{ proposal.beforeDesc || '-' }} + {{ proposal.afterDesc || '-' }} {{ proposal.improvementEffect || '-' }} + + + + 改善前附件 + + + + 改善后附件 + + + + 其他附件 + + + + - + - - + + + + 流程办理 + + + + + + {{ item.label }} + + 金奖、银奖进入部门评议小组打分;铜奖、参与奖直接进入部门负责人审核。 + + + + + + + {{ record.scoreStatus === 'completed' ? '已评分' : '待评分' }} + + + + + 打分 + 当前用户不在部门评分名单中。 + + + + + {{ awardLabel(proposal.initialAward) }} + + 平均分:{{ proposal.deptAvgScore ?? '-' }};系统建议奖项:{{ awardLabel(proposal.suggestedAward) }} + + + + {{ item.label }} + + + + + + + + 所级评议人员选择和投票记录初始化将在后续功能中接入。 + + + + + + + 同意 + 不同意 + {{ voteResultLabel(currentVote) }} + + 当前用户不在所级评议投票名单中。 + + + + + {{ awardLabel(proposal.leaderFinalAward) }} + + 同意票:{{ proposal.instituteAgreeCount ?? '-' }};不同意票:{{ proposal.instituteDisagreeCount ?? '-' }};结果:{{ proposal.instituteVoteResult || '-' }} + + + + {{ item.label }} + + + + + + + + + + + {{ currentScore.scorerName || '-' }} + {{ currentScore.scoreStatus === 'completed' ? '已评分' : '待评分' }} + + 四个评分维度录入、加权计算和评分提交将在下一阶段开发。 + -