Files
ks-app-employment-service/stores/useCareerRecommendationStore.js

179 lines
5.0 KiB
JavaScript
Raw Normal View History

2026-01-21 14:26:34 +08:00
import { computed, ref, watch } from 'vue';
import { defineStore } from 'pinia';
2026-01-22 01:15:41 +08:00
import { getProfessions, getRecommend, getSkillTags } from '@/apiRc/service/careerRecommendation';
2026-01-21 16:12:19 +08:00
2026-01-21 14:26:34 +08:00
export const useCareerRecommendationStore = defineStore('career-recommendation', () => {
2026-01-21 16:12:19 +08:00
const userInfo = ref({
userName: '',
professions: [],
skills: []
2026-01-22 01:15:41 +08:00
});
2026-01-21 16:12:19 +08:00
try {
const data = uni.getStorageSync('userInfo');
userInfo.value.professions = data.jobTitle.map((d) => {
return {
label: d,
value: d
};
});
userInfo.value.skills = data.appSkillsList.map((d) => {
return {
label: d.name,
value: d.name
};
});
} catch (e) {
console.warn(e);
}
2026-01-21 14:26:34 +08:00
2026-01-22 01:15:41 +08:00
const professionIndex = ref(0);
2026-01-21 14:26:34 +08:00
const profession = ref('');
2026-01-21 16:12:19 +08:00
const professionLabel = ref('');
2026-01-21 14:26:34 +08:00
const professions = ref([]);
const professionsRef = computed(() => {
2026-01-21 16:12:19 +08:00
if (!userInfo.value || !userInfo.value.professions || userInfo.value.professions.length === 0) {
2026-01-21 14:26:34 +08:00
return professions.value;
}
2026-01-21 16:12:19 +08:00
const userProfessionsLabels = userInfo.value.professions.map((d) => d.label);
2026-01-21 14:26:34 +08:00
let professionsA = [];
let professionsB = [];
professions.value.filter((d) => userProfessionsLabels.includes(d.label));
for (const d of professions.value) {
if (userProfessionsLabels.includes(d.label)) {
professionsA.push(d);
} else {
professionsB.push(d);
}
}
if (professionsA.length === 0) {
2026-01-21 16:12:19 +08:00
professionsA = userInfo.value.professions;
2026-01-21 14:26:34 +08:00
professionsB = professions.value;
}
2026-01-22 01:15:41 +08:00
return [ ...professionsA, ...professionsB ];
2026-01-21 14:26:34 +08:00
});
const skills = ref([]);
const skillTags = computed(() => {
2026-01-22 01:15:41 +08:00
if (userInfo.value.professions[ 0 ] && professionLabel.value === userInfo.value.professions[ 0 ].value) {
2026-01-21 16:12:19 +08:00
return userInfo.value.skills.map((d) => d.label);
2026-01-21 14:26:34 +08:00
}
return skills.value;
});
const result = ref([]);
const fetchData = async () => {
try {
const { code, msg, data } = await getProfessions();
if (code !== 0) {
$emitter.emit('error-message', msg);
return;
}
if (!data) {
return;
}
professions.value = data.map((d) => {
return {
label: d.name,
2026-01-22 01:15:41 +08:00
value: `${ d.jobId }`
2026-01-21 14:26:34 +08:00
};
});
} catch (e) {
console.warn(e);
}
};
const fetchSkillTags = async () => {
const params = {
2026-01-21 16:12:19 +08:00
jobName: professionLabel.value
2026-01-21 14:26:34 +08:00
};
try {
const { code, msg, data } = await getSkillTags(params);
if (code !== 0) {
$emitter.emit('error-message', msg);
return;
}
2026-01-22 01:15:41 +08:00
if (typeof data !== 'undefined' && Array.isArray(data) && data.length > 0 && data[ 0 ]) {
skills.value = data[ 0 ].skillDetList.map((d) => d.skillName);
2026-01-21 14:26:34 +08:00
}
} catch (e) {
console.warn(e);
}
};
const fetchRecommend = async () => {
const params = {
2026-01-21 16:12:19 +08:00
jobName: professionLabel.value
2026-01-21 14:26:34 +08:00
};
try {
const { code, msg, data } = await getRecommend(params);
if (code !== 0) {
$emitter.emit('error-message', msg);
return;
}
if (!data) {
return;
}
result.value = data.map((d) => {
return {
title: d.jobName,
tags: d.skillList.map((d) => d.skillName),
percentage: d.similarityScore ?? 0
};
});
} catch (e) {
console.warn(e);
}
};
const eventSearch = () => {
void fetchRecommend();
};
2026-01-22 01:15:41 +08:00
const eventProfession = (e) => {
professionIndex.value = Number(e.detail.value);
const item = professionsRef.value[e.detail.value]
profession.value = item.value;
professionLabel.value = item.label;
};
2026-01-21 16:12:19 +08:00
void fetchData();
2026-01-21 14:26:34 +08:00
watch(
() => profession.value,
() => {
if (profession.value) {
void fetchSkillTags();
2026-01-22 01:15:41 +08:00
result.value = [];
2026-01-21 14:26:34 +08:00
}
},
{
immediate: true
}
);
watch(
() => professionsRef.value,
() => {
2026-01-22 01:15:41 +08:00
if (professionsRef.value[ 0 ]) {
profession.value = professionsRef.value[ 0 ].value;
professionLabel.value = professionsRef.value[ 0 ].label;
2026-01-21 14:26:34 +08:00
}
}
);
return {
2026-01-22 01:15:41 +08:00
professionIndex,
2026-01-21 14:26:34 +08:00
profession,
2026-01-21 16:12:19 +08:00
professionLabel,
2026-01-21 14:26:34 +08:00
professionsRef,
skillTags,
result,
2026-01-22 01:15:41 +08:00
eventProfession,
eventSearch
2026-01-21 14:26:34 +08:00
};
});