专业力必修提交

This commit is contained in:
Pengxiansen
2025-01-23 23:27:54 +08:00
parent f1956e6249
commit 1bab523091
13 changed files with 1028 additions and 1020 deletions

View File

@@ -41,7 +41,8 @@ export const deleteTask = (ids) => http.get('/professional/task/delete/' + ids)
//获取岗位 //获取岗位
export const getStdPosition = (obj) => http.get('/professional/compulsory/getStdPositionList', { params: obj }) export const getStdPosition = (obj) => http.get('/professional/compulsory/getStdPositionList', { params: obj })
//获取Band
export const getBandList = (obj) => http.get('/professional/compulsory/getBandList', { params: obj })
//获取职级 //获取职级
export const getQualsLevelCode = (obj) => http.get('/professional/compulsory/getQualsLevelCodeList', { params: obj }) export const getQualsLevelCode = (obj) => http.get('/professional/compulsory/getQualsLevelCodeList', { params: obj })
@@ -74,7 +75,8 @@ export const getStudentTaskPage = (obj) => http.get('/professional/studentTask/g
// 导出任务管理学员 // 导出任务管理学员
export const exportStudentTaskPage = (obj) => http.post('/professional/studentTask/export', obj) export const exportStudentTaskPage = (obj) => http.post('/professional/studentTask/export', obj)
// 任务管理概览
export const taskInformation = (growthId) => http.get('/professional/managementOverview/taskInformation/' + growthId)

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

View File

@@ -90,7 +90,7 @@
<div class="imgBox"> <div class="imgBox">
<img <img
style="width: 20px; height: 18px" style="width: 20px; height: 18px"
src="../assets/images/navleft/studyPath.png" src="../assets/images/navleft/pathIcon.png"
/> />
</div> </div>
<router-link to="/growthpath">专业力必修</router-link> <router-link to="/growthpath">专业力必修</router-link>

View File

@@ -31,41 +31,36 @@
</div> --> </div> -->
<div class="search" style="justify-content: flex-start"> <div class="search" style="justify-content: flex-start">
<div class="sealeft"> <div class="sealeft">
<div class="namecon" style="margin-right: 30px"> <div class="namecon" style="margin-right: 16px">
<div class="name">标准岗位</div> <PostSelectNew width="200px" v-model:value="stdPosition">
<PostSelectNew width="200px" v-model:value="stdPositionId">
</PostSelectNew> </PostSelectNew>
</div> </div>
<div class="namecon" style="margin-right: 30px"> <div class="namecon" style="margin-right: 16px">
<div class="name">任职资格</div>
<OfficeSelect <OfficeSelect
v-model:value="qualsLevelCode" v-model:value="qualsLevelCode"
:searchData="stdPositionId" :searchData="stdPosition"
width="200px" width="200px"
/> />
</div> </div>
<div class="namecon" style="margin-right: 16px">
<div class="namecon" style="margin-right: 30px">
<div class="name">姓名/工号</div>
<a-input
v-model:value="name"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入姓名/工号"
/>
</div>
<div class="namecon" style="margin-right: 50px">
<div class="name">任务状态</div>
<div class="select"> <div class="select">
<a-select <a-select
v-model:value="projectName" v-model:value="projectName"
style="width: 200px" style="width: 200px"
placeholder="请选择" placeholder="任务状态"
:options="projectNameList" :options="projectNameList"
@change="selectProjectName" @change="selectProjectName"
allowClear allowClear
></a-select> ></a-select>
</div> </div>
</div> </div>
<div class="namecon" style="margin-right: 16px">
<a-input
v-model:value="name"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入姓名/工号"
/>
</div>
</div> </div>
<div class="btns"> <div class="btns">
<div <div
@@ -191,13 +186,13 @@ export default {
const state = reactive({ const state = reactive({
visible: props.Tvisible, visible: props.Tvisible,
name: "", name: "",
pageNo: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
currentPage: 1, currentPage: 1,
tableDataTotal: 0, tableDataTotal: 0,
projectName: undefined, projectName: undefined,
TASK_TYPE: TASK_TYPE, TASK_TYPE: TASK_TYPE,
stdPositionId: null, stdPosition: null,
qualsLevelCode: null, qualsLevelCode: null,
projectNameList: [ projectNameList: [
{ {
@@ -227,7 +222,7 @@ export default {
title: "工号", title: "工号",
dataIndex: "username", dataIndex: "username",
key: "username", key: "username",
width: 50, width: 80,
align: "center", align: "center",
className: "h head", className: "h head",
customRender: (text) => { customRender: (text) => {
@@ -245,7 +240,7 @@ export default {
title: "姓名", title: "姓名",
dataIndex: "userNickName", dataIndex: "userNickName",
key: "userNickName", key: "userNickName",
width: 50, width: 80,
align: "center", align: "center",
className: "h head", className: "h head",
customRender: (text) => { customRender: (text) => {
@@ -259,27 +254,11 @@ export default {
); );
}, },
}, },
{
title: "归属组织",
dataIndex: "orgName",
key: "orgName",
width: 160,
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.orgName ? text.record.orgName : "-"}</span>
</div>
);
},
},
{ {
title: "标准岗位", title: "标准岗位",
dataIndex: "stdPositionName", dataIndex: "stdPositionName",
key: "stdPositionName", key: "stdPositionName",
width: 60, width: 150,
align: "center", align: "center",
ellipsis: true, ellipsis: true,
className: "h", className: "h",
@@ -300,7 +279,7 @@ export default {
title: "任职资格", title: "任职资格",
dataIndex: "qualsLevelDesr", dataIndex: "qualsLevelDesr",
key: "qualsLevelDesr", key: "qualsLevelDesr",
width: 60, width: 80,
align: "center", align: "center",
ellipsis: true, ellipsis: true,
className: "h", className: "h",
@@ -349,22 +328,6 @@ export default {
4: "添加", 4: "添加",
}[joinMethod]), }[joinMethod]),
}, },
/** {
title: "学员关卡",
dataIndex: "currentStageName",
key: "currentStageName",
width: 60,
align: "center",
ellipsis: true,
className: "h",
customRender: () => {
return (
<div class="racona">
<span> {props.levelName}</span>
</div>
);
},
},*/
{ {
title: "完成时间", title: "完成时间",
dataIndex: "finishTime", dataIndex: "finishTime",
@@ -456,6 +419,8 @@ export default {
state.name = ""; state.name = "";
state.projectName = undefined; state.projectName = undefined;
state.tabledata = []; state.tabledata = [];
state.stdPosition = null;
state.qualsLevelCode = null;
}; };
const afterVisibleChange = (bol) => { const afterVisibleChange = (bol) => {
if (bol == true) { if (bol == true) {
@@ -494,13 +459,13 @@ export default {
// 获取数据 // 获取数据
function getData() { function getData() {
getStudentTaskPage({ getStudentTaskPage({
pageNo: state.currentPage, pageNum: state.currentPage,
pageSize: state.pageSize, pageSize: state.pageSize,
completionStatus: state.projectName, completionStatus: state.projectName,
username: state.name, username: state.name,
taskId: props.datasource.id, taskId: props.datasource.id,
qualsLevelCode: state.qualsLevelCode, qualsLevelCode: state.qualsLevelCode,
stdPositionId: state.stdPositionId, stdPosition: state.stdPosition,
}) })
.then((res) => { .then((res) => {
console.log("在线课数据获取", res); console.log("在线课数据获取", res);
@@ -528,6 +493,8 @@ export default {
state.currentPage = 1; state.currentPage = 1;
state.name = ""; state.name = "";
state.projectName = null; state.projectName = null;
state.stdPosition = null;
state.qualsLevelCode = null;
getData(); getData();
} }
@@ -540,56 +507,35 @@ export default {
// 导出数据 // 导出数据
function exportTaskStu() { function exportTaskStu() {
exportStudentTaskPage({ let params = {
pageNo: state.currentPage, pageNo: state.currentPage || "",
pageSize: state.pageSize, pageSize: state.pageSize || "",
completionStatus: state.projectName, completionStatus: state.projectName || "",
username: state.name, username: state.name || "",
taskId: props.datasource.id, taskId: props.datasource.id || "",
qualsLevelCode: state.qualsLevelCode, qualsLevelCode: state.qualsLevelCode || "",
stdPositionId: state.stdPositionId, stdPosition: state.stdPosition || "",
}).catch((err) => { };
let blob = new Blob([err.data], {
type: "application/vnd.ms-excel",
});
console.log(blob);
let url = window.URL.createObjectURL(blob);
// 创建a标签并为其添加属性
const link = document.createElement("a");
link.href = url;
link.download = `${
state.TASK_TYPE[props.datasource.taskType].name
}${props.datasource.taskName}.xlsx`;
// 触发点击事件执行下载
document.body.appendChild(link);
link.click();
// 下载完成就删掉a标签
document.body.removeChild(link);
//释放blob对象
window.URL.revokeObjectURL(url);
});
// if(props.datasource.type==1){
// {/* 在线课导出 */}
// window.open(`${process.env.VUE_APP_BASE_API}/admin/online/manage/exportOnline?chapterId=${props.datasource.stageId}&type=${1}&targetId=${props.datasource.projectId}&taskId=${props.datasource.courseId}`)
// }else if(props.datasource.taskType==11){
// {/* 评估导出 */}
// window.open(`${process.env.VUE_APP_BASE_API}/admin/assessment/manage/exportAssessmentMessage?chapterId=${props.datasource.stageId}&type=${1}&pid=${props.datasource.projectId}&courseId=${props.datasource.courseId}&taskId=${props.datasource.id}&taskType=${props.datasource.taskType}`)
// }else if(props.datasource.taskType==8){
// {/* 讨论导出 */}
// window.open(`${process.env.VUE_APP_BASE_API}/admin/student/exportDiscussStudent?chapterId=${props.datasource.stageId}&type=${1}&pid=${props.datasource.projectId}&courseId=${props.datasource.courseId}&taskId=${props.datasource.id}&taskType=${props.datasource.taskType}`)
// }else{
// window.open(`${process.env.VUE_APP_BASE_API}/admin/student/exportTaskStudent?currentStageId=${props.datasource.stageId}&type=${1}&pid=${props.datasource.projectId}&taskId=${props.datasource.id}&taskType=${props.datasource.taskType}`)
// }
// window.open( // window.open(
// `${ // buildUrl(
// process.env.VUE_APP_BASE_API // "http://192.168.18.141:32002/professional/studentTask/export",
// }/admin/online/manage/exportOnline?type=${14}&targetId=${ // params
// props.datasource.targetId // )
// }&taskId=${props.datasource.courseId}`
// ); // );
window.open(
buildUrl(
`${process.env.VUE_APP_BOE_API_URL}${process.env.VUE_APP_BASE_API_GROWTH}/professional/studentTask/export`,
params
)
);
}
function buildUrl(url, params) {
const searchParams = new URLSearchParams();
Object.keys(params).forEach((key) => {
searchParams.append(key, params[key]);
});
return `${url}?${searchParams.toString()}`;
} }
return { return {
...toRefs(state), ...toRefs(state),
selectProjectName, selectProjectName,

View File

@@ -56,9 +56,9 @@
</div> </div>
</div> </div>
<div class="mi_btns" style="margin-left: 0px"> <div class="mi_btns" style="margin-left: 0px">
<div class="btn btn1"> <div class="btn btn1" @click="search">
<div class="search"></div> <div class="search"></div>
<div class="btnText" @click="search">搜索</div> <div class="btnText">搜索</div>
</div> </div>
<div class="btn btn2" @click="reset"> <div class="btn btn2" @click="reset">
<div class="search"></div> <div class="search"></div>
@@ -321,7 +321,6 @@ defineExpose({ openDrawer });
margin-bottom: 20px; margin-bottom: 20px;
color: #fff; color: #fff;
} }
} }
} }

View File

@@ -8,7 +8,7 @@
> >
<div class="drawerMain" id="ProjCheckship" style=""> <div class="drawerMain" id="ProjCheckship" style="">
<div class="header" style="margin-bottom: 20px"> <div class="header" style="margin-bottom: 20px">
<div class="headerTitle">归属权转移</div> <div class="headerTitle">{{ title }}</div>
<img <img
style="width: 29px; height: 29px; cursor: pointer" style="width: 29px; height: 29px; cursor: pointer"
src="../../assets/images/basicinfo/close.png" src="../../assets/images/basicinfo/close.png"
@@ -98,7 +98,11 @@
<template #action="{ record }"> <template #action="{ record }">
<a-space :size="2"> <a-space :size="2">
<a-button <a-button
v-if="type == 17 && record.permission != 17" v-if="
type == 17 &&
record.permission != 17 &&
record.userId != state.userInfo.userId
"
style="margin-right: 12px" style="margin-right: 12px"
type="link" type="link"
@click="setPermissions(record)" @click="setPermissions(record)"
@@ -106,11 +110,15 @@
> >
<a-button <a-button
v-else-if="type !== 17 && record.permission" v-else-if="
type !== 17 &&
record.userId != state.userInfo.userId &&
record.permission == type
"
@click="del(record)" @click="del(record)"
type="link" type="link"
danger danger
>删除</a-button >移除权限</a-button
> >
<div v-else>--</div> <div v-else>--</div>
</a-space> </a-space>
@@ -161,13 +169,16 @@ import {
assignPermissions, assignPermissions,
delAssignPermissions, delAssignPermissions,
} from "@/api/growthpath"; } from "@/api/growthpath";
import { useStore } from "vuex";
import { delStudentList } from "@/api/index1"; import { delStudentList } from "@/api/index1";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import dialog from "@/utils/dialog"; import dialog from "@/utils/dialog";
const { state } = useStore();
console.log(state, "sssssssssss");
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
id: String, id: String,
title: String,
}); });
const visiable = ref(false); const visiable = ref(false);

View File

@@ -93,21 +93,21 @@
</div> </div>
<div class="cancel" style="margin-left: 15px"></div> <div class="cancel" style="margin-left: 15px"></div>
</div> </div>
<div v-if="downloadErrUrl !== ''" class="defeat"> <!-- <div v-if="downloadErrUrl !== ''" class="defeat">
<div class="detext" @click="downloadEeeorData"> <div class="detext" @click="downloadEeeorData">
下载失败数据 下载失败数据
</div> </div>
</div> </div> -->
<div <!-- <div
v-if="notMatchUrl != ''" v-if="notMatchUrl != ''"
:style="{ left: downloadErrUrl !== '' ? '181px' : '46px' }" :style="{ left: downloadErrUrl !== '' ? '181px' : '46px' }"
class="defeat2" class="defeat2"
> >
<div class="detext" @click="notDown">下载不匹配的学员</div> <div class="detext" @click="notDown">下载不匹配的学员</div>
</div> -->
</div> </div>
</div> </div>
</div> <!-- <div
<div
v-if="showBottomBar" v-if="showBottomBar"
:class="downloadErrUrl == '' ? 'succebox' : 'defeatbox'" :class="downloadErrUrl == '' ? 'succebox' : 'defeatbox'"
> >
@@ -117,26 +117,26 @@
downloadErrUrl == "" ? 0 : errNum downloadErrUrl == "" ? 0 : errNum
}}条数据解析失败 }}条数据解析失败
</div> </div>
</div> </div> -->
<div v-if="showBottomBar && notMatchUrl != ''" class="group_data"> <!-- <div v-if="showBottomBar && notMatchUrl != ''" class="group_data">
<div class="icon"> <div class="icon">
<RightCircleFilled style="color: #4ea6ff; fontsize: 18px" /> <RightCircleFilled style="color: #4ea6ff; fontsize: 18px" />
</div> </div>
<div class="text"> <div class="text">
待导入学员的岗位与本专业力必修的要求不匹配是否导入 待导入学员的岗位与本专业力必修的要求不匹配是否导入
</div> </div>
<div class="right"> <div class="right"> -->
<!-- <a-radio-group size="small" v-model:value="groupValue" button-style="solid"> <!-- <a-radio-group size="small" v-model:value="groupValue" button-style="solid">
<a-radio-button style="margin-right:20px;width: 50px;text-align: center;" value="1"></a-radio-button> <a-radio-button style="margin-right:20px;width: 50px;text-align: center;" value="1"></a-radio-button>
<a-radio-button style="width: 50px;text-align: center;" value="0"></a-radio-button> <a-radio-button style="width: 50px;text-align: center;" value="0"></a-radio-button>
</a-radio-group> --> </a-radio-group> -->
<a-switch <!-- <a-switch
v-model:checked="groupValue" v-model:checked="groupValue"
checkedChildren="是" checkedChildren="是"
unCheckedChildren="否" unCheckedChildren="否"
/> />
</div> </div>
</div> </div> -->
<!-- <div class="loadborder"> <!-- <div class="loadborder">
<div class="content"> <div class="content">
<div class="img"></div> <div class="img"></div>
@@ -205,7 +205,7 @@
import { computed, reactive, toRefs } from "vue"; import { computed, reactive, toRefs } from "vue";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
import { import {
getImportStatus, // getImportStatus,
saveStudent, saveStudent,
downLoadImpTemplate, downLoadImpTemplate,
} from "@/api/growthpath"; } from "@/api/growthpath";
@@ -235,10 +235,10 @@ export default {
const store = useStore(); const store = useStore();
const state = reactive({ const state = reactive({
redisKey: "", redisKey: "",
locationHref: process.env.VUE_APP_BASE_API,
template: process.env.VUE_APP_UP_LOAD_STUDENT_TEMPLATE,
importStudent: importStudent:
process.env.VUE_APP_BASE_API + "/professional/allocation/importLearner", process.env.VUE_APP_BOE_API_URL +
process.env.VUE_APP_BASE_API_GROWTH +
"/professional/allocation/importLearner",
timers: "", // 定时器,用于清空定时器使用 timers: "", // 定时器,用于清空定时器使用
isAddStudent: false, // 用于判断用户是否关闭弹框需要重新获取学员列表 isAddStudent: false, // 用于判断用户是否关闭弹框需要重新获取学员列表
uploadpercent: -1, uploadpercent: -1,
@@ -293,28 +293,11 @@ export default {
state.isAddStudent = false; state.isAddStudent = false;
}; };
const downloadTemplate = () => { const downloadTemplate = () => {
downLoadImpTemplate().catch((err) => { window.open(
let blob = new Blob([err.data], { `${process.env.VUE_APP_BOE_API_URL}${process.env.VUE_APP_BASE_API_GROWTH}/professional/allocation/downloadTemplate.do`
type: "application/vnd.ms-excel", );
});
console.log(blob);
let url = window.URL.createObjectURL(blob);
// 创建a标签并为其添加属性
const link = document.createElement("a");
link.href = url;
link.download = "专业力必修-录入学员模版.xlsx";
// 触发点击事件执行下载
document.body.appendChild(link);
link.click();
// 下载完成就删掉a标签
document.body.removeChild(link);
//释放blob对象
window.URL.revokeObjectURL(url);
});
// window.open( // window.open(
// `${process.env.VUE_APP_BOE_API_URL}/upload/files/2024/7/专业力必修-录入学员模版.xlsx` // `http://192.168.18.141:32002/professional/allocation/downloadTemplate.do`
// ); // );
}; };
@@ -370,36 +353,36 @@ export default {
message.error(info.file.response.msg); message.error(info.file.response.msg);
return; return;
} }
state.timers = setInterval(() => { // state.timers = setInterval(() => {
state.redisKey = info.file.response.data; // state.redisKey = info.file.response.data;
getImportStatus({ redisKey: state.redisKey }) // getImportStatus({ redisKey: state.redisKey })
.then((res) => { // .then((res) => {
console.log("查询导入状态", res); // console.log("查询导入状态", res);
if (res.data.code === 200) { // if (res.data.code === 200) {
if (res.data.data.status !== "START") { // if (res.data.data.status !== "START") {
i++; // i++;
if (i === 1) { // if (i === 1) {
message.destroy(); // message.destroy();
// message.success(`${info.file.name}解析成功`); // // message.success(`${info.file.name}解析成功`);
state.showBottomBar = true; // state.showBottomBar = true;
state.addLoading = false; // state.addLoading = false;
state.isAddStudent = true; // state.isAddStudent = true;
} // }
state.succNum = res.data.data.successNum; // state.succNum = res.data.data.successNum;
state.errNum = res.data.data.failedNum; // state.errNum = res.data.data.failedNum;
state.downloadErrUrl = res.data.data.url; // state.downloadErrUrl = res.data.data.url;
state.notMatchUrl = res.data.data.notMatchUrl; // state.notMatchUrl = res.data.data.notMatchUrl;
clearInterval(state.timers); // clearInterval(state.timers);
} // }
} // }
}) // })
.catch((err) => { // .catch((err) => {
clearInterval(state.timers); // clearInterval(state.timers);
state.showBottomBar = true; // state.showBottomBar = true;
state.addLoading = false; // state.addLoading = false;
console.log("查询导入状态失败", err); // console.log("查询导入状态失败", err);
}); // });
}, 500); // }, 500);
} else if (status === "error") { } else if (status === "error") {
state.addLoading = false; state.addLoading = false;
state.uploadErr = true; state.uploadErr = true;

View File

@@ -45,7 +45,7 @@ export default {
default: false, default: false,
}, },
}, },
emits: ["update:value"], emits: ["update:value", "change"],
setup(props, { emit }) { setup(props, { emit }) {
const selectedValue = ref(null); const selectedValue = ref(null);
const options = ref([]); const options = ref([]);
@@ -71,6 +71,7 @@ export default {
(val) => { (val) => {
if (val) { if (val) {
fetchOptions(props.searchData || ""); fetchOptions(props.searchData || "");
emit("update:value", null);
} }
} }
); );
@@ -82,6 +83,7 @@ export default {
); );
function onSelectChange(newVal, postList) { function onSelectChange(newVal, postList) {
emit("update:value", newVal); emit("update:value", newVal);
emit("change");
} }
async function handleSearch(val) { async function handleSearch(val) {
console.log(val, "val"); console.log(val, "val");

View File

@@ -5,10 +5,20 @@
gutter="12" gutter="12"
style="padding-left: 20px; margin-right: 0px" style="padding-left: 20px; margin-right: 0px"
> >
<a-col>
<a-form-item title="归属组织" style="min-width: 170px">
<div class="select in">
<OrgClass
v-model:value="tableParam.organizationId"
:placeName="'请选择归属组织'"
></OrgClass>
</div>
</a-form-item>
</a-col>
<a-col> <a-col>
<a-form-item title="选择岗位" style="min-width: 170px"> <a-form-item title="选择岗位" style="min-width: 170px">
<div class="select in"> <div class="select in">
<PostSelect v-model:value="tableParam.qualsLevelCode"> </PostSelect> <PostSelect v-model:value="tableParam.stdPosition"> </PostSelect>
</div> </div>
</a-form-item> </a-form-item>
</a-col> </a-col>
@@ -16,20 +26,21 @@
<a-form-item title="选择职级" style="min-width: 170px"> <a-form-item title="选择职级" style="min-width: 170px">
<div class="select in"> <div class="select in">
<OfficeSelect <OfficeSelect
v-model:value="tableParam.stdPosition" v-model:value="tableParam.qualsLevelCode"
:searchData="tableParam.qualsLevelCode" :searchData="tableParam.stdPosition"
@change="officeSelectChange"
></OfficeSelect> ></OfficeSelect>
</div> </div>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col> <a-col>
<a-form-item title="加入方式" style="width: 193px"> <a-form-item title="Band职级" style="width: 193px">
<div class="select in"> <div class="select in">
<a-select <a-select
v-model:value="tableParam.joinMethod" v-model:value="tableParam.bandCode"
placeholder="请选择加入方式" placeholder="请选择Band职级"
:options="statusValues" :options="bandOption"
@change="selectstatusValue" notFoundContent="请先选择任职资格"
allowClear allowClear
></a-select> ></a-select>
</div> </div>
@@ -39,11 +50,23 @@
<a-form-item title="姓名:" style="width: 170px"> <a-form-item title="姓名:" style="width: 170px">
<a-input <a-input
class="cus-input" class="cus-input"
v-model:value="tableParam.keyword" v-model:value="tableParam.username"
placeholder="请输入姓名" placeholder="请输入姓名/工号"
/> />
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col>
<a-form-item title="加入方式" style="width: 193px">
<div class="select in">
<a-select
v-model:value="tableParam.joinMethod"
placeholder="请选择加入方式"
:options="statusValues"
allowClear
></a-select>
</div>
</a-form-item>
</a-col>
<a-col> <a-col>
<a-button <a-button
class="cus-btn" class="cus-btn"
@@ -93,7 +116,6 @@
:id="id" :id="id"
@confirm="submitCall" @confirm="submitCall"
:stage="stage" :stage="stage"
:coulmsList="coulmsList"
:selectStu="true" :selectStu="true"
> >
<a-button class="cus-btn" style="background: #4ea6ff; color: #fff"> <a-button class="cus-btn" style="background: #4ea6ff; color: #fff">
@@ -102,7 +124,7 @@
style="margin-right: 10px" style="margin-right: 10px"
src="../../assets/images/courseManage/add0.png" src="../../assets/images/courseManage/add0.png"
/></template> /></template>
添加学员 新增学员
</a-button> </a-button>
</GrowthCommonStudent> </GrowthCommonStudent>
</a-col> </a-col>
@@ -132,7 +154,7 @@
style="margin-right: 10px" style="margin-right: 10px"
src="../../assets/images/projectadd/delete.png" src="../../assets/images/projectadd/delete.png"
/></template> /></template>
批量删除 批量删除学员
</a-button> </a-button>
</a-col> </a-col>
<a-col :span="1.5"> <a-col :span="1.5">
@@ -149,21 +171,6 @@
导出学员信息 导出学员信息
</a-button> </a-button>
</a-col> </a-col>
<!-- <a-col :span="1.5">
<a-button
class="cus-btn"
@click="showTexts"
style="background: #ffffff; color: #578afc; border: 1px solid #578afc"
>
<template #icon
><img
style="margin-right: 10px"
src="../../assets/images/projectadd/edit.png"
/></template>
导入记录
</a-button>
</a-col> -->
</a-row> </a-row>
<div class="tips"> <div class="tips">
@@ -260,11 +267,6 @@
:courseId="id" :courseId="id"
:courseType="type" :courseType="type"
/> />
<!-- <GrowShowText
:permissions="permissions"
@isSearchList="isSearchLists"
v-model:showText="showText"
/> -->
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import { computed, defineProps, onMounted, ref, watch } from "vue"; import { computed, defineProps, onMounted, ref, watch } from "vue";
@@ -275,6 +277,7 @@ import {
batchDelStudents, batchDelStudents,
allocationList, allocationList,
addLearners, addLearners,
getBandList,
} from "@/api/growthpath"; } from "@/api/growthpath";
import GrowthCommonStudent from "./GrowthCommonStudent"; import GrowthCommonStudent from "./GrowthCommonStudent";
import { message } from "ant-design-vue"; import { message } from "ant-design-vue";
@@ -284,7 +287,7 @@ import { checkGrowthPer } from "@/utils/utils";
import dialog from "@/utils/dialog"; import dialog from "@/utils/dialog";
import PostSelect from "@/components/growthpath/PostSelect"; import PostSelect from "@/components/growthpath/PostSelect";
import OfficeSelect from "@/components/growthpath/OfficeSelect"; import OfficeSelect from "@/components/growthpath/OfficeSelect";
import GrowShowText from "@/components/growthpath/GrowShowText"; import OrgClass from "@/components/growthpath/OrgClass";
const props = defineProps({ const props = defineProps({
type: Number, type: Number,
permissions: { permissions: {
@@ -316,35 +319,41 @@ const props = defineProps({
type: Array, type: Array,
default: () => [], default: () => [],
}, },
params: {
type: Object,
default: () => ({}),
},
growId: String, growId: String,
}); });
// const { loading: stuAsyncLoading, start } = useAsyncStu(props.id, props.type, getStuList); // const { loading: stuAsyncLoading, start } = useAsyncStu(props.id, props.type, getStuList);
const topFlagList = ref([
{
id: 0,
value: 0,
label: "普通学员",
},
{
id: 1,
value: 1,
label: "优秀学员",
},
]);
const visibleName = ref([]); const visibleName = ref([]);
// band职级选项
const bandOption = ref([]);
// 加入方式选项
const statusValues = ref([ const statusValues = ref([
{ value: "0", label: "岗位匹配" }, { value: "1", label: "自动匹配" },
{ value: "1", label: "手动加入" }, { value: "2", label: "手动匹配" },
{ value: "3", label: "导入" },
{ value: "4", label: "添加" },
]); ]);
const getRowClass = (record) => { const getRowClass = (record) => {
return record.moveStatus ? "row-moveStatus-true" : ""; return record.moveStatus ? "row-moveStatus-true" : "";
}; };
// 职级change
const officeSelectChange = () => {
getBandList({
stdPosition: tableParam.value.stdPosition,
qualsLevelCode: tableParam.value.qualsLevelCode,
}).then((res) => {
// 清空筛选band职级的值
tableParam.value.bandCode = null;
bandOption.value = res.data.data.map((item) => {
return {
value: item,
lable: item,
};
});
});
};
const tablecolumns = ref([ const tablecolumns = ref([
{ {
title: "姓名", title: "姓名",
@@ -367,32 +376,39 @@ const tablecolumns = ref([
}, },
{ {
title: "归属组织", title: "归属组织",
dataIndex: "studentOrgName", dataIndex: "orgName",
key: "studentOrgName", key: "orgName",
width: 230, width: 230,
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true, ellipsis: true,
}, },
{ {
title: "岗位", title: "标准岗位",
dataIndex: "studentJobName", dataIndex: "stdPositionName",
key: "studentJobName", key: "stdPositionName",
width: 170, width: 170,
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true, ellipsis: true,
}, },
{ {
title: "Band", title: "任职资格等级",
dataIndex: "studentBandCode", dataIndex: "qualsLevelDesr",
key: "studentBandCode", key: "qualsLevelDesr",
width: 100,
align: "center",
className: "h",
ellipsis: true,
},
{
title: "Band职级",
dataIndex: "bandName",
key: "bandName",
width: 100, width: 100,
align: "center", align: "center",
className: "h", className: "h",
ellipsis: true, ellipsis: true,
// customRender: ({ record: { studentOrgName, studentDepartName } }) =>
// allDepartShow(studentOrgName, studentDepartName),
}, },
{ {
title: "加入方式", title: "加入方式",
@@ -403,7 +419,7 @@ const tablecolumns = ref([
customRender: ({ record: { joinMethod } }) => customRender: ({ record: { joinMethod } }) =>
({ ({
1: "自动匹配", 1: "自动匹配",
2: "手动添加", 2: "手动匹配",
3: "导入", 3: "导入",
4: "添加", 4: "添加",
}[joinMethod]), }[joinMethod]),
@@ -412,17 +428,15 @@ const tablecolumns = ref([
title: "进度", title: "进度",
width: 100, width: 100,
align: "center", align: "center",
dataIndex: "finishNeedfinish", dataIndex: "progress",
key: "finishNeedfinish", key: "progress",
className: "h", className: "h",
customRender: ({ record }) => ( customRender: ({ record }) => (
<div class="text"> <div class="text">{record.progress || 0}%</div>
{record.finishTaskNum || 0}/{record.needFinishTaskNum || 0}
</div>
), ),
}, },
{ {
title: "状态", title: "完成状态",
dataIndex: "finishStatus", dataIndex: "finishStatus",
key: "finishStatus", key: "finishStatus",
width: 100, width: 100,
@@ -447,56 +461,12 @@ const tablecolumns = ref([
}, },
]); ]);
function allDepartShow(a, b) {
let org =
a == "" || a == null || a == undefined
? (a = "")
: a.slice(0, 1) == "/"
? a.slice(1, a.length)
: a;
let depart = b == "" || b == null || b == undefined ? (b = "") : b;
let allname = org == "" && depart == "" ? "-" : org + depart;
return allname;
}
const isSearchLists = (item) => {
console.log(item, "item");
getStuList();
};
const coulmsList = ref([
{
title: "岗位",
dataIndex: "jobName",
key: "jobName",
width: 80,
align: "center",
className: "h",
ellipsis: true,
},
{
title: "职级",
dataIndex: "bandCode",
key: "bandCode",
width: 80,
align: "center",
className: "h",
ellipsis: true,
},
]);
const tableParam = ref({ const tableParam = ref({
joinMethod: null, username: "", //学员名称
keyword: "", //学员名称
// groupName: "", //学员小组
// studentDepartName: null, //部门名称
topFlag: null, //是否是优秀学员
pageNum: 1, pageNum: 1,
status: 1,
pageSize: 10, pageSize: 10,
type: props.type, type: props.type,
// pid: props.id,
growthId: props.growId, growthId: props.growId,
...props.params,
bandCodeList: "",
positionNameList: "",
}); });
const stuSelectKeys = ref([]); const stuSelectKeys = ref([]);
@@ -520,19 +490,26 @@ function search() {
// 导出数据 // 导出数据
function exportTaskStu() { function exportTaskStu() {
console.log("props.datasource", props);
window.open( window.open(
`${ buildUrl(
process.env.VUE_APP_BASE_API `${process.env.VUE_APP_BOE_API_URL}${process.env.VUE_APP_BASE_API_GROWTH}/professional/allocation/export`,
}/admin/student/exportTaskStudent?type=${14}&pid=${props.id}` tableParam.value
)
); );
// window.open(
// buildUrl(
// "http://192.168.18.141:32002/professional/allocation/export",
// tableParam.value
// )
// );
}
function buildUrl(url, params) {
const searchParams = new URLSearchParams();
Object.keys(params).forEach((key) => {
searchParams.append(key, params[key]);
});
return `${url}?${searchParams.toString()}`;
} }
const showText = ref(false);
const showTexts = () => {
showText.value = true;
};
onMounted(() => { onMounted(() => {
// debugger // debugger
console.log("props.activeKey1" + props.activeKey1); console.log("props.activeKey1" + props.activeKey1);
@@ -587,14 +564,14 @@ function getStuList() {
} }
function reset() { function reset() {
tableParam.value.keyword = ""; tableParam.value.username = "";
// tableParam.value.groupName = ""; //学员小组 // tableParam.value.groupName = ""; //学员小组
tableParam.value.topFlag = null; //是否是优秀学员 tableParam.value.topFlag = null; //是否是优秀学员
tableParam.value.bandCodeList = "";
tableParam.value.positionNameList = "";
tableParam.value.joinMethod = null; tableParam.value.joinMethod = null;
tableParam.value.qualsLevelCode = null; tableParam.value.qualsLevelCode = null;
tableParam.value.stdPosition = null; tableParam.value.stdPosition = null;
tableParam.value.organizationId = null;
tableParam.value.bandCode = null;
getStuList(); getStuList();
} }
@@ -646,7 +623,6 @@ function del(row) {
}); });
} }
function submitCall(selectList) { function submitCall(selectList) {
tableData.value.loading = true; tableData.value.loading = true;
addLearners({ addLearners({

View File

@@ -18,7 +18,7 @@
<div class="header_top"> <div class="header_top">
<div class="pathnameInp"> <div class="pathnameInp">
<a-input <a-input
v-model:value="nameUserNo" v-model:value="username"
style="width: 270px; height: 40px; border-radius: 8px" style="width: 270px; height: 40px; border-radius: 8px"
placeholder="请输入操作人姓名/工号" placeholder="请输入操作人姓名/工号"
/> />
@@ -30,6 +30,7 @@
separator="至" separator="至"
:placeholder="[' 开始时间', ' 结束时间']" :placeholder="[' 开始时间', ' 结束时间']"
@change="searchTimeChange" @change="searchTimeChange"
valueFormat="YYYY-MM-DD"
/> />
</div> </div>
<div style="display: flex; margin-bottom: 20px"> <div style="display: flex; margin-bottom: 20px">
@@ -62,13 +63,15 @@ export default {
name: "UpdateRecord", name: "UpdateRecord",
setup(props, ctx) { setup(props, ctx) {
const state = reactive({ const state = reactive({
nameUserNo: null, username: null,
searchdate: [], searchdate: [],
avisible: false, avisible: false,
growthId: null, growthId: null,
pageSize: 10, pageSize: 10,
pageNum: 1, pageNum: 1,
total: 0, total: 0,
startTime: "",
endTime: "",
}); });
const pagination = computed(() => ({ const pagination = computed(() => ({
total: state.total, total: state.total,
@@ -83,6 +86,9 @@ export default {
growthId: state.growthId, growthId: state.growthId,
pageSize: state.pageSize, pageSize: state.pageSize,
pageNum: state.pageNum, pageNum: state.pageNum,
username: state.username,
startTime: state.startTime,
endTime: state.endTime,
}).then((res) => { }).then((res) => {
console.log(res); console.log(res);
tableData.value = res.data.data.records; tableData.value = res.data.data.records;
@@ -117,19 +123,28 @@ export default {
align: "center", align: "center",
}, },
]); ]);
const searchTimeChange = (e) => { const searchTimeChange = (date) => {
console.log(e, "eeeee"); console.log(date);
if (date) {
state.startTime = date[0] + " 00:00:00";
state.endTime = date[1] + " 23:59:59";
} else {
state.startTime = "";
state.endTime = "";
}
}; };
const resetLearnPath = () => { const resetLearnPath = () => {
state.nameUserNo = null; state.username = null;
state.searchdate = []; state.searchdate = [];
state.pageNum = 1; state.pageNum = 1;
getList(); getList();
}; };
const closeDrawer = () => { const closeDrawer = () => {
state.nameUserNo = null; state.username = null;
state.searchdate = []; state.searchdate = [];
state.avisible = false; state.avisible = false;
state.startTime = "";
state.endTime = "";
}; };
const open = (row) => { const open = (row) => {
state.growthId = row.id; state.growthId = row.id;

View File

@@ -1,5 +1,6 @@
<template> <template>
<div class="editing-tasks"> <div class="editing-tasks">
<a-spin :spinning="spinning">
<div style="display: flex"> <div style="display: flex">
<div class="right"> <div class="right">
<div class="addhead"> <div class="addhead">
@@ -8,12 +9,11 @@
<div class="imgfor"> <div class="imgfor">
<div class="fort" style="color: #333333; font-size: 16px"> <div class="fort" style="color: #333333; font-size: 16px">
{{ {{
`${basicData?.organizationName || ""}${ `${basicData?.stdPosition || ""}${
basicData?.stdPosition || "" basicData?.qualsLevelDesr || ""
}${basicData?.qualsLevelDesr || ""}` }`
}} }}
</div> </div>
<div class="fort">归属组织{{ basicData?.ownershipOrg }}</div>
<div class="fort">创建时间{{ basicData?.createTime }}</div> <div class="fort">创建时间{{ basicData?.createTime }}</div>
</div> </div>
</div> </div>
@@ -78,6 +78,13 @@
<div class="title"> <div class="title">
<div class="tit_left"> <div class="tit_left">
<span>任务列表</span> <span>任务列表</span>
<div class="tips" v-show="activeKey == 2">
<div>提示该专业力必修的学员需完成</div>
<div style="color: #ee8237; margin: 0 4px">
{{ basicData.electivesCompletedNum }}
</div>
<div>个选修任务</div>
</div>
</div> </div>
<div <div
v-if="listDatas.length != 0" v-if="listDatas.length != 0"
@@ -236,7 +243,9 @@
<div class="boxbody"> <div class="boxbody">
<div class="boximg"></div> <div class="boximg"></div>
<div class="boxtitle"> <div class="boxtitle">
<span style="color: #ffb64e; font-size: 20px">无任务</span> <span style="color: #ffb64e; font-size: 20px"
>无任务</span
>
</div> </div>
<div class="boxtitle2"> <div class="boxtitle2">
<span style="color: #878b92">请点击上方创建任务</span> <span style="color: #878b92">请点击上方创建任务</span>
@@ -251,7 +260,7 @@
</div> </div>
</div> </div>
</div> </div>
</a-spin>
</div> </div>
</template> </template>
<script setup> <script setup>
@@ -329,14 +338,21 @@ const dataListUp = (val) => {
getListTask(); getListTask();
}; };
const listDatas = ref([]); const listDatas = ref([]);
const spinning = ref(false);
const getListTask = () => { const getListTask = () => {
spinning.value = true;
notPublishedTaskList({ notPublishedTaskList({
growthId: growId, growthId: growId,
type: activeKey.value, type: activeKey.value,
}).then((res) => { })
.then((res) => {
if (res.data.code === 200) { if (res.data.code === 200) {
listDatas.value = res.data.data.records; listDatas.value = res.data.data.records;
} }
spinning.value = false;
})
.catch((err) => {
spinning.value = false;
}); });
}; };
@@ -601,8 +617,14 @@ const withdraw = (element) => {
font-size: 16px; font-size: 16px;
font-weight: 500; font-weight: 500;
color: #363636; color: #363636;
line-height: 36px; line-height: 24px;
// margin-top: 30px; // margin-top: 30px;
.tips {
display: flex;
align-items: center;
font-size: 12px;
color: #999;
}
} }
.tit_right { .tit_right {

View File

@@ -5,9 +5,6 @@
<PostSelectNew v-model:value="statusPost"> </PostSelectNew> <PostSelectNew v-model:value="statusPost"> </PostSelectNew>
</div> </div>
<div class="select multi" style="min-width: 181px; height: 40px"> <div class="select multi" style="min-width: 181px; height: 40px">
<!-- <RankSelect
v-model:value="statusRank"
></RankSelect> -->
<OfficeSelect v-model:value="statusOffice" :searchData="statusPost" /> <OfficeSelect v-model:value="statusOffice" :searchData="statusPost" />
</div> </div>
<div class="select"> <div class="select">
@@ -62,13 +59,13 @@
>管理</a-button >管理</a-button
> >
<DropDown v-if="record?.permissions?.includes('17')" value="授权"> <DropDown v-if="record?.permissions?.includes('17')" value="授权">
<TableModelStudent :id="record.id" :type="17" <TableModelStudent :id="record.id" title="转移归属权" :type="17"
>归属权</TableModelStudent >归属权</TableModelStudent
> >
<TableModelStudent :id="record.id" :type="15" <TableModelStudent :id="record.id" title="添加查看权" :type="15"
>查看权</TableModelStudent >查看权</TableModelStudent
> >
<TableModelStudent :id="record.id" :type="16" <TableModelStudent :id="record.id" title="添加管理权" :type="16"
>管理权</TableModelStudent >管理权</TableModelStudent
> >
</DropDown> </DropDown>
@@ -153,11 +150,7 @@
<span>标准岗位</span> <span>标准岗位</span>
</div> </div>
<div class="bg_body_input"> <div class="bg_body_input">
<PostSelectNew <PostSelectNew v-model:value="statusPosts" width="384px" disabled>
v-model:value="statusPosts"
width="384px"
:disabled="editId"
>
</PostSelectNew> </PostSelectNew>
</div> </div>
</div> </div>
@@ -173,7 +166,7 @@
</div> </div>
<div class="bg_body_input"> <div class="bg_body_input">
<OfficeSelect <OfficeSelect
:disabled="editId" disabled
width="384px" width="384px"
:searchData="statusPosts" :searchData="statusPosts"
@bandCodes="getBandCodes" @bandCodes="getBandCodes"
@@ -250,10 +243,9 @@
<div class="bg_body_input"> <div class="bg_body_input">
<a-radio-group v-model:value="template"> <a-radio-group v-model:value="template">
<div style="display: flex"> <div style="display: flex">
<a-radio :value="1" style="margin-bottom: 15px" <a-radio value="1" style="margin-bottom: 15px">路径图</a-radio
>路径图</a-radio
><br /> ><br />
<a-radio :value="2">任务列表</a-radio> <a-radio value="2">任务列表</a-radio>
</div> </div>
</a-radio-group> </a-radio-group>
</div> </div>
@@ -348,6 +340,7 @@ export default {
statusRankCreate: [], statusRankCreate: [],
courseNum: "", courseNum: "",
matStudens: "", matStudens: "",
elePublishedNum: 0, // 选修发布数量
pathWays: "", pathWays: "",
statusPost: null, statusPost: null,
matchRules: "1", matchRules: "1",
@@ -446,10 +439,10 @@ export default {
let params = { let params = {
pageNum: state.pageNum, pageNum: state.pageNum,
pageSize: state.pageSize, pageSize: state.pageSize,
stdPosition: state.statusOffice, stdPosition: state.statusPost,
isPublished: state.statusValue, isPublished: state.statusValue,
bandIdList: state.statusRank, //职级 bandIdList: state.statusRank, //职级
qualsLevelCode: state.statusPost, qualsLevelCode: state.statusOffice,
}; };
console.log(store); console.log(store);
// 判断当前用户是否是专业力必修角色管理员,如果不是查询列表时需传入员工工号 // 判断当前用户是否是专业力必修角色管理员,如果不是查询列表时需传入员工工号
@@ -491,18 +484,22 @@ export default {
state.statusPosts = record.stdPosition; state.statusPosts = record.stdPosition;
state.statusOffices = record.qualsLevelCode; state.statusOffices = record.qualsLevelCode;
state.courseNum = record.electivesCompletedNum; state.courseNum = record.electivesCompletedNum;
state.elePublishedNum = record.elePublishedNum;
state.pathWays = record.description; state.pathWays = record.description;
state.band = record.bandCodes; state.band = record.bandCodes;
state.matchRules = record.matchRules; state.matchRules = record.matchRules || "1";
state.template = state.template || "1";
state.bg_check = true; state.bg_check = true;
}; };
// 确定 // 确定
const confirm = () => { const confirm = () => {
if (state.statusPosts == "" || state.statusPosts == null) { if (state.courseNum !== 0 && !state.courseNum) {
return message.error("请选择岗位"); return message.error("请输入完成选修数量");
} }
if (state.statusOffices == "" || state.statusRanks == null) { if (state.courseNum > state.elePublishedNum) {
return message.error("请选择任职资格等级"); message.warning("完成选修数量不能大于已发布的选修数量");
state.courseNum = state.elePublishedNum;
return;
} }
const params = { const params = {
stdPosition: state.statusPosts, stdPosition: state.statusPosts,

View File

@@ -1,15 +1,15 @@
<template> <template>
<div class="path-manage"> <div class="path-manage">
<a-spin :spinning="spinning">
<div class="addhead"> <div class="addhead">
<div class="imgfor"> <div class="imgfor">
<div class="fort" style="color: #333333; font-size: 16px"> <div class="fort" style="color: #333333; font-size: 16px">
{{ {{
`${basicData?.organizationName || ""}${ `${basicData?.stdPositionName || ""}${
basicData?.stdPosition || "" basicData?.qualsLevelDesr || ""
}${basicData?.qualsLevelDesr || ""}` }`
}} }}
</div> </div>
<div class="fort">归属组织{{ basicData?.ownershipOrg }}</div>
<div class="fort">创建时间{{ basicData?.createTime }}</div> <div class="fort">创建时间{{ basicData?.createTime }}</div>
</div> </div>
<div class="right"> <div class="right">
@@ -23,7 +23,11 @@
class="img2" class="img2"
src="../../assets/images/growthpath/push.png" src="../../assets/images/growthpath/push.png"
/> />
<img v-else class="img2" src="../../assets/images/leveladd/pub.png" /> <img
v-else
class="img2"
src="../../assets/images/leveladd/pub.png"
/>
<!-- 已发布的显示 --> <!-- 已发布的显示 -->
<div <div
class="pub" class="pub"
@@ -53,7 +57,7 @@
> >
<a-tab-pane key="1" tab="概览" style="position: relative"> <a-tab-pane key="1" tab="概览" style="position: relative">
<!-- 概览无数据 --> <!-- 概览无数据 -->
<div v-if="!listTaskData.length" style="display: flex"> <div v-if="!basicData.publishedTaskNum" style="display: flex">
<div class="secondadd" v-if="checkGrowthPer(preId)"> <div class="secondadd" v-if="checkGrowthPer(preId)">
<div style="width: 368px; height: 22px" class="addtaskmain"> <div style="width: 368px; height: 22px" class="addtaskmain">
快速创建专业力必修任务详情 快速创建专业力必修任务详情
@@ -137,26 +141,29 @@
<a-progress <a-progress
type="dashboard" type="dashboard"
gapDegree="0" gapDegree="0"
:percent="fixDoublePer(overviewData?.examCompleteRatio || 0)" :percent="
fixDoublePer(overviewData?.examCompleteRatio || 0)
"
:width="140" :width="140"
/> />
<div class="protext">考试通过率</div> <div class="protext">考试通过率</div>
</div> </div>
<!-- <div class="stagepro"> <div class="stagepro">
<a-progress <a-progress
type="dashboard" type="dashboard"
gapDegree="0" gapDegree="0"
:percent="fixDoublePer(overviewData || 0)" :percent="fixDoublePer(overviewData || 0)"
:width="80" :width="140"
/> />
<div class="protext">作业完成率</div> <div class="protext">作业完成率</div>
</div> --> </div>
<div class="proright"> <div class="proright">
<div class="proright1"> <div class="proright1">
<div class="textpro"> <div class="textpro">
任务完成率<span style="margin-left: 16px; color: #409eff">{{ 任务完成率<span
overviewData?.completeTaskCnt style="margin-left: 16px; color: #409eff"
}}</span> >{{ overviewData?.completeTaskCnt }}</span
>
</div> </div>
<div style="margin-top: 12px; display: flex"> <div style="margin-top: 12px; display: flex">
<a-progress <a-progress
@@ -169,22 +176,42 @@
<!-- <div style="margin-left: 10px">{{ (overviewData?.completeTaskRatio*100)?.toFixed(2) || 0 }}%</div> --> <!-- <div style="margin-left: 10px">{{ (overviewData?.completeTaskRatio*100)?.toFixed(2) || 0 }}%</div> -->
</div> </div>
</div> </div>
<!-- <div class="proright1"> <div class="proright1">
<span class="textpro">必修任务</span> <div class="textpro">
必修任务完成率<span
style="margin-left: 16px; color: #409eff"
>{{ overviewData?.completeTaskCnt }}</span
>
</div>
<div style="margin-top: 12px; display: flex">
<a-progress <a-progress
:showInfo="false" :showInfo="true"
:percent="fixDoublePer(overviewData / (overviewData || 0))" :percent="
style="width: 300px" fixDoublePer(overviewData?.completeTaskRatio || 0)
"
style="width: 369px"
/> />
</div> --> <!-- <div style="margin-left: 10px">{{ (overviewData?.completeTaskRatio*100)?.toFixed(2) || 0 }}%</div> -->
<!-- <div class="proright1"> </div>
<span class="textpro">选修任务</span> </div>
<div class="proright1">
<div class="textpro">
选修任务完成率<span
style="margin-left: 16px; color: #409eff"
>{{ overviewData?.completeTaskCnt }}</span
>
</div>
<div style="margin-top: 12px; display: flex">
<a-progress <a-progress
:showInfo="false" :showInfo="true"
:percent="fixDoublePer(overviewData / (overviewData || 0))" :percent="
style="width: 300px" fixDoublePer(overviewData?.completeTaskRatio || 0)
"
style="width: 369px"
/> />
</div> --> <!-- <div style="margin-left: 10px">{{ (overviewData?.completeTaskRatio*100)?.toFixed(2) || 0 }}%</div> -->
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -235,7 +262,9 @@
> >
<div <div
class="taskbox" class="taskbox"
style="background: linear-gradient(180deg, #fef3dd, #fffaf0)" style="
background: linear-gradient(180deg, #fef3dd, #fffaf0);
"
> >
<div class="leftt"> <div class="leftt">
<img src="../../assets/images/taskpage/left1.png" /> <img src="../../assets/images/taskpage/left1.png" />
@@ -339,14 +368,20 @@
> >
</div> </div>
</div> </div>
<div class="first" v-if="checkGrowthPer(preId)"> <div
class="first"
v-if="checkGrowthPer(preId) && courseType == 1"
>
<template v-if="element.superiorTaskName"> <template v-if="element.superiorTaskName">
<div style="margin-right: 8px"> <div style="margin-right: 8px">
{{ element.superiorTaskName }} {{ element.superiorTaskName }}
</div> </div>
<a-tooltip>
<template #title> 解绑锁定的上级任务</template>
<CloseCircleOutlined <CloseCircleOutlined
@click="selectSuperiorTask(element)" @click="selectSuperiorTask(element)"
/> />
</a-tooltip>
</template> </template>
<template v-else> <template v-else>
<a-dropdown :trigger="['click']"> <a-dropdown :trigger="['click']">
@@ -446,7 +481,9 @@
:permissions="preId" :permissions="preId"
> >
<template #extension="{ data: { record } }"> <template #extension="{ data: { record } }">
<a-button type="link" @click="showStudent(record)">查看</a-button> <a-button type="link" @click="showStudent(record)"
>查看</a-button
>
</template> </template>
</StudentManage> </StudentManage>
</a-tab-pane> </a-tab-pane>
@@ -498,7 +535,9 @@
v-model:HomeworkModelVisible="homeworkModelVisible" v-model:HomeworkModelVisible="homeworkModelVisible"
:datasource="homeworkData" :datasource="homeworkData"
/> />
</a-spin>
</div> </div>
<!-- 面授课开课弹框 --> <!-- 面授课开课弹框 -->
<GrowthOpenCourse ref="coursePlanRef" :type="2" /> <GrowthOpenCourse ref="coursePlanRef" :type="2" />
</template> </template>
@@ -534,6 +573,7 @@ import {
toSortTask, toSortTask,
saveSuperiorTask, saveSuperiorTask,
delSuperiorTask, delSuperiorTask,
taskInformation,
} from "@/api/growthpath"; } from "@/api/growthpath";
export default { export default {
name: "pathManage", name: "pathManage",
@@ -562,6 +602,7 @@ export default {
commonData: null, commonData: null,
showTimeText: null, showTimeText: null,
onlineVisible: false, onlineVisible: false,
spinning: false,
tabFlag: true, tabFlag: true,
homeworkData: {}, homeworkData: {},
TMvisible: false, TMvisible: false,
@@ -576,8 +617,8 @@ export default {
growId: "", growId: "",
basicData: {}, basicData: {},
listTaskData: [], listTaskData: [],
overviewData: null, overviewData: {},
hasTask: false, overviewData2: {},
TASK_TYPE: TASK_TYPE, TASK_TYPE: TASK_TYPE,
// 课程类型 1必修 2选修 // 课程类型 1必修 2选修
courseType: "1", courseType: "1",
@@ -670,15 +711,15 @@ export default {
const showCodeModel = (item) => { const showCodeModel = (item) => {
console.log(item, "item"); console.log(item, "item");
let codeUrl = ""; let codeUrl = "";
if (item.type == 1) { if (item.taskType == 1) {
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_ONLINE_CLASS_URL + process.env.VUE_APP_ONLINE_CLASS_URL +
item.courseId; item.taskId;
} }
// 考试 停用 // 考试 停用
if (item.type == 5) { if (item.taskType == 5) {
if (item.examType != 1) { if (item.info.examType != 1) {
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_BOE_API_URL + process.env.VUE_APP_BOE_API_URL +
@@ -694,7 +735,7 @@ export default {
codeUrl = codeUrl =
window.location.protocol + window.location.protocol +
process.env.VUE_APP_EXAM_DETAIL_URL + process.env.VUE_APP_EXAM_DETAIL_URL +
item.info.examinationTestId; item.info.examinationPaperId;
} }
} }
qrCode({ qrCode({
@@ -756,13 +797,19 @@ export default {
}); });
//任务列表 //任务列表
const getListTask = () => { const getListTask = () => {
state.spinning = true;
taskOutline({ taskOutline({
growthId: state.routerId, growthId: state.routerId,
type: state.courseType, type: state.courseType,
}).then((res) => { })
.then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.listTaskData = res.data.data.records; state.listTaskData = res.data.data.records;
} }
state.spinning = false;
})
.catch((err) => {
spinning.value = false;
}); });
}; };
@@ -782,7 +829,15 @@ export default {
}).then((res) => { }).then((res) => {
if (res.data.code == 200) { if (res.data.code == 200) {
state.overviewData = res.data.data; state.overviewData = res.data.data;
state.hasTask = true; } else {
message.error(res.msg);
}
});
//概览统计图数据
taskInformation(state.routerId).then((res) => {
if (res.data.code == 200) {
state.overviewData2 = res.data.data;
} else { } else {
message.error(res.msg); message.error(res.msg);
} }
@@ -1116,7 +1171,7 @@ export default {
.nubbox { .nubbox {
width: 253px; width: 253px;
height: 116px; height: 116px;
background: #fafbfc; background: #f0f6fc;
border-radius: 8px; border-radius: 8px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;