专业力必修提交

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 })
//获取Band
export const getBandList = (obj) => http.get('/professional/compulsory/getBandList', { 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 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">
<img
style="width: 20px; height: 18px"
src="../assets/images/navleft/studyPath.png"
src="../assets/images/navleft/pathIcon.png"
/>
</div>
<router-link to="/growthpath">专业力必修</router-link>

View File

@@ -31,41 +31,36 @@
</div> -->
<div class="search" style="justify-content: flex-start">
<div class="sealeft">
<div class="namecon" style="margin-right: 30px">
<div class="name">标准岗位</div>
<PostSelectNew width="200px" v-model:value="stdPositionId">
<div class="namecon" style="margin-right: 16px">
<PostSelectNew width="200px" v-model:value="stdPosition">
</PostSelectNew>
</div>
<div class="namecon" style="margin-right: 30px">
<div class="name">任职资格</div>
<div class="namecon" style="margin-right: 16px">
<OfficeSelect
v-model:value="qualsLevelCode"
:searchData="stdPositionId"
:searchData="stdPosition"
width="200px"
/>
</div>
<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="namecon" style="margin-right: 16px">
<div class="select">
<a-select
v-model:value="projectName"
style="width: 200px"
placeholder="请选择"
placeholder="任务状态"
:options="projectNameList"
@change="selectProjectName"
allowClear
></a-select>
</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 class="btns">
<div
@@ -191,13 +186,13 @@ export default {
const state = reactive({
visible: props.Tvisible,
name: "",
pageNo: 1,
pageNum: 1,
pageSize: 10,
currentPage: 1,
tableDataTotal: 0,
projectName: undefined,
TASK_TYPE: TASK_TYPE,
stdPositionId: null,
stdPosition: null,
qualsLevelCode: null,
projectNameList: [
{
@@ -227,7 +222,7 @@ export default {
title: "工号",
dataIndex: "username",
key: "username",
width: 50,
width: 80,
align: "center",
className: "h head",
customRender: (text) => {
@@ -245,7 +240,7 @@ export default {
title: "姓名",
dataIndex: "userNickName",
key: "userNickName",
width: 50,
width: 80,
align: "center",
className: "h head",
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: "标准岗位",
dataIndex: "stdPositionName",
key: "stdPositionName",
width: 60,
width: 150,
align: "center",
ellipsis: true,
className: "h",
@@ -300,7 +279,7 @@ export default {
title: "任职资格",
dataIndex: "qualsLevelDesr",
key: "qualsLevelDesr",
width: 60,
width: 80,
align: "center",
ellipsis: true,
className: "h",
@@ -349,22 +328,6 @@ export default {
4: "添加",
}[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: "完成时间",
dataIndex: "finishTime",
@@ -456,6 +419,8 @@ export default {
state.name = "";
state.projectName = undefined;
state.tabledata = [];
state.stdPosition = null;
state.qualsLevelCode = null;
};
const afterVisibleChange = (bol) => {
if (bol == true) {
@@ -494,13 +459,13 @@ export default {
// 获取数据
function getData() {
getStudentTaskPage({
pageNo: state.currentPage,
pageNum: state.currentPage,
pageSize: state.pageSize,
completionStatus: state.projectName,
username: state.name,
taskId: props.datasource.id,
qualsLevelCode: state.qualsLevelCode,
stdPositionId: state.stdPositionId,
stdPosition: state.stdPosition,
})
.then((res) => {
console.log("在线课数据获取", res);
@@ -528,6 +493,8 @@ export default {
state.currentPage = 1;
state.name = "";
state.projectName = null;
state.stdPosition = null;
state.qualsLevelCode = null;
getData();
}
@@ -540,56 +507,35 @@ export default {
// 导出数据
function exportTaskStu() {
exportStudentTaskPage({
pageNo: state.currentPage,
pageSize: state.pageSize,
completionStatus: state.projectName,
username: state.name,
taskId: props.datasource.id,
qualsLevelCode: state.qualsLevelCode,
stdPositionId: state.stdPositionId,
}).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}`)
// }
let params = {
pageNo: state.currentPage || "",
pageSize: state.pageSize || "",
completionStatus: state.projectName || "",
username: state.name || "",
taskId: props.datasource.id || "",
qualsLevelCode: state.qualsLevelCode || "",
stdPosition: state.stdPosition || "",
};
// window.open(
// `${
// process.env.VUE_APP_BASE_API
// }/admin/online/manage/exportOnline?type=${14}&targetId=${
// props.datasource.targetId
// }&taskId=${props.datasource.courseId}`
// buildUrl(
// "http://192.168.18.141:32002/professional/studentTask/export",
// params
// )
// );
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 {
...toRefs(state),
selectProjectName,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,257 +1,266 @@
<template>
<div class="editing-tasks">
<div style="display: flex">
<div class="right">
<div class="addhead">
<div class="filt">
<div class="le">
<div class="imgfor">
<div class="fort" style="color: #333333; font-size: 16px">
{{
`${basicData?.organizationName || ""}${
basicData?.stdPosition || ""
}${basicData?.qualsLevelDesr || ""}`
}}
</div>
<div class="fort">归属组织{{ basicData?.ownershipOrg }}</div>
<div class="fort">创建时间{{ basicData?.createTime }}</div>
</div>
</div>
<div class="rightt">
<router-link
:to="{
path: '/pathmanage',
query: { id: growId, routerEdit: true, pre: pre },
}"
>
<div style="display: flex">
<img
class="img2"
src="../../assets/images/leveladd/back.png"
/>
<div class="return">返回</div>
</div>
</router-link>
</div>
</div>
</div>
<div class="mid">
<div class="tabs">
<a-tabs
v-model:activeKey="activeKey"
size="large"
@change="tabsChange"
>
<a-tab-pane key="1" tab="必修"></a-tab-pane>
<a-tab-pane key="2" tab="选修"></a-tab-pane>
</a-tabs>
</div>
<div class="handler">
<div class="item" v-for="(value, key) in TASK_TYPE" :key="key">
<component
:ref="(el) => (courseRef['el' + key] = el)"
v-model:taskList="listDatas"
:is="value.component"
:growId="growId"
:id="growId"
:type="value.type"
:activeKey="activeKey"
:infoType="2"
@dataListUp="dataListUp"
@refresh="getListTask"
>
<div class="itcon">
<div class="img">
<img :src="value.img" />
<a-spin :spinning="spinning">
<div style="display: flex">
<div class="right">
<div class="addhead">
<div class="filt">
<div class="le">
<div class="imgfor">
<div class="fort" style="color: #333333; font-size: 16px">
{{
`${basicData?.stdPosition || ""}${
basicData?.qualsLevelDesr || ""
}`
}}
</div>
<div class="text">{{ value.name }}</div>
<div class="fort">创建时间{{ basicData?.createTime }}</div>
</div>
</component>
<div></div>
<div class="lin"></div>
</div>
<div class="rightt">
<router-link
:to="{
path: '/pathmanage',
query: { id: growId, routerEdit: true, pre: pre },
}"
>
<div style="display: flex">
<img
class="img2"
src="../../assets/images/leveladd/back.png"
/>
<div class="return">返回</div>
</div>
</router-link>
</div>
</div>
</div>
</div>
<div class="boom">
<div class="boomcen">
<div class="title">
<div class="tit_left">
<span>任务列表</span>
</div>
<div
v-if="listDatas.length != 0"
class="btn btn2"
@click="confirmDelTask()"
<div class="mid">
<div class="tabs">
<a-tabs
v-model:activeKey="activeKey"
size="large"
@change="tabsChange"
>
<div class="imgIcon"></div>
<div class="btnText">批量删除</div>
<a-tab-pane key="1" tab="必修"></a-tab-pane>
<a-tab-pane key="2" tab="选修"></a-tab-pane>
</a-tabs>
</div>
<div class="handler">
<div class="item" v-for="(value, key) in TASK_TYPE" :key="key">
<component
:ref="(el) => (courseRef['el' + key] = el)"
v-model:taskList="listDatas"
:is="value.component"
:growId="growId"
:id="growId"
:type="value.type"
:activeKey="activeKey"
:infoType="2"
@dataListUp="dataListUp"
@refresh="getListTask"
>
<div class="itcon">
<div class="img">
<img :src="value.img" />
</div>
<div class="text">{{ value.name }}</div>
</div>
</component>
<div></div>
<div class="lin"></div>
</div>
</div>
<div v-if="listDatas.length != 0" class="tableBox">
<div
style="
height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
background-color: #eff4fc;
font-size: 14px;
font-weight: 400;
color: #999ba3;
line-height: 36px;
border-bottom: 1px solid #f2f6fc;
"
>
</div>
<div class="boom">
<div class="boomcen">
<div class="title">
<div class="tit_left">
<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
v-if="listDatas.length != 0"
class="btn btn2"
@click="confirmDelTask()"
>
<div class="imgIcon"></div>
<div class="btnText">批量删除</div>
</div>
</div>
<div v-if="listDatas.length != 0" class="tableBox">
<div
style="
width: 87px;
text-align: center;
height: 50px;
display: flex;
margin-left: 46px;
justify-content: space-between;
align-items: center;
background-color: #eff4fc;
font-size: 14px;
font-weight: 400;
color: #999ba3;
line-height: 36px;
border-bottom: 1px solid #f2f6fc;
"
>
<img
<div
style="
width: 16px;
height: 16px;
cursor: pointer;
margin-top: 12px;
width: 87px;
text-align: center;
display: flex;
margin-left: 46px;
"
:src="
selectAll === 0
? require('../../assets/images/notSelect.png')
: selectAll === 1
? require('../../assets/images/selectAll.png')
: require('../../assets/images/select.png')
"
@click="selectRowAll"
/>
<div style="margin-top: 2px; margin-left: 8px">类型</div>
</div>
<div style="width: 120px; text-align: center">名称</div>
<div style="width: 87px; text-align: center">时长</div>
<div style="width: 87px; text-align: center">状态</div>
<div
style="width: 120px; text-align: center; margin-right: 20px"
>
操作
</div>
</div>
<div
v-for="(element, index) of listDatas"
style="
height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #f2f6fc;
font-size: 14px;
font-weight: 400;
color: #4f5156;
line-height: 36px;
"
class="tableRow"
>
<div
style="
width: 87px;
text-align: center;
margin-left: 46px;
position: relative;
"
>
<div class="racona">
<a-checkbox
:id="element.id"
v-model:checked="element.checked"
></a-checkbox>
<div style="margin-top: 2px; margin-left: 8px">
{{ TASK_TYPE[element.taskType]?.name || "" }}
</div>
>
<img
style="
width: 16px;
height: 16px;
cursor: pointer;
margin-top: 12px;
"
:src="
selectAll === 0
? require('../../assets/images/notSelect.png')
: selectAll === 1
? require('../../assets/images/selectAll.png')
: require('../../assets/images/select.png')
"
@click="selectRowAll"
/>
<div style="margin-top: 2px; margin-left: 8px">类型</div>
</div>
<div style="width: 120px; text-align: center">名称</div>
<div style="width: 87px; text-align: center">时长</div>
<div style="width: 87px; text-align: center">状态</div>
<div
style="width: 120px; text-align: center; margin-right: 20px"
>
操作
</div>
</div>
<div
style="
width: 120px;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
"
:title="element.taskName"
>
{{ element.taskName }}
</div>
<div style="width: 87px; text-align: center">
{{ element.duration ? element.duration + "分钟" : "-" }}
</div>
<div style="width: 87px; text-align: center">
{{ element.status == "0" ? "未发布" : "已发布" }}
</div>
<div
style="width: 120px; text-align: center; margin-right: 20px"
>
<div class="opa">
<div class="opacation">
<template v-if="element.status == '0'">
<span
style="color: #4ea6ff; cursor: pointer"
@click="published(element, index)"
>
发布
</span>
<span
style="color: #4ea6ff; cursor: pointer"
@click="editTaskForType(element, index)"
>
编辑
</span>
<span
style="color: #4ea6ff; cursor: pointer"
@click="confirmDelTask(element, index)"
>
删除
</span>
</template>
<template v-else>
<span
v-if="element.status == '1'"
style="color: #4ea6ff; cursor: pointer"
@click="withdraw(element, index)"
>
撤回
</span>
</template>
<div
v-for="(element, index) of listDatas"
style="
height: 50px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #f2f6fc;
font-size: 14px;
font-weight: 400;
color: #4f5156;
line-height: 36px;
"
class="tableRow"
>
<div
style="
width: 87px;
text-align: center;
margin-left: 46px;
position: relative;
"
>
<div class="racona">
<a-checkbox
:id="element.id"
v-model:checked="element.checked"
></a-checkbox>
<div style="margin-top: 2px; margin-left: 8px">
{{ TASK_TYPE[element.taskType]?.name || "" }}
</div>
</div>
</div>
<div
style="
width: 120px;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
"
:title="element.taskName"
>
{{ element.taskName }}
</div>
<div style="width: 87px; text-align: center">
{{ element.duration ? element.duration + "分钟" : "-" }}
</div>
<div style="width: 87px; text-align: center">
{{ element.status == "0" ? "未发布" : "已发布" }}
</div>
<div
style="width: 120px; text-align: center; margin-right: 20px"
>
<div class="opa">
<div class="opacation">
<template v-if="element.status == '0'">
<span
style="color: #4ea6ff; cursor: pointer"
@click="published(element, index)"
>
发布
</span>
<span
style="color: #4ea6ff; cursor: pointer"
@click="editTaskForType(element, index)"
>
编辑
</span>
<span
style="color: #4ea6ff; cursor: pointer"
@click="confirmDelTask(element, index)"
>
删除
</span>
</template>
<template v-else>
<span
v-if="element.status == '1'"
style="color: #4ea6ff; cursor: pointer"
@click="withdraw(element, index)"
>
撤回
</span>
</template>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 无数据样式 -->
<div v-else class="notable">
<div class="notablebox">
<div class="boxbody">
<div class="boximg"></div>
<div class="boxtitle">
<span style="color: #ffb64e; font-size: 20px">无任务</span>
</div>
<div class="boxtitle2">
<span style="color: #878b92">请点击上方创建任务</span>
<!-- 无数据样式 -->
<div v-else class="notable">
<div class="notablebox">
<div class="boxbody">
<div class="boximg"></div>
<div class="boxtitle">
<span style="color: #ffb64e; font-size: 20px"
>无任务</span
>
</div>
<div class="boxtitle2">
<span style="color: #878b92">请点击上方创建任务</span>
</div>
</div>
<div class="smallleft"></div>
<div class="smallright"></div>
</div>
<div class="smallleft"></div>
<div class="smallright"></div>
</div>
<!-- 无数据样式 -->
</div>
<!-- 无数据样式 -->
</div>
</div>
</div>
</div>
</a-spin>
</div>
</template>
<script setup>
@@ -329,15 +338,22 @@ const dataListUp = (val) => {
getListTask();
};
const listDatas = ref([]);
const spinning = ref(false);
const getListTask = () => {
spinning.value = true;
notPublishedTaskList({
growthId: growId,
type: activeKey.value,
}).then((res) => {
if (res.data.code === 200) {
listDatas.value = res.data.data.records;
}
});
})
.then((res) => {
if (res.data.code === 200) {
listDatas.value = res.data.data.records;
}
spinning.value = false;
})
.catch((err) => {
spinning.value = false;
});
};
const basicData = ref({});
@@ -601,8 +617,14 @@ const withdraw = (element) => {
font-size: 16px;
font-weight: 500;
color: #363636;
line-height: 36px;
line-height: 24px;
// margin-top: 30px;
.tips {
display: flex;
align-items: center;
font-size: 12px;
color: #999;
}
}
.tit_right {

View File

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

File diff suppressed because it is too large Load Diff