From 26582cf4218881c4797ee717993efdbaae371193 Mon Sep 17 00:00:00 2001 From: bestlee Date: Thu, 8 Oct 2026 17:23:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E8=B5=B7=E5=8F=98=E6=9B=B4=E6=8F=90?= =?UTF-8?q?=E4=BA=A4-=E7=AD=89=E7=BA=A7=E5=88=A4=E5=AE=9A=E8=A1=A8?= =?UTF-8?q?=E5=88=86=E6=95=B0=E4=BF=9D=E5=AD=98=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/change/index.ts | 23 ++++++++----------- src/typings/api/change.d.ts | 6 ++--- .../my/initiateChange/modules/changeApply.vue | 11 ++++++++- .../my/initiateChange/modules/footer.vue | 8 ++++--- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/store/modules/change/index.ts b/src/store/modules/change/index.ts index d1e57d3..d1fa3f7 100644 --- a/src/store/modules/change/index.ts +++ b/src/store/modules/change/index.ts @@ -10,31 +10,25 @@ export const useChangeStore = defineStore(SetupStoreId.Change, () => { // 获取审批链信息 const getFlowInfo = computed(() => flowInfo.value); - // 更新选中模板信息 + // 设置选中模板信息 function setStepsInfo(data: Api.Change.StepInfo[]) { stepsInfo.value = data; setFlowInfo(data); } - function getSelectedMembers(steps: Api.Change.StepInfo[]) { - return steps.map(step => { - // 先找 is_sign === 1 的成员 - const signed = step.members.find((m: any) => m.is_sign === 1); - // 若没有则取第一个,若成员列表为空则返回 null - const selected = signed || (step.members.length > 0 ? step.members[0] : null); + // 设置审批链信息 + function setFlowInfo(data: Api.Change.StepInfo[]) { + const sortedSteps = [...data || []].sort((a, b) => a.step_order - b.step_order) + flowInfo.value = sortedSteps.map(step => { return { stepId: step.id, name: step.name, - countersign: step.countersign, // 添加会签标识 - selectedMember: selected? [selected] : [], // 选中的成员对象 + countersign: step.countersign, + selectedMember: step.members, }; }); } // 更新审批链信息 - function setFlowInfo(data: Api.Change.StepInfo[]) { - const sortedSteps = [...data || []].sort((a, b) => a.step_order - b.step_order) - flowInfo.value = getSelectedMembers(sortedSteps); - } function updateFlowInfo(data: Api.Change.FlowInfo[]) { flowInfo.value = data; } @@ -42,6 +36,7 @@ export const useChangeStore = defineStore(SetupStoreId.Change, () => { getStepsInfo, setStepsInfo, getFlowInfo, - updateFlowInfo + updateFlowInfo, + flowInfo, } }); \ No newline at end of file diff --git a/src/typings/api/change.d.ts b/src/typings/api/change.d.ts index 17d2994..c560b3b 100644 --- a/src/typings/api/change.d.ts +++ b/src/typings/api/change.d.ts @@ -6,11 +6,11 @@ declare namespace Api { */ namespace Change { interface MemberInfo { - id: number; - is_sign: number; + id?: number; + is_sign?: number; org_id: number; org_name: string; - specialty: string; + specialty?: string; user_id: number; user_name: string; } diff --git a/src/views/my/initiateChange/modules/changeApply.vue b/src/views/my/initiateChange/modules/changeApply.vue index cad98df..3d6904e 100644 --- a/src/views/my/initiateChange/modules/changeApply.vue +++ b/src/views/my/initiateChange/modules/changeApply.vue @@ -29,6 +29,13 @@ watch(() => props.currentForm, (newVal:any) => { ...rest } = newVal; form.value = rest; + // 用 Map 建立 question_id -> score 的映射,查找 O(1) + const scoreMap = new Map(form.value?.level_score?.map((item:any) => [item.question_id, item.score]) || []); + questions.value = questions.value.map((item:any) => ({ + ...item, + score: scoreMap.has(item.question_id) ? scoreMap.get(item.question_id) : item.score + })); + totalScore.value = questions.value.reduce((sum:number, item:any) => sum + (item.score || 0), 0); }) const aiFail = (e: any) => { @@ -69,6 +76,7 @@ const form = ref<{ disciplines: string[], plan_use_date: number | null, risk_tools: string[], + level_score: any[], }>({ change_type: null, change_level: computed(() => totalScore.value >= 20 ? 2 : 1), @@ -85,6 +93,7 @@ const form = ref<{ disciplines: [], plan_use_date: null, risk_tools: [], + level_score: [], }); // 变更目的选项 const PURPOSE_OPTIONS = [ @@ -811,7 +820,7 @@ defineExpose({form, questions, applyAiResult, generateLevel: useAiLevel}) align-items: center; } .scroll { - height: calc(100vh - 395px); + height: calc(100vh - 393px); overflow-y: auto; } \ No newline at end of file diff --git a/src/views/my/initiateChange/modules/footer.vue b/src/views/my/initiateChange/modules/footer.vue index 77e9f40..907e8c8 100644 --- a/src/views/my/initiateChange/modules/footer.vue +++ b/src/views/my/initiateChange/modules/footer.vue @@ -72,7 +72,7 @@ const openApprovalDrawer = () => { if (item.members && item.members.length > 0) { // 优先选 is_sign=1 的成员 ,否则选第一个 const defaultMembers = item.members - .filter((m: any) => m.is_sign === 1) + .filter((m: any) => m?.is_sign === 1) .map((m: any) => m.user_id); approvers.value[item.id] = defaultMembers.length > 0 ? defaultMembers : [item.members[0].user_id]; } @@ -84,10 +84,11 @@ const openApprovalDrawer = () => { // 审批链 const approvalChain = computed(() => { let template = getFlowInfo.value; + console.log(template); if (!template || template.length === 0) return '暂无审批步骤' const parts = template.map((step: any) => { // 根据 countersign 决定显示名称 - const displayName = step.countersign ? '专业会签' : step.name + const displayName = step.name const members = step.selectedMember let memberText; if (members && members.length > 0) { @@ -157,7 +158,7 @@ function matchApprovers(steps: any[], mapping: Record) { for (const [stepId, usersId] of Object.entries(mapping)) { const step = steps.find(s => s.id === Number(stepId)); if (step) { - const members = step.members.filter((m: any) => usersId.includes(m.user_id)); + const members = props.members.filter((m: any) => usersId.includes(m.user_id)); if (members.length > 0) { result.push({ countersign: step.countersign, @@ -179,6 +180,7 @@ const finishApprover = async () => { } defineExpose({clearApprovers, setRegenerateLoading}) +