155 lines
4.2 KiB
JavaScript
155 lines
4.2 KiB
JavaScript
import { computed, ref, watch } from 'vue';
|
|
import { defineStore } from 'pinia';
|
|
import { useBasicStore, useAuthUserStore } from './index';
|
|
import { getProfessions, getSkillTags, getRecommend } from '@/apiRc/service';
|
|
|
|
export const useCareerRecommendationStore = defineStore('career-recommendation', () => {
|
|
const storeBasic = useBasicStore();
|
|
const storeUser = useAuthUserStore();
|
|
|
|
const profession = ref('');
|
|
const professions = ref([]);
|
|
|
|
const professionsRef = computed(() => {
|
|
const userInfo = storeUser.userInfo;
|
|
if (!userInfo || !userInfo.professions || userInfo.professions.length === 0) {
|
|
return professions.value;
|
|
}
|
|
const userProfessionsLabels = userInfo.professions.map((d) => d.label);
|
|
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) {
|
|
professionsA = userInfo.professions;
|
|
professionsB = professions.value;
|
|
}
|
|
return [...professionsA, ...professionsB];
|
|
});
|
|
|
|
const skills = ref([]);
|
|
|
|
const skillTags = computed(() => {
|
|
const userInfo = storeUser.userInfo;
|
|
if (userInfo.professions[0] && profession.value === userInfo.professions[0].value) {
|
|
return userInfo.skills.map((d) => d.label);
|
|
}
|
|
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,
|
|
value: `${d.jobId}`
|
|
};
|
|
});
|
|
} catch (e) {
|
|
console.warn(e);
|
|
}
|
|
};
|
|
|
|
const fetchSkillTags = async () => {
|
|
const params = {
|
|
jobName: profession.value
|
|
};
|
|
try {
|
|
const { code, msg, data } = await getSkillTags(params);
|
|
if (code !== 0) {
|
|
$emitter.emit('error-message', msg);
|
|
return;
|
|
}
|
|
if (typeof data !== 'undefined' && Array.isArray(data) && data.length > 0 && data[0]) {
|
|
skills.value = data[0].skillDetList.map((d) => d.skillName);
|
|
}
|
|
} catch (e) {
|
|
console.warn(e);
|
|
}
|
|
};
|
|
|
|
const fetchRecommend = async () => {
|
|
const params = {
|
|
jobName: profession.value
|
|
};
|
|
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();
|
|
};
|
|
|
|
watch(
|
|
() => storeBasic.loaded,
|
|
() => {
|
|
if (storeBasic.loaded) {
|
|
void fetchData();
|
|
}
|
|
}
|
|
);
|
|
|
|
watch(
|
|
() => profession.value,
|
|
() => {
|
|
if (profession.value) {
|
|
void fetchSkillTags();
|
|
}
|
|
},
|
|
{
|
|
immediate: true
|
|
}
|
|
);
|
|
|
|
watch(
|
|
() => professionsRef.value,
|
|
() => {
|
|
if (professionsRef.value[0]) {
|
|
profession.value = professionsRef.value[0].label;
|
|
}
|
|
}
|
|
);
|
|
|
|
return {
|
|
profession,
|
|
professions,
|
|
professionsRef,
|
|
skillTags,
|
|
result,
|
|
eventSearch
|
|
};
|
|
});
|