From 84b6debdcb2e6fef5b3d04418ad832ad449f33d5 Mon Sep 17 00:00:00 2001 From: wsm <2746563060@qq.com> Date: Tue, 28 Jul 2026 10:03:14 +0800 Subject: [PATCH 1/8] =?UTF-8?q?style(bg):=20=E9=80=82=E9=85=8D=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E6=A0=8F=E5=B8=83=E5=B1=80=E5=88=B01920x1080=E5=B1=8F?= =?UTF-8?q?=E5=B9=95=EF=BC=8C=E4=BF=AE=E5=A4=8Dlabel=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=8D=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BgPartymatterList: 添加 :xl="4" 列断点,labelCol xxl:4→xxl:8 - BgTakepulseList: 添加 :xl="4" 列断点,部门列 :xl="5",labelCol xxl:4→xxl:8 - BgXiSpeakList: 添加 :xl="4" 列断点,牵头部门 :xl="6",labelCol xxl:8→xxl:14 - DqInspectTaskList: 添加 :xl="4" 列断点,labelCol xxl:4→xxl:9 Co-Authored-By: Claude Opus 4.7 --- src/views/bg/bgpartymatter/BgPartymatterList.vue | 14 +++++++------- src/views/bg/bqtakepulse/BgTakepulseList.vue | 12 ++++++------ src/views/bg/xispeak/BgXiSpeakList.vue | 14 +++++++------- src/views/dq/inspectTask/DqInspectTaskList.vue | 12 ++++++------ 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/views/bg/bgpartymatter/BgPartymatterList.vue b/src/views/bg/bgpartymatter/BgPartymatterList.vue index 22e4487..2feb03f 100644 --- a/src/views/bg/bgpartymatter/BgPartymatterList.vue +++ b/src/views/bg/bgpartymatter/BgPartymatterList.vue @@ -4,27 +4,27 @@
- + - + - + - + - + - + 查询 重置 @@ -707,7 +707,7 @@ xs:24, sm:4, xl:6, - xxl:4 + xxl:8 }); const wrapperCol = reactive({ xs: 24, diff --git a/src/views/bg/bqtakepulse/BgTakepulseList.vue b/src/views/bg/bqtakepulse/BgTakepulseList.vue index 7ef4dc6..a0ce3a4 100644 --- a/src/views/bg/bqtakepulse/BgTakepulseList.vue +++ b/src/views/bg/bqtakepulse/BgTakepulseList.vue @@ -4,27 +4,27 @@
- + - + - + - + - + 查询 重置 @@ -631,7 +631,7 @@ xs:24, sm:4, xl:6, - xxl:4 + xxl:8 }); const wrapperCol = reactive({ xs: 24, diff --git a/src/views/bg/xispeak/BgXiSpeakList.vue b/src/views/bg/xispeak/BgXiSpeakList.vue index 1340f16..628fa93 100644 --- a/src/views/bg/xispeak/BgXiSpeakList.vue +++ b/src/views/bg/xispeak/BgXiSpeakList.vue @@ -4,17 +4,17 @@
- + - + - + @@ -24,7 +24,7 @@ - + 未开始 @@ -33,7 +33,7 @@ - + 查询 重置 @@ -229,13 +229,13 @@ import { PARTY_COMMITTEE_DEPT_ID, SDW_LEADER_ROLE_ID } from '/@/constant/supervi xs: 24, sm: 8, xl: 10, - xxl: 8, + xxl: 14, }); const wrapperCol = reactive({ xs: 24, sm: 16, xl: 14, - xxl: 16, + xxl: 10, }); // 高级查询配置 diff --git a/src/views/dq/inspectTask/DqInspectTaskList.vue b/src/views/dq/inspectTask/DqInspectTaskList.vue index c25b1fb..713adc6 100644 --- a/src/views/dq/inspectTask/DqInspectTaskList.vue +++ b/src/views/dq/inspectTask/DqInspectTaskList.vue @@ -4,22 +4,22 @@
- + - + - + - + 未开始 @@ -28,7 +28,7 @@ - + 查询 重置 @@ -574,7 +574,7 @@ xs: 24, sm: 4, xl: 6, - xxl: 4, + xxl: 9, }); const wrapperCol = reactive({ xs: 24, From 73fc987a55675e9f0d3411d3c738121bb24ffa5a Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 10:55:58 +0800 Subject: [PATCH 2/8] =?UTF-8?q?yxk-20260727=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E7=BC=96=E8=BE=91=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E6=8E=89=E5=AD=90=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ImprovementProposalForm.vue | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/views/gh/improvementProposal/components/ImprovementProposalForm.vue b/src/views/gh/improvementProposal/components/ImprovementProposalForm.vue index a668a73..8810338 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalForm.vue @@ -230,8 +230,8 @@ return props.formDisabled; }); - // 普通新增没有业务 ID,不展示评分和投票子表;已有数据及流程表单正常展示。 - const showSubTables = computed(() => Boolean(formData.id || props.formData?.dataId)); + // 子表由流程节点维护,普通新增、编辑和详情弹窗均不展示,避免误改评分或投票数据。 + const showSubTables = computed(() => props.formBpm === true && Boolean(formData.id || props.formData?.dataId)); function getCurrentDate() { const now = new Date(); @@ -354,11 +354,9 @@ async function edit(row) { //主表数据 await queryMainData(row.id); - //子表数据 - const improvementDeptScoreDataList = await queryImprovementDeptScoreListByMainId(row['id']); - improvementDeptScoreTable.dataSource = [...improvementDeptScoreDataList]; - const improvementInstituteVoteDataList = await queryImprovementInstituteVoteListByMainId(row['id']); - improvementInstituteVoteTable.dataSource = [...improvementInstituteVoteDataList]; + // 普通编辑不加载子表,并清理弹窗复用时可能残留的表格数据。 + improvementDeptScoreTable.dataSource = []; + improvementInstituteVoteTable.dataSource = []; } async function queryMainData(id) { @@ -399,8 +397,8 @@ const mainData = await getFormData(); const isUpdate = Boolean(mainData.id); const values = Object.assign({}, dbData, mainData); - // 新增提案只保存主表;已有提案编辑或流程提交时才采集子表数据。 - if (isUpdate) { + // 仅流程表单提交子表,普通编辑不能覆盖后续流程维护的评分和投票记录。 + if (isUpdate && showSubTables.value) { const subData = await getSubFormAndTableData(); Object.assign(values, subData); } From 14c093a59edf0e9562c8fa1cc981121352f802ad Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 14:17:51 +0800 Subject: [PATCH 3/8] =?UTF-8?q?yxk-20260728=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20Task=5Fimprove001=E8=8A=82=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E8=AF=84=E5=AE=9A=E5=A5=96=E9=A1=B9=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=AD=97=E5=85=B8proposal=5Fprize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ImprovementProposalBPMForm.vue | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue index 47f06e6..78fff5d 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -27,10 +27,6 @@
改善后附件
-
-
其他附件
- -
- @@ -44,9 +40,7 @@ - - {{ item.label }} - +
金奖、银奖进入部门评议小组打分;铜奖、参与奖直接进入部门负责人审核。
@@ -131,6 +125,7 @@ import { computed, ref, watch } from 'vue'; import { useMessage } from '/@/hooks/web/useMessage'; import { useUserStore } from '/@/store/modules/user'; + import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue'; import { @@ -333,7 +328,7 @@ .attachment-grid { display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } From 594d730fa49e2e59d47bcb049deb0ad95799cd72 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 14:55:49 +0800 Subject: [PATCH 4/8] =?UTF-8?q?yxk-20260728=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E5=AE=9E=E7=8E=B0=E9=83=A8=E9=97=A8=E8=AF=84?= =?UTF-8?q?=E8=AE=AE=E5=B0=8F=E7=BB=84=E6=89=93=E5=88=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImprovementProposal.api.ts | 6 + .../components/ImprovementProposalBPMForm.vue | 133 ++++++++++++++---- 2 files changed, 112 insertions(+), 27 deletions(-) diff --git a/src/views/gh/improvementProposal/ImprovementProposal.api.ts b/src/views/gh/improvementProposal/ImprovementProposal.api.ts index b371f93..ec5401f 100644 --- a/src/views/gh/improvementProposal/ImprovementProposal.api.ts +++ b/src/views/gh/improvementProposal/ImprovementProposal.api.ts @@ -17,6 +17,9 @@ enum Api { getLatestProposalSequence = '/improvementproposal/improvementProposal/getLatestProposalSequence', startProcess = '/improvementproposal/improvementProposal/startProcess', bpmInitialReview = '/improvementproposal/improvementProposal/bpm/initialReview', + bpmMyDeptScore = '/improvementproposal/improvementProposal/bpm/myDeptScore', + bpmDeptScore = '/improvementproposal/improvementProposal/bpm/deptScore', + bpmSubmitDeptScore = '/improvementproposal/improvementProposal/bpm/submitDeptScore', bpmLeaderAward = '/improvementproposal/improvementProposal/bpm/leaderAward', bpmArchiveAward = '/improvementproposal/improvementProposal/bpm/archiveAward', bpmInstituteVote = '/improvementproposal/improvementProposal/bpm/instituteVote', @@ -102,6 +105,9 @@ export const startProposalProcess = (id: string) => defHttp.post({ url: Api.star /** 流程节点专用接口会在任务提交前保存业务字段和网关变量。 */ export const saveInitialReview = (params) => defHttp.post({ url: Api.bpmInitialReview, params }); +export const queryMyDeptScore = (params) => defHttp.get({ url: Api.bpmMyDeptScore, params }); +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 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 78fff5d..ca8b155 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -45,16 +45,15 @@ @@ -111,11 +110,37 @@ - - {{ currentScore.scorerName || '-' }} - {{ currentScore.scoreStatus === 'completed' ? '已评分' : '待评分' }} - -
四个评分维度录入、加权计算和评分提交将在下一阶段开发。
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + 保存评分 + 评分已锁定,请重新提交流程办理 + +
@@ -131,11 +156,13 @@ import { castInstituteVote, queryDataById, - queryImprovementDeptScoreListByMainId, queryImprovementInstituteVoteListByMainId, + queryMyDeptScore, saveArchiveAward, + saveDeptScore, saveInitialReview, saveLeaderAward, + submitDeptScore, } from '../ImprovementProposal.api'; const props = defineProps({ @@ -147,14 +174,16 @@ const { createMessage } = useMessage(); const userStore = useUserStore(); const loading = ref(false); + const savingScore = ref(false); const savingVote = ref(false); const scoreModalVisible = ref(false); const proposal = ref({}); - const scoreRows = ref([]); + const currentScore = ref(null); const voteRows = ref([]); const initialAward = ref(''); const leaderFinalAward = ref(''); const finalAward = ref(''); + const scoreForm = ref(createEmptyScoreForm()); const labelCol = { xs: { span: 24 }, sm: { span: 5 } }; const wrapperCol = { xs: { span: 24 }, sm: { span: 19 } }; @@ -164,11 +193,6 @@ { value: '2', label: '铜奖' }, { value: '3', label: '参与奖' }, ]; - const scoreColumns = [ - { title: '评委', dataIndex: 'scorerName', width: 180 }, - { title: '状态', key: 'status', width: 120 }, - { title: '总分', dataIndex: 'totalScore', width: 120 }, - ]; const voteMemberColumns = [ { title: '评委', dataIndex: 'voterName', width: 180 }, { title: '状态', dataIndex: 'voteStatus', width: 120 }, @@ -189,11 +213,15 @@ })); const showProcessHandle = computed(() => props.formBpm && props.formData?.PROCESS_TAB_TYPE === 'run' && !!processInfo.value.taskId); const currentUserId = computed(() => String(userStore.getUserInfo?.id || '')); - const currentScore = computed(() => scoreRows.value.find((item) => String(item.scorerId) === currentUserId.value)); + const scoreLocked = computed(() => currentScore.value?.scoreStatus === 'completed'); + const scoreStatusLabel = computed(() => { + if (!currentScore.value) return '未保存'; + return scoreLocked.value ? '评分已锁定' : '已保存,待流程提交'; + }); const currentVote = computed(() => voteRows.value.find((item) => String(item.voterId) === currentUserId.value)); watch( - () => [processInfo.value.mainId, processInfo.value.processInstanceId], + () => [processInfo.value.mainId, processInfo.value.processInstanceId, processInfo.value.taskId, processInfo.value.taskDefKey], () => loadProposal(), { immediate: true } ); @@ -202,19 +230,21 @@ const mainId = processInfo.value.mainId; if (!mainId) { proposal.value = {}; - scoreRows.value = []; + currentScore.value = null; voteRows.value = []; return; } loading.value = true; try { - const [main, scores, votes] = await Promise.all([ + const [main, votes, myScore] = await Promise.all([ queryDataById(mainId), - queryImprovementDeptScoreListByMainId(mainId), queryImprovementInstituteVoteListByMainId(mainId), + isTask('Task_improve002') && processInfo.value.processInstanceId && processInfo.value.taskId + ? queryMyDeptScore(processInfo.value) + : Promise.resolve(null), ]); proposal.value = main || {}; - scoreRows.value = scores || []; + currentScore.value = myScore || null; voteRows.value = votes || []; initialAward.value = proposal.value.initialAward || ''; leaderFinalAward.value = proposal.value.leaderFinalAward || ''; @@ -243,6 +273,10 @@ } await saveInitialReview(actionPayload({ initialAward: initialAward.value })); } + if (isTask('Task_improve002')) { + // 弹窗仅保存草稿;通用流程办理前才锁定评分,确保评委在此之前仍可修改。 + await submitDeptScore(actionPayload()); + } if (isTask('Task_improve003')) { if (!leaderFinalAward.value) { createMessage.warning('请选择负责人确认奖项'); @@ -282,10 +316,51 @@ } function openScoreModal() { - // 评分字段、权重计算和完成条件将由下一阶段单独实现,避免当前占位入口误写评分结果。 + const score = currentScore.value; + scoreForm.value = { + effectScore: score?.effectScore ?? undefined, + promotionScore: score?.promotionScore ?? undefined, + originalityScore: score?.originalityScore ?? undefined, + effortScore: score?.effortScore ?? undefined, + scoreOpinion: score?.scoreOpinion || '', + }; scoreModalVisible.value = true; } + async function saveScoreDraft() { + if (!hasValidScoreValues()) { + createMessage.warning('请完整填写 0 到 100 分之间的四项评分'); + return; + } + savingScore.value = true; + try { + await saveDeptScore(actionPayload(scoreForm.value)); + createMessage.success('评分保存成功,可在流程提交前继续修改'); + await loadProposal(); + } catch (error: any) { + createMessage.warning(error?.message || '评分保存失败'); + } finally { + savingScore.value = false; + } + } + + function createEmptyScoreForm() { + return { + effectScore: undefined, + promotionScore: undefined, + originalityScore: undefined, + effortScore: undefined, + scoreOpinion: '', + }; + } + + function hasValidScoreValues() { + return ['effectScore', 'promotionScore', 'originalityScore', 'effortScore'].every((key) => { + const value = scoreForm.value[key]; + return value !== undefined && value !== null && Number(value) >= 0 && Number(value) <= 100; + }); + } + function awardLabel(value: string) { return awardOptions.find((item) => item.value === String(value))?.label || '-'; } @@ -299,6 +374,10 @@ return value ? String(value).slice(0, 10) : '-'; } + function formatDateTime(value?: string) { + return value ? String(value) : '-'; + } + function handleSuccess() { emit('success'); } From 10452b724c9c93b38fc5ad70bdf76dd56e8666c5 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 15:05:34 +0800 Subject: [PATCH 5/8] =?UTF-8?q?yxk-20260728=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E6=94=B9=E5=96=84=E6=95=88=E6=9E=9C=E5=BE=97?= =?UTF-8?q?=E5=88=86=E6=8B=86=E5=88=86=E4=B8=BA=E5=AE=89=E5=85=A8=E3=80=81?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E3=80=81=E6=95=88=E7=8E=87=E3=80=81=E6=88=90?= =?UTF-8?q?=E6=9C=AC=E5=9B=9B=E4=B8=AA=EF=BC=8C=E6=9D=83=E9=87=8D=E5=B9=B3?= =?UTF-8?q?=E5=9D=87=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImprovementProposal.data.ts | 50 ++++++++++++++++--- .../components/ImprovementProposalBPMForm.vue | 37 +++++++++++--- 2 files changed, 74 insertions(+), 13 deletions(-) diff --git a/src/views/gh/improvementProposal/ImprovementProposal.data.ts b/src/views/gh/improvementProposal/ImprovementProposal.data.ts index 10f1848..e8a7ba8 100644 --- a/src/views/gh/improvementProposal/ImprovementProposal.data.ts +++ b/src/views/gh/improvementProposal/ImprovementProposal.data.ts @@ -131,6 +131,38 @@ export const improvementDeptScoreColumns: JVxeColumn[] = [ { required: true, message: '${title}不能为空' }, ], }, + { + title: '安全得分', + key: 'safetyScore', + type: JVxeTypes.inputNumber, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '质量得分', + key: 'qualityScore', + type: JVxeTypes.inputNumber, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '效率得分', + key: 'efficiencyScore', + type: JVxeTypes.inputNumber, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '成本得分', + key: 'costScore', + type: JVxeTypes.inputNumber, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, { title: '改善效果得分', key: 'effectScore', @@ -292,13 +324,17 @@ export const superQuerySchema = { scorerId: {title: '评委ID',order: 2,view: 'text', type: 'string',}, scorerName: {title: '评委姓名',order: 3,view: 'text', type: 'string',}, scoreStatus: {title: '评分状态:pending/completed',order: 4,view: 'text', type: 'string',}, - effectScore: {title: '改善效果得分',order: 5,view: 'number', type: 'number',}, - promotionScore: {title: '可推广度得分',order: 6,view: 'number', type: 'number',}, - originalityScore: {title: '独创性得分',order: 7,view: 'number', type: 'number',}, - effortScore: {title: '努力度得分',order: 8,view: 'number', type: 'number',}, - totalScore: {title: '加权总分',order: 9,view: 'number', type: 'number',}, - scoreOpinion: {title: '评分意见',order: 10,view: 'textarea', type: 'string',}, - scoreTime: {title: '评分时间',order: 11,view: 'datetime', type: 'string',}, + safetyScore: {title: '安全得分',order: 5,view: 'number', type: 'number',}, + qualityScore: {title: '质量得分',order: 6,view: 'number', type: 'number',}, + efficiencyScore: {title: '效率得分',order: 7,view: 'number', type: 'number',}, + costScore: {title: '成本得分',order: 8,view: 'number', type: 'number',}, + effectScore: {title: '改善效果平均得分',order: 9,view: 'number', type: 'number',}, + promotionScore: {title: '可推广度得分',order: 10,view: 'number', type: 'number',}, + originalityScore: {title: '独创性得分',order: 11,view: 'number', type: 'number',}, + effortScore: {title: '努力度得分',order: 12,view: 'number', type: 'number',}, + totalScore: {title: '加权总分',order: 13,view: 'number', type: 'number',}, + scoreOpinion: {title: '评分意见',order: 14,view: 'textarea', type: 'string',}, + scoreTime: {title: '评分时间',order: 15,view: 'datetime', type: 'string',}, } }, improvementInstituteVote: { diff --git a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue index ca8b155..350f4ea 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -112,9 +112,23 @@ - + - + + + + + + + + + + + + + + +
改善效果得分按安全、质量、效率、成本四项的平均分自动计算:{{ effectAveragePreview }}
@@ -218,6 +232,11 @@ if (!currentScore.value) return '未保存'; return scoreLocked.value ? '评分已锁定' : '已保存,待流程提交'; }); + const effectAveragePreview = computed(() => { + const values = ['safetyScore', 'qualityScore', 'efficiencyScore', 'costScore'].map((key) => scoreForm.value[key]); + if (values.some((value) => value === undefined || value === null)) return '-'; + return (values.reduce((sum, value) => sum + Number(value), 0) / values.length).toFixed(2); + }); const currentVote = computed(() => voteRows.value.find((item) => String(item.voterId) === currentUserId.value)); watch( @@ -318,7 +337,10 @@ function openScoreModal() { const score = currentScore.value; scoreForm.value = { - effectScore: score?.effectScore ?? undefined, + safetyScore: score?.safetyScore ?? undefined, + qualityScore: score?.qualityScore ?? undefined, + efficiencyScore: score?.efficiencyScore ?? undefined, + costScore: score?.costScore ?? undefined, promotionScore: score?.promotionScore ?? undefined, originalityScore: score?.originalityScore ?? undefined, effortScore: score?.effortScore ?? undefined, @@ -329,7 +351,7 @@ async function saveScoreDraft() { if (!hasValidScoreValues()) { - createMessage.warning('请完整填写 0 到 100 分之间的四项评分'); + createMessage.warning('请完整填写 0 到 100 分之间的七项评分'); return; } savingScore.value = true; @@ -346,7 +368,10 @@ function createEmptyScoreForm() { return { - effectScore: undefined, + safetyScore: undefined, + qualityScore: undefined, + efficiencyScore: undefined, + costScore: undefined, promotionScore: undefined, originalityScore: undefined, effortScore: undefined, @@ -355,7 +380,7 @@ } function hasValidScoreValues() { - return ['effectScore', 'promotionScore', 'originalityScore', 'effortScore'].every((key) => { + return ['safetyScore', 'qualityScore', 'efficiencyScore', 'costScore', 'promotionScore', 'originalityScore', 'effortScore'].every((key) => { const value = scoreForm.value[key]; return value !== undefined && value !== null && Number(value) >= 0 && Number(value) <= 100; }); From f8290836f96e2674bf99733bd2c1aa355a67a2d2 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 18:33:56 +0800 Subject: [PATCH 6/8] =?UTF-8?q?yxk-20260728=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E5=9C=A8=20Task=5Fimprove003=20=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA=E5=AE=A1=E6=A0=B8=E8=8A=82=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E8=B4=9F=E8=B4=A3=E4=BA=BA=E5=8F=AA=E8=83=BD=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E5=9F=BA=E5=87=86=E5=A5=96=E9=A1=B9=E6=9C=AC=E6=A1=A3?= =?UTF-8?q?=E6=88=96=E6=9B=B4=E4=BD=8E=E6=A1=A3=E5=A5=96=E9=A1=B9=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E5=85=81=E8=AE=B8=E5=8D=87=E6=A1=A3=E3=80=82=E5=9F=BA?= =?UTF-8?q?=E5=87=86=E5=A5=96=E9=A1=B9=E6=8C=89=E6=98=AF=E5=90=A6=E7=BB=8F?= =?UTF-8?q?=E8=BF=87=E9=83=A8=E9=97=A8=E8=AF=84=E8=AE=AE=E7=A1=AE=E5=AE=9A?= =?UTF-8?q?=EF=BC=9A=20need=5Fdept=5Fscore=3D'1'=EF=BC=9A=E4=BB=A5=20sugge?= =?UTF-8?q?sted=5Faward=20=E4=B8=BA=E5=9F=BA=E5=87=86=E3=80=82=20=E6=9C=AA?= =?UTF-8?q?=E7=BB=8F=E8=BF=87=E9=83=A8=E9=97=A8=E8=AF=84=E8=AE=AE=EF=BC=9A?= =?UTF-8?q?=E4=BB=A5=20initial=5Faward=20=E4=B8=BA=E5=9F=BA=E5=87=86?= =?UTF-8?q?=E3=80=82=20=E5=A5=96=E9=A1=B9=E7=BC=96=E7=A0=81=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E7=8E=B0=E6=9C=89=E9=A1=BA=E5=BA=8F=EF=BC=9A0=3D?= =?UTF-8?q?=E9=87=91=E5=A5=96=E3=80=811=3D=E9=93=B6=E5=A5=96=E3=80=812=3D?= =?UTF-8?q?=E9=93=9C=E5=A5=96=E3=80=813=3D=E5=8F=82=E4=B8=8E=E5=A5=96?= =?UTF-8?q?=EF=BC=9B=E7=BC=96=E7=A0=81=E6=95=B0=E5=80=BC=E5=A4=A7=E4=BA=8E?= =?UTF-8?q?=E7=AD=89=E4=BA=8E=E5=9F=BA=E5=87=86=E7=BC=96=E7=A0=81=E5=8D=B3?= =?UTF-8?q?=E4=B8=BA=E6=9C=AC=E6=A1=A3=E6=88=96=E9=99=8D=E6=A1=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ImprovementProposalBPMForm.vue | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue index 350f4ea..e546079 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -46,7 +46,7 @@ - + + @@ -237,6 +240,15 @@ if (values.some((value) => value === undefined || value === null)) return '-'; return (values.reduce((sum, value) => sum + Number(value), 0) / values.length).toFixed(2); }); + // 部门评分完成后必须以系统建议奖项为基准,不能回退到初审奖项。 + const leaderAwardBase = computed(() => { + const award = proposal.value.needDeptScore === '1' ? proposal.value.suggestedAward : proposal.value.initialAward; + return awardOptions.some((item) => item.value === String(award)) ? String(award) : ''; + }); + const leaderAwardOptions = computed(() => { + if (!leaderAwardBase.value) return []; + return awardOptions.filter((item) => Number(item.value) >= Number(leaderAwardBase.value)); + }); const currentVote = computed(() => voteRows.value.find((item) => String(item.voterId) === currentUserId.value)); watch( @@ -297,10 +309,18 @@ await submitDeptScore(actionPayload()); } if (isTask('Task_improve003')) { + if (!leaderAwardBase.value) { + createMessage.warning('部门评议建议奖项尚未生成,不能确认负责人奖项'); + return false; + } if (!leaderFinalAward.value) { createMessage.warning('请选择负责人确认奖项'); return false; } + if (!leaderAwardOptions.value.some((item) => item.value === leaderFinalAward.value)) { + createMessage.warning('负责人确认奖项只能选择当前档位或降档奖项'); + return false; + } await saveLeaderAward(actionPayload({ leaderFinalAward: leaderFinalAward.value })); } if (isTask('Task_improve005') && currentVote.value?.voteStatus !== 'voted') { @@ -358,6 +378,7 @@ try { await saveDeptScore(actionPayload(scoreForm.value)); createMessage.success('评分保存成功,可在流程提交前继续修改'); + scoreModalVisible.value = false; await loadProposal(); } catch (error: any) { createMessage.warning(error?.message || '评分保存失败'); @@ -452,6 +473,10 @@ font-size: 12px; } + .score-range-alert { + margin-bottom: 16px; + } + @media (max-width: 768px) { .attachment-grid { grid-template-columns: 1fr; From 8161e498bd98128b80ef2c30c071b5a823894b35 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Wed, 29 Jul 2026 10:18:51 +0800 Subject: [PATCH 7/8] =?UTF-8?q?yxk-20260729=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E5=9C=A8=20Task=5Fimprove004=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=80=E7=BA=A7=E8=AF=84=E8=AE=AE=E4=BA=BA=E5=91=98=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E3=80=82=E7=BB=8F=E5=8A=9E=E4=BA=BA=E9=80=89=E6=8B=A9?= =?UTF-8?q?=20improve=5Fsuoleader=20=E8=A7=92=E8=89=B2=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E4=BA=BA=E6=88=96=E5=A4=9A=E4=BA=BA=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E9=80=9A=E7=94=A8=E2=80=9C=E6=8F=90=E4=BA=A4?= =?UTF-8?q?/=E5=8A=9E=E7=90=86=E2=80=9D=E4=BF=9D=E5=AD=98=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E3=80=81=E5=88=9D=E5=A7=8B=E5=8C=96=E5=BE=85=E6=8A=95?= =?UTF-8?q?=E7=A5=A8=E8=AE=B0=E5=BD=95=EF=BC=8C=E5=B9=B6=E5=86=99=E5=85=A5?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F=20suoleadervotelist?= =?UTF-8?q?=EF=BC=8C=E4=BE=9B=20Task=5Fimprove005=20=E5=A4=9A=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E4=BB=BB=E5=8A=A1=E4=BD=BF=E7=94=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImprovementProposal.api.ts | 4 ++ .../components/ImprovementProposalBPMForm.vue | 72 ++++++++++++++++--- 2 files changed, 68 insertions(+), 8 deletions(-) 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; From 354ab93f5306d3b2b96e30809f80ef934a182541 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Wed, 29 Jul 2026 10:39:10 +0800 Subject: [PATCH 8/8] =?UTF-8?q?yxk-20260729=20=E6=94=B9=E5=96=84=E6=8F=90?= =?UTF-8?q?=E6=A1=88=20=E6=8A=95=E7=A5=A8/=E6=89=93=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImprovementProposal.api.ts | 2 ++ .../components/ImprovementProposalBPMForm.vue | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/views/gh/improvementProposal/ImprovementProposal.api.ts b/src/views/gh/improvementProposal/ImprovementProposal.api.ts index 2b355c5..062ea3f 100644 --- a/src/views/gh/improvementProposal/ImprovementProposal.api.ts +++ b/src/views/gh/improvementProposal/ImprovementProposal.api.ts @@ -23,6 +23,7 @@ enum Api { bpmLeaderAward = '/improvementproposal/improvementProposal/bpm/leaderAward', bpmInstituteVoteCandidates = '/improvementproposal/improvementProposal/bpm/instituteVoteCandidates', bpmInstituteVoteMembers = '/improvementproposal/improvementProposal/bpm/instituteVoteMembers', + bpmSubmitInstituteVote = '/improvementproposal/improvementProposal/bpm/submitInstituteVote', bpmArchiveAward = '/improvementproposal/improvementProposal/bpm/archiveAward', bpmInstituteVote = '/improvementproposal/improvementProposal/bpm/instituteVote', } @@ -115,3 +116,4 @@ export const queryInstituteVoteCandidates = (params) => defHttp.get({ url: Api.b 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 }); +export const submitInstituteVote = (params) => defHttp.post({ url: Api.bpmSubmitInstituteVote, params }); diff --git a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue index fd7c67e..d52df23 100644 --- a/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue +++ b/src/views/gh/improvementProposal/components/ImprovementProposalBPMForm.vue @@ -88,8 +88,8 @@