diff --git a/src/views/gh/improvementProposal/ImprovementProposal.api.ts b/src/views/gh/improvementProposal/ImprovementProposal.api.ts index ec5401f..2b355c5 100644 --- a/src/views/gh/improvementProposal/ImprovementProposal.api.ts +++ b/src/views/gh/improvementProposal/ImprovementProposal.api.ts @@ -21,6 +21,8 @@ enum Api { bpmDeptScore = '/improvementproposal/improvementProposal/bpm/deptScore', bpmSubmitDeptScore = '/improvementproposal/improvementProposal/bpm/submitDeptScore', bpmLeaderAward = '/improvementproposal/improvementProposal/bpm/leaderAward', + bpmInstituteVoteCandidates = '/improvementproposal/improvementProposal/bpm/instituteVoteCandidates', + bpmInstituteVoteMembers = '/improvementproposal/improvementProposal/bpm/instituteVoteMembers', bpmArchiveAward = '/improvementproposal/improvementProposal/bpm/archiveAward', bpmInstituteVote = '/improvementproposal/improvementProposal/bpm/instituteVote', } @@ -109,5 +111,7 @@ export const queryMyDeptScore = (params) => defHttp.get({ url: Api.bpmMyDeptScor export const saveDeptScore = (params) => defHttp.post({ url: Api.bpmDeptScore, params }); export const submitDeptScore = (params) => defHttp.post({ url: Api.bpmSubmitDeptScore, params }); export const saveLeaderAward = (params) => defHttp.post({ url: Api.bpmLeaderAward, params }); +export const queryInstituteVoteCandidates = (params) => defHttp.get({ url: Api.bpmInstituteVoteCandidates, params }); +export const saveInstituteVoteMembers = (params) => defHttp.post({ url: Api.bpmInstituteVoteMembers, 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 e546079..fd7c67e 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -72,9 +72,16 @@ @@ -173,11 +180,13 @@ import { castInstituteVote, queryDataById, + queryInstituteVoteCandidates, queryImprovementInstituteVoteListByMainId, queryMyDeptScore, saveArchiveAward, saveDeptScore, saveInitialReview, + saveInstituteVoteMembers, saveLeaderAward, submitDeptScore, } from '../ImprovementProposal.api'; @@ -197,6 +206,8 @@ const proposal = ref({}); const currentScore = ref(null); const voteRows = ref([]); + const instituteVoteCandidates = ref([]); + const selectedInstituteVoterIds = ref([]); const initialAward = ref(''); const leaderFinalAward = ref(''); const finalAward = ref(''); @@ -210,11 +221,6 @@ { value: '2', label: '铜奖' }, { value: '3', label: '参与奖' }, ]; - const voteMemberColumns = [ - { title: '评委', dataIndex: 'voterName', width: 180 }, - { title: '状态', dataIndex: 'voteStatus', width: 120 }, - ]; - // 流程引擎在运行待办中提供 taskDefKey,节点功能只依赖该稳定标识而非表单 URL 参数。 const processInfo = computed(() => ({ mainId: props.formData?.processDataId || props.formData?.dataId, @@ -263,6 +269,8 @@ proposal.value = {}; currentScore.value = null; voteRows.value = []; + instituteVoteCandidates.value = []; + selectedInstituteVoterIds.value = []; return; } loading.value = true; @@ -280,6 +288,17 @@ initialAward.value = proposal.value.initialAward || ''; leaderFinalAward.value = proposal.value.leaderFinalAward || ''; finalAward.value = proposal.value.finalAward || ''; + if (isTask('Task_improve004') && processInfo.value.processInstanceId && processInfo.value.taskId) { + instituteVoteCandidates.value = await queryInstituteVoteCandidates(processInfo.value); + const candidateIds = new Set(instituteVoteCandidates.value.map((item) => String(item.id))); + // 流程提交失败后重新打开 Task4 时,回显本次尚未流转的有效名单。 + selectedInstituteVoterIds.value = voteRows.value + .map((item) => String(item.voterId)) + .filter((voterId) => candidateIds.has(voterId)); + } else { + instituteVoteCandidates.value = []; + selectedInstituteVoterIds.value = []; + } } catch (error) { createMessage.warning('提案数据加载失败'); } finally { @@ -323,6 +342,13 @@ } await saveLeaderAward(actionPayload({ leaderFinalAward: leaderFinalAward.value })); } + if (isTask('Task_improve004')) { + if (!selectedInstituteVoterIds.value.length) { + createMessage.warning('请至少选择一名所级评议人员'); + return false; + } + await saveInstituteVoteMembers(actionPayload({ voterIds: selectedInstituteVoterIds.value })); + } if (isTask('Task_improve005') && currentVote.value?.voteStatus !== 'voted') { createMessage.warning('请先完成投票'); return false; @@ -477,6 +503,36 @@ margin-bottom: 16px; } + .vote-member-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 10px 12px; + width: 100%; + } + + .vote-member-option { + display: flex; + align-items: center; + min-height: 42px; + margin-inline-start: 0; + padding: 8px 10px; + border: 1px solid #d9e2ec; + border-radius: 4px; + background: #fff; + } + + .vote-member-name { + margin-left: 6px; + color: #1f2937; + font-weight: 500; + } + + .vote-member-username { + margin-left: 6px; + color: #64748b; + font-size: 12px; + } + @media (max-width: 768px) { .attachment-grid { grid-template-columns: 1fr;