From a5282019c02cc9ae793203e32a8a0d3bb4e6fcc9 Mon Sep 17 00:00:00 2001 From: bestlee Date: Fri, 9 Oct 2026 15:12:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E8=B5=B7=E5=8F=98=E6=9B=B4=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E6=B5=81=E7=A8=8B=E5=BC=B9=E6=A1=86=E6=9D=BF=E5=9D=97?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/change/index.ts | 18 -- src/views/my/initiateChange/index.vue | 60 ++++-- .../my/initiateChange/modules/changeApply.vue | 128 ++++++++----- .../initiateChange/modules/changeTraining.vue | 12 +- .../my/initiateChange/modules/evaluation.vue | 12 +- .../my/initiateChange/modules/footer.vue | 181 +++++++++++++----- src/views/my/initiateChange/modules/pssr.vue | 10 +- .../initiateChange/modules/riskAnalysis.vue | 27 ++- 8 files changed, 296 insertions(+), 152 deletions(-) delete mode 100644 src/store/modules/change/index.ts diff --git a/src/store/modules/change/index.ts b/src/store/modules/change/index.ts deleted file mode 100644 index 300881a..0000000 --- a/src/store/modules/change/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { computed, ref } from 'vue'; -import { defineStore } from 'pinia'; -import { SetupStoreId } from '@/enum'; - -export const useChangeStore = defineStore(SetupStoreId.Change, () => { - const stepsInfo = ref([]); - // 获取选中模板信息 - const getStepsInfo = computed(() => stepsInfo.value); - - // 设置选中模板信息 - function setStepsInfo(data: Api.Change.StepInfo[]) { - stepsInfo.value = data; - } - return { - getStepsInfo, - setStepsInfo, - } -}); \ No newline at end of file diff --git a/src/views/my/initiateChange/index.vue b/src/views/my/initiateChange/index.vue index 50489dc..645da91 100644 --- a/src/views/my/initiateChange/index.vue +++ b/src/views/my/initiateChange/index.vue @@ -5,8 +5,6 @@ import { useThemeStore } from '@/store/modules/theme'; import { useRoute } from 'vue-router'; import { getColorWithOpacity } from "@/utils/common"; import { localStg } from '@/utils/storage'; -import { storeToRefs } from 'pinia'; -import { useChangeStore } from '@/store/modules/change'; import { queryUnsavedApi, saveChangeApi, submitChangeApi, getChangeDetailApi } from '@/service/api/change'; import { systemConfigApi, templateListApi, peopleListApi } from '@/service/api/system'; import { orgListApi } from '@/service/api/user'; @@ -19,8 +17,6 @@ import Pssr from "./modules/pssr.vue"; import Evaluation from "./modules/evaluation.vue"; import CloseConfirm from "./modules/closeConfirm.vue"; -const changeStore = useChangeStore(); -const { getStepsInfo } = storeToRefs(changeStore); const themeStore = useThemeStore(); const route = useRoute(); @@ -37,6 +33,7 @@ const evaluationRef = ref(null); const closeConfirmRef = ref(null); // 所有人员 const memberList = ref([]); +const stepsList = ref([]); // 表单数据 const changePreForm = ref(null) const changeApplyForm = ref(null) @@ -150,12 +147,12 @@ const getAllFormData = () => { let pssrForm = pssrRef.value?.list; let allItems = pssrForm.flatMap((group:any) => group.items ?? []); let evaluationForm = evaluationRef.value?.list; - let flowList = getStepsInfo.value.map((item:any) => ({ + let flowList = stepsList.value.map((item:any) => ({ members: item.members.map((m:any) => ({ user_id: m.user_id, org_id: m.org_id, org_name: m.org_name, - specialty: m.specialty === '' ? null : (m.specialty ?? null), + specialty: m.specialty ?? null, is_sign: m.is_sign })) })); @@ -259,7 +256,9 @@ const getChangeDetail = async () => { // 解析时间戳 changeApplyForm.value.plan_use_date = anyToTimestamp(changeApplyForm.value.plan_use_date); changeApplyForm.value.restore_deadline = anyToTimestamp(changeApplyForm.value.restore_deadline); - + // 审批信息 + stepsList.value = changeApplyForm.value?.approval_flow?.steps || []; + riskAnalysisForm.value = data.risk_records; changeTrainingForm.value = data.train; pssrForm.value = data.pssr; @@ -325,18 +324,42 @@ const getOrgList = async () => { } } +// 人员数据转换 +const groupUsersByOrg = (users:any) => { + const orgMap = new Map(); // key: org.id, value: { id, label, children } + users.forEach((user:any) => { + const { id: userId, realname, user_departments } = user; + if (!user_departments || user_departments.length === 0) return; + + user_departments.forEach((dept:any) => { + const org = dept.org; + if (!org || !org.id) return; + + if (!orgMap.has(org.id)) { + orgMap.set(org.id, { + value: org.id, + label: org.label, + children: [] + }); + } + const targetOrg = orgMap.get(org.id); + // 避免同一个用户重复加入同一个组织(理论上不会发生,但做去重保护) + if (!targetOrg.children.some((child:any) => child.id === userId)) { + targetOrg.children.push({ + value: userId.toString(), + label: realname, + user_id: userId.toString() + }); + } + }); + }); + return Array.from(orgMap.values()); +} // 获取所有人员 const getAllMembers = async () => { const {data,error} = await peopleListApi(); if(!error){ - const transformed = data.map((item:any) => ({ - user_id: item.id, - user_name: item.realname, - full_name: item.realname + (`(${item.user_departments.map((d:any) => d.label).join(';')})`), - org_id: item.user_departments.map((d:any) => d.organization_id).join(';'), - org_name: item.user_departments.map((d:any) => d.label).join(';') - })); - memberList.value = transformed; + memberList.value = groupUsersByOrg(data); } } @@ -415,10 +438,12 @@ onMounted(() => { :currentForm="changeApplyForm" :confirmed="confirmed[tab]" :members="memberList" + :steps="stepsList" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @update:title="(v: string) => title = v" + @update:steps="(v:any) => stepsList = v" /> @@ -434,6 +459,7 @@ onMounted(() => { :currentForm="riskAnalysisForm" :confirmed="confirmed[tab]" :members="memberList" + :steps="stepsList" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @@ -451,6 +477,7 @@ onMounted(() => { :currentForm="changeTrainingForm" :confirmed="confirmed[tab]" :members="memberList" + :steps="stepsList" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @@ -469,6 +496,7 @@ onMounted(() => { :currentForm="pssrForm" :confirmed="confirmed[tab]" :members="memberList" + :steps="stepsList" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @@ -487,6 +515,7 @@ onMounted(() => { :currentForm="evaluationForm" :confirmed="confirmed[tab]" :members="memberList" + :steps="stepsList" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @@ -501,6 +530,7 @@ onMounted(() => { :title="title" :currentId="currentId" :members="memberList" + :steps="stepsList" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" diff --git a/src/views/my/initiateChange/modules/changeApply.vue b/src/views/my/initiateChange/modules/changeApply.vue index b72b6c0..247e4c8 100644 --- a/src/views/my/initiateChange/modules/changeApply.vue +++ b/src/views/my/initiateChange/modules/changeApply.vue @@ -1,42 +1,24 @@ @@ -678,10 +706,12 @@ defineExpose({form, questions, applyAiResult, generateLevel: useAiLevel}) :currentForm="form" :confirmed="props.confirmed" :members="props.members" + :steps="currentSteps" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @regenerate="onRegenerate" + @update:steps="updateSteps" /> diff --git a/src/views/my/initiateChange/modules/changeTraining.vue b/src/views/my/initiateChange/modules/changeTraining.vue index 0ea6ce4..45d32de 100644 --- a/src/views/my/initiateChange/modules/changeTraining.vue +++ b/src/views/my/initiateChange/modules/changeTraining.vue @@ -8,8 +8,8 @@ import Footer from './footer.vue'; const themeStore = useThemeStore(); -const props = defineProps(['type','isAiOpen','title','currentId','formInfo', 'currentForm', 'confirmed','members']) -const emit = defineEmits(['save','submit','confirmTab']); +const props = defineProps(['type','isAiOpen','title','currentId','formInfo', 'currentForm', 'confirmed','members','steps']) +const emit = defineEmits(['save','submit','confirmTab','update:steps']); watch(() => props.currentForm, (newVal:any) => { // 过滤出需要的字段 @@ -67,10 +67,14 @@ const saveDraft = () => { const submitConfirm = () => { emit('submit', props.type); } -// // 确认标签内容 +// 确认标签内容 const confirmTab = (tab:string, val:boolean) => { emit('confirmTab', tab, val); } +// 更新审批流程 +const updateSteps = (steps:any[]) => { + emit('update:steps', steps); +} defineExpose({form, onRegenerate}) @@ -107,10 +111,12 @@ defineExpose({form, onRegenerate}) :isAiOpen="props.isAiOpen" :confirmed="props.confirmed" :members="props.members" + :steps="props.steps" @save="saveDraft" @submit="submitConfirm" @confirmTab="confirmTab" @regenerate="onRegenerate" + @update:steps="updateSteps" />