mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-manage.git
synced 2025-12-13 04:46:46 +08:00
feat:增加项目/学习路径直播 考勤模块
This commit is contained in:
@@ -37,3 +37,9 @@ export const QueryVoteManagementDetail = (obj) => http.post('/admin/vote/manage/
|
|||||||
|
|
||||||
// 根据投票任务Id获取投票任务信息
|
// 根据投票任务Id获取投票任务信息
|
||||||
export const QueryVoteTaskDetailById = (obj) => http.post('/voteSubmit/queryVoteTaskDetailById', obj)
|
export const QueryVoteTaskDetailById = (obj) => http.post('/voteSubmit/queryVoteTaskDetailById', obj)
|
||||||
|
|
||||||
|
// 直播考勤请假
|
||||||
|
export const AttendanceLeave = (obj) => http.post('/stu/task/attendance/leave', obj)
|
||||||
|
|
||||||
|
// 直播考勤签到
|
||||||
|
export const AttendanceSign = (obj) => http.post('/stu/task/attendance/sign', obj)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
>
|
>
|
||||||
<div class="drawerMain">
|
<div class="drawerMain">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<div class="headerTitle">【{{ title }}】考勤</div>
|
<div class="headerTitle">【{{ datasource.type==6?"直播":"讨论" }}】考勤</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"
|
||||||
@@ -18,10 +18,15 @@
|
|||||||
<div class="centermain">
|
<div class="centermain">
|
||||||
<div class="titl">
|
<div class="titl">
|
||||||
<div class="endtime">
|
<div class="endtime">
|
||||||
起止时间:2022-07-21 14:00 ~ 2022-7-30 14:00
|
起止时间:{{
|
||||||
|
datasource && datasource.startTime ? datasource.startTime : "-"
|
||||||
|
}}
|
||||||
|
~
|
||||||
|
{{ datasource && datasource.endTime ? datasource.endTime : "-" }}
|
||||||
</div>
|
</div>
|
||||||
<div class="endtime" style="margin-left: 64px">签到时间:14:00</div>
|
|
||||||
<div class="endtime" style="margin-left: 40px">签退时间:21:00</div>
|
<div class="endtime" style="margin-left: 64px">签到时间:{{beginTime}}</div>
|
||||||
|
<div class="endtime" style="margin-left: 40px">签退时间:{{endTime}}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="search">
|
<div class="search">
|
||||||
@@ -35,7 +40,7 @@
|
|||||||
maxlength="20"
|
maxlength="20"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="namecon" style="margin-right: 30px">
|
<!-- <div class="namecon" style="margin-right: 30px">
|
||||||
<div class="name">考勤:</div>
|
<div class="name">考勤:</div>
|
||||||
<div class="select">
|
<div class="select">
|
||||||
<a-select
|
<a-select
|
||||||
@@ -48,7 +53,7 @@
|
|||||||
showSearch
|
showSearch
|
||||||
></a-select>
|
></a-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
<div class="namecon">
|
<div class="namecon">
|
||||||
<div class="name">签到状态:</div>
|
<div class="name">签到状态:</div>
|
||||||
<div class="select">
|
<div class="select">
|
||||||
@@ -65,11 +70,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="btns">
|
<div class="btns">
|
||||||
<div class="btn btn1" style="margin-right: 20px">
|
<div class="btn btn1" style="margin-right: 20px" @click="searchTaskList">
|
||||||
<div class="img1"></div>
|
<div class="img1"></div>
|
||||||
<div class="wz">搜索</div>
|
<div class="wz">搜索</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn btn2">
|
<div class="btn btn2" @click="resetTaskList">
|
||||||
<div class="img2"></div>
|
<div class="img2"></div>
|
||||||
<div class="wz">重置</div>
|
<div class="wz">重置</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -82,12 +87,12 @@
|
|||||||
<div class="btn btn2" @click="showqdModal">
|
<div class="btn btn2" @click="showqdModal">
|
||||||
<div class="wz">批量签到</div>
|
<div class="wz">批量签到</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn btn1">
|
<div class="btn btn1" @click="exportTaskStu">
|
||||||
<div class="img2"></div>
|
<div class="img2"></div>
|
||||||
<div class="wz">导出数据</div>
|
<div class="wz">导出数据</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<!-- <div class="line">
|
||||||
<div class="inline">
|
<div class="inline">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<div class="img"></div>
|
<div class="img"></div>
|
||||||
@@ -99,14 +104,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="right" @click="clearLine">清空</div>
|
<div class="right" @click="clearLine">清空</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
|
|
||||||
<div class="tableBox" style="margin-top: 30px">
|
<div class="tableBox" style="margin-top: 30px">
|
||||||
<a-table
|
<a-table
|
||||||
style="border: 1px solid #f2f6fe"
|
style="border: 1px solid #f2f6fe"
|
||||||
:columns="tableDataFunc()"
|
:columns="tableDataFunc()"
|
||||||
:data-source="tableData"
|
:data-source="tableData"
|
||||||
:loading="tableDataTotal === -1 ? true : false"
|
:loading="tableDataTotalLoading"
|
||||||
:scroll="{ x: 1300 }"
|
:scroll="{ x: 1300 }"
|
||||||
:pagination="false"
|
:pagination="false"
|
||||||
:row-selection="{
|
:row-selection="{
|
||||||
@@ -142,11 +147,11 @@
|
|||||||
<span>您确定要批量签到吗</span>
|
<span>您确定要批量签到吗</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="del_btnbox">
|
<div class="del_btnbox">
|
||||||
<div class="del_btn btn1">
|
<div class="del_btn btn1" @click="closeqdModal">
|
||||||
<div class="btnText" @click="closeqdModal">取消</div>
|
<div class="btnText">取消</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="del_btn btn2">
|
<div class="del_btn btn2" @click="batchSign">
|
||||||
<div class="btnText" @click="closeqdModal">确定</div>
|
<div class="btnText">确定</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -245,15 +250,29 @@
|
|||||||
</a-modal>
|
</a-modal>
|
||||||
<!-- 二维码签到弹窗 -->
|
<!-- 二维码签到弹窗 -->
|
||||||
<SignQR v-model:signQRvisible="signQRvisible" />
|
<SignQR v-model:signQRvisible="signQRvisible" />
|
||||||
|
|
||||||
|
<!-- 二维码弹窗 -->
|
||||||
|
<two-dimensional-code
|
||||||
|
v-model:codevisible="codevisible"
|
||||||
|
:codeInfo="codeInfo"
|
||||||
|
:index="codeIndex"
|
||||||
|
:type="codeType == 1 ? '课程二维码' : codeType == 2 ? '签到二维码' : ''"
|
||||||
|
/>
|
||||||
|
<!-- 二维码弹窗 -->
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { toRefs, reactive } from "vue";
|
import { toRefs, reactive } from "vue";
|
||||||
import SignQR from "./SignQR.vue";
|
import SignQR from "./SignQR.vue";
|
||||||
|
import TwoDimensionalCode from "../../components/TwoDimensionalCode";
|
||||||
|
import * as api from "../../api/indexTaskManage";
|
||||||
|
import { toDate } from "../../api/method";
|
||||||
|
import { message } from "ant-design-vue";
|
||||||
export default {
|
export default {
|
||||||
name: "ActiveAttendance",
|
name: "ActiveAttendance",
|
||||||
components: {
|
components: {
|
||||||
SignQR,
|
SignQR,
|
||||||
|
TwoDimensionalCode
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
AAvisible: {
|
AAvisible: {
|
||||||
@@ -264,6 +283,16 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
default: "",
|
default: "",
|
||||||
},
|
},
|
||||||
|
datasource: {
|
||||||
|
type: Object,
|
||||||
|
default: function () {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
types: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setup(props, ctx) {
|
setup(props, ctx) {
|
||||||
@@ -284,46 +313,26 @@ export default {
|
|||||||
projectNameList: [
|
projectNameList: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
value: "项目一",
|
value: "1",
|
||||||
label: "项目一",
|
label: "签到",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
value: "项目二",
|
value: "2",
|
||||||
label: "项目二",
|
label: "请假",
|
||||||
},
|
}
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "项目三",
|
|
||||||
label: "项目三",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
value: "项目四",
|
|
||||||
label: "项目四",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
projectNameList2: [
|
projectNameList2: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
value: "项目一",
|
value: "1",
|
||||||
label: "项目一",
|
label: "正常",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
value: "项目二",
|
value: "2",
|
||||||
label: "项目二",
|
label: "异常",
|
||||||
},
|
}
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
value: "项目三",
|
|
||||||
label: "项目三",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
value: "项目四",
|
|
||||||
label: "项目四",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
selectedRowKeys: [],
|
selectedRowKeys: [],
|
||||||
tableData: [
|
tableData: [
|
||||||
@@ -339,72 +348,7 @@ export default {
|
|||||||
signIn: false, //签到
|
signIn: false, //签到
|
||||||
signOut: false, //签退
|
signOut: false, //签退
|
||||||
leave: false, //请假
|
leave: false, //请假
|
||||||
},
|
}
|
||||||
{
|
|
||||||
key: 2,
|
|
||||||
name: "张三",
|
|
||||||
com: "产研部",
|
|
||||||
gang: "产品经理",
|
|
||||||
cur: "2022-10-31 23:12",
|
|
||||||
jin: "-",
|
|
||||||
time: "签到/签退",
|
|
||||||
state: "正常",
|
|
||||||
signIn: true, //签到
|
|
||||||
signOut: true, //签退
|
|
||||||
leave: false, //请假
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 3,
|
|
||||||
name: "张三",
|
|
||||||
com: "产研部",
|
|
||||||
gang: "产品经理",
|
|
||||||
cur: "2022-10-31 23:12",
|
|
||||||
jin: "2022-10-31 23:12",
|
|
||||||
time: "迟到",
|
|
||||||
state: "异常",
|
|
||||||
signIn: false, //签到
|
|
||||||
signOut: true, //签退
|
|
||||||
leave: false, //请假
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 4,
|
|
||||||
name: "张三",
|
|
||||||
com: "产研部",
|
|
||||||
gang: "产品经理",
|
|
||||||
cur: "2022-10-31 23:12",
|
|
||||||
jin: "2022-10-31 23:12",
|
|
||||||
time: "早退",
|
|
||||||
state: "异常",
|
|
||||||
signIn: true, //签到
|
|
||||||
signOut: false, //签退
|
|
||||||
leave: false, //请假
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 5,
|
|
||||||
name: "张三",
|
|
||||||
com: "产研部",
|
|
||||||
gang: "产品经理",
|
|
||||||
cur: "2022-10-31 23:12",
|
|
||||||
jin: "2022-10-31 23:12",
|
|
||||||
time: "签到/签退",
|
|
||||||
state: "正常",
|
|
||||||
signIn: true, //签到
|
|
||||||
signOut: true, //签退
|
|
||||||
leave: false, //请假
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 6,
|
|
||||||
name: "张三",
|
|
||||||
com: "产研部",
|
|
||||||
gang: "产品经理",
|
|
||||||
cur: "2022-10-31 23:12",
|
|
||||||
jin: "2022-10-31 23:12",
|
|
||||||
time: "签到/签退",
|
|
||||||
state: "正常",
|
|
||||||
signIn: true, //签到
|
|
||||||
signOut: true, //签退
|
|
||||||
leave: false, //请假
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
@@ -420,6 +364,16 @@ export default {
|
|||||||
value: "Orange",
|
value: "Orange",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
tableDataTotalLoading: true, // 表格loading加载配置
|
||||||
|
beginTime: null, //签到开始时间
|
||||||
|
endTime: null, //签到结束时间
|
||||||
|
selectedStudents:[],
|
||||||
|
projectName:undefined,
|
||||||
|
projectName2:undefined,
|
||||||
|
codeType: null,
|
||||||
|
codeIndex: null,
|
||||||
|
codeInfo: null, //二维码内容
|
||||||
|
codevisible: false, //二维码弹窗
|
||||||
});
|
});
|
||||||
const selectProjectName = (value, index) => {
|
const selectProjectName = (value, index) => {
|
||||||
console.log("value", value, index);
|
console.log("value", value, index);
|
||||||
@@ -434,64 +388,238 @@ export default {
|
|||||||
const showEntryScore = () => {
|
const showEntryScore = () => {
|
||||||
state.Evisible = true;
|
state.Evisible = true;
|
||||||
};
|
};
|
||||||
const onSelectChange = (selectedRowKeys) => {
|
const onSelectChange = (selectedRowKeys, e) => {
|
||||||
|
console.log("selectedRowKeys changed: ", selectedRowKeys);
|
||||||
state.selectedRowKeys = selectedRowKeys;
|
state.selectedRowKeys = selectedRowKeys;
|
||||||
|
let array = [];
|
||||||
|
for (let i = 0; i < e.length; i++) {
|
||||||
|
array.push(e[i].studentId);
|
||||||
|
}
|
||||||
|
state.selectedStudents = array;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 计算签到时间
|
||||||
|
const isSignClick = () => {
|
||||||
|
console.log("计算签到时间", props.datasource);
|
||||||
|
let beginTime = new Date(props.datasource.startTime).getTime();
|
||||||
|
let endTime = !props.datasource.afterStart
|
||||||
|
? new Date(props.datasource.endTime).getTime()
|
||||||
|
: new Date(props.datasource.startTime).getTime();
|
||||||
|
|
||||||
|
if (props.datasource.beforeStart && props.datasource.afterStart) {
|
||||||
|
//有开始前有开始后
|
||||||
|
beginTime = beginTime - props.datasource.beforeStart * 60 * 1000;
|
||||||
|
endTime = endTime + props.datasource.afterStart * 60 * 1000;
|
||||||
|
console.log("1111", beginTime, endTime);
|
||||||
|
} else if (props.datasource.beforeStart && !props.datasource.afterStart) {
|
||||||
|
//只有开始前无开始后
|
||||||
|
beginTime = beginTime - props.datasource.beforeStart * 60 * 1000;
|
||||||
|
console.log("11112222", beginTime);
|
||||||
|
} else if (!props.datasource.beforeStart && props.datasource.afterStart) {
|
||||||
|
//无开始前有开始后
|
||||||
|
endTime = endTime + props.datasource.afterStart * 60 * 1000;
|
||||||
|
console.log("1111333", endTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
state.beginTime = toDate(beginTime / 1000, "Y/M/D h:m:s");
|
||||||
|
state.endTime = toDate(endTime / 1000, "Y/M/D h:m:s");
|
||||||
|
console.log("beginTime,endTime", state.beginTime, state.endTime);
|
||||||
|
};
|
||||||
|
|
||||||
|
const afterVisibleChange = (bol) => {
|
||||||
|
if (bol == true) {
|
||||||
|
console.log("当前是什么类型", props.datasource.type);
|
||||||
|
state.tableDataTotalLoading = true;
|
||||||
|
getTableData();
|
||||||
|
isSignClick();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const getTableData = () => {
|
const getTableData = () => {
|
||||||
let arr = state.tableData;
|
console.log('当前是项目还是路径图 1 路径图 2 项目', props.types)
|
||||||
arr.map((value) => {
|
if ( props.datasource.type == 6 && props.types==1) {
|
||||||
// console.log("value", value);
|
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
|
||||||
value.opacation = (
|
console.log("我是传递的查询参数", {
|
||||||
<div class="opa">
|
pageNo: state.currentPage,
|
||||||
<a-checkbox
|
pageSize: state.pageSize,
|
||||||
checked={value.signIn}
|
currentStageId: props.datasource.chapterId,
|
||||||
onChange={(e) => {
|
type: 2,
|
||||||
console.log("点击签到", e);
|
pid: props.datasource.routerId,
|
||||||
showsingleqdModal();
|
taskId: props.datasource.routerTaskId,
|
||||||
}}
|
taskType: props.datasource.type,
|
||||||
>
|
status: state.projectName,
|
||||||
签到
|
studentName: state.name,
|
||||||
</a-checkbox>
|
signStatus: state.projectName2
|
||||||
<a-checkbox
|
});
|
||||||
checked={value.signOut}
|
api
|
||||||
onChange={(e) => {
|
.AssessmentManagementMessage({
|
||||||
console.log("点击签退", e);
|
pageNo: state.currentPage,
|
||||||
showsingleqtModal();
|
pageSize: state.pageSize,
|
||||||
}}
|
currentStageId: props.datasource.chapterId,
|
||||||
>
|
type: 2, // 1项目 2 路径
|
||||||
签退
|
pid: props.datasource.routerId,
|
||||||
</a-checkbox>
|
taskId: props.datasource.routerTaskId,
|
||||||
<a-checkbox
|
taskType: props.datasource.type,
|
||||||
checked={value.leave}
|
status: state.projectName,
|
||||||
onChange={(e) => {
|
studentName: state.name,
|
||||||
console.log("点击请假", e);
|
})
|
||||||
showsingleqjModal();
|
.then((res) => {
|
||||||
}}
|
console.log(res);
|
||||||
>
|
if (res.status == 200) {
|
||||||
请假
|
let keyarr = []
|
||||||
</a-checkbox>
|
for(let i =0;i<res.data.data.records.length;i++){
|
||||||
</div>
|
res.data.data.records[i].key = res.data.data.records[i].studentId
|
||||||
);
|
keyarr.push( res.data.data.records[i])
|
||||||
});
|
}
|
||||||
state.tableData = arr;
|
state.tableData = keyarr;
|
||||||
|
state.tableDataTotal = res.data.data.total;
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
state.tableData = [];
|
||||||
|
});
|
||||||
|
} else if ( props.datasource.type == 6 && props.types==2) {
|
||||||
|
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
|
||||||
|
console.log("我是传递的查询参数", {
|
||||||
|
pageNo: state.currentPage,
|
||||||
|
pageSize: state.pageSize,
|
||||||
|
currentStageId: props.datasource.stageId,
|
||||||
|
type: 1,
|
||||||
|
pid: props.datasource.projectId,
|
||||||
|
taskId: props.datasource.projectTaskId,
|
||||||
|
taskType: props.datasource.type,
|
||||||
|
status: state.projectName,
|
||||||
|
studentName: state.name,
|
||||||
|
signStatus: state.projectName2
|
||||||
|
});
|
||||||
|
api
|
||||||
|
.AssessmentManagementMessage({
|
||||||
|
pageNo: state.currentPage,
|
||||||
|
pageSize: state.pageSize,
|
||||||
|
currentStageId: props.datasource.stageId,
|
||||||
|
type: 1, // 1项目 2 路径
|
||||||
|
pid: props.datasource.projectId,
|
||||||
|
taskId: props.datasource.projectTaskId,
|
||||||
|
taskType: props.datasource.type,
|
||||||
|
status: state.projectName,
|
||||||
|
studentName: state.name,
|
||||||
|
})
|
||||||
|
.then((res) => {
|
||||||
|
console.log(res);
|
||||||
|
if (res.status == 200) {
|
||||||
|
let keyarr = []
|
||||||
|
for(let i =0;i<res.data.data.records.length;i++){
|
||||||
|
res.data.data.records[i].key = res.data.data.records[i].studentId
|
||||||
|
keyarr.push( res.data.data.records[i])
|
||||||
|
}
|
||||||
|
state.tableData = keyarr;
|
||||||
|
state.tableDataTotal = res.data.data.total;
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
state.tableData = [];
|
||||||
|
});
|
||||||
|
} else{
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
state.tableData = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// let arr = state.tableData;
|
||||||
|
// arr.map((value) => {
|
||||||
|
// // console.log("value", value);
|
||||||
|
// value.opacation = (
|
||||||
|
// <div class="opa">
|
||||||
|
// <a-checkbox
|
||||||
|
// checked={value.signIn}
|
||||||
|
// onChange={(e) => {
|
||||||
|
// console.log("点击签到", e);
|
||||||
|
// showsingleqdModal();
|
||||||
|
// }}
|
||||||
|
// >
|
||||||
|
// 签到
|
||||||
|
// </a-checkbox>
|
||||||
|
// <a-checkbox
|
||||||
|
// checked={value.signOut}
|
||||||
|
// onChange={(e) => {
|
||||||
|
// console.log("点击签退", e);
|
||||||
|
// showsingleqtModal();
|
||||||
|
// }}
|
||||||
|
// >
|
||||||
|
// 签退
|
||||||
|
// </a-checkbox>
|
||||||
|
// <a-checkbox
|
||||||
|
// checked={value.leave}
|
||||||
|
// onChange={(e) => {
|
||||||
|
// console.log("点击请假", e);
|
||||||
|
// showsingleqjModal();
|
||||||
|
// }}
|
||||||
|
// >
|
||||||
|
// 请假
|
||||||
|
// </a-checkbox>
|
||||||
|
// </div>
|
||||||
|
// );
|
||||||
|
// });
|
||||||
|
// state.tableData = arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
//批量签到
|
||||||
|
const batchSign = () => {
|
||||||
|
let obj = {
|
||||||
|
courseId: Number(props.datasource.courseId),
|
||||||
|
routerId: Number(props.datasource.routerId),
|
||||||
|
ids: state.selectedStudents,
|
||||||
|
taskId: Number(props.datasource.routerTaskId),
|
||||||
|
taskType: Number(props.datasource.type),
|
||||||
|
type: 1,
|
||||||
|
};
|
||||||
|
console.log(obj)
|
||||||
|
state.tableDataTotalLoading = true;
|
||||||
|
|
||||||
|
api
|
||||||
|
.AttendanceSign(obj)
|
||||||
|
.then((res) => {
|
||||||
|
console.log("签到结果", res, obj);
|
||||||
|
if (res.data.code === 200) {
|
||||||
|
message.destroy();
|
||||||
|
message.success("批量签到成功");
|
||||||
|
state.qdModal = false;
|
||||||
|
state.selectedRowKeys = [];
|
||||||
|
state.selectedStudents = [];
|
||||||
|
getTableData();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log("签到失败", err, obj);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
getTableData();
|
|
||||||
|
|
||||||
const tableDataFunc = () => {
|
const tableDataFunc = () => {
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
title: "工号",
|
title: "工号",
|
||||||
dataIndex: "workNum",
|
dataIndex: "studentUserNo",
|
||||||
key: "workNum",
|
key: "studentUserNo",
|
||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
customRender: (text) => {
|
||||||
|
return (
|
||||||
|
<div class="racona">
|
||||||
|
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "姓名",
|
title: "姓名",
|
||||||
dataIndex: "name",
|
dataIndex: "studentName",
|
||||||
key: "name",
|
key: "studentName",
|
||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "classify",
|
className: "classify",
|
||||||
@@ -499,18 +627,26 @@ export default {
|
|||||||
customRender: (text) => {
|
customRender: (text) => {
|
||||||
return (
|
return (
|
||||||
<div class="racona">
|
<div class="racona">
|
||||||
<span> {text.record.name}</span>
|
<span> {text.record.studentName?text.record.studentName:"-"}</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "所在部门",
|
title: "所在部门",
|
||||||
dataIndex: "com",
|
dataIndex: "studentDepartName",
|
||||||
key: "com",
|
key: "studentDepartName",
|
||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
customRender: (text) => {
|
||||||
|
return (
|
||||||
|
<div class="racona">
|
||||||
|
<span> {text.record.studentDepartName?text.record.studentDepartName:"-"}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "所在岗位",
|
title: "所在岗位",
|
||||||
@@ -519,38 +655,66 @@ export default {
|
|||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
customRender: (text) => {
|
||||||
|
return (
|
||||||
|
<div class="racona">
|
||||||
|
<span> {text.record.studentJobName?text.record.studentJobName:"-"}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "签到时间",
|
title: "签到时间",
|
||||||
dataIndex: "cur",
|
dataIndex: "signTime",
|
||||||
key: "cur",
|
key: "signTime",
|
||||||
width: 110,
|
|
||||||
align: "center",
|
|
||||||
className: "h",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "签退时间",
|
|
||||||
dataIndex: "jin",
|
|
||||||
key: "jin",
|
|
||||||
width: 110,
|
width: 110,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
customRender: (text) => {
|
||||||
|
return (
|
||||||
|
<div class="racona">
|
||||||
|
<span> {text.record.signTime?text.record.signTime:"-"}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "考勤",
|
title: "考勤",
|
||||||
dataIndex: "time",
|
dataIndex: "signStatus",
|
||||||
key: "time",
|
key: "signStatus",
|
||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
customRender: (text) => {
|
||||||
|
// console.log("text", text);
|
||||||
|
return (
|
||||||
|
<div class="racona">
|
||||||
|
<span>
|
||||||
|
{text.record.signStatus
|
||||||
|
? "签到"
|
||||||
|
: text.record.leaveStatus
|
||||||
|
? "请假"
|
||||||
|
: "-"}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "签到状态",
|
title: "签到状态",
|
||||||
dataIndex: "state",
|
dataIndex: "signStatus",
|
||||||
key: "state",
|
key: "signStatus",
|
||||||
width: 50,
|
width: 50,
|
||||||
align: "center",
|
align: "center",
|
||||||
className: "h",
|
className: "h",
|
||||||
|
customRender: (text) => {
|
||||||
|
return (
|
||||||
|
<div class="racona">
|
||||||
|
<span>{text.record.signStatus == null && new Date().getTime() > new Date(state.endTime).getTime() ? "异常" : text.record.signStatus ? "正常" : text.record.leaveStatus ? "异常" : text.record.signStatus == null ? "-" : "异常"}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "考勤情况",
|
title: "考勤情况",
|
||||||
@@ -559,18 +723,118 @@ export default {
|
|||||||
key: "opacation",
|
key: "opacation",
|
||||||
width: 130,
|
width: 130,
|
||||||
align: "center",
|
align: "center",
|
||||||
|
customRender: (value) => {
|
||||||
|
return (
|
||||||
|
<div class="opa" style='display:flex;justify-content:center;align-items:center;'>
|
||||||
|
<div
|
||||||
|
onClick={()=>{
|
||||||
|
console.log("点击签到", value);
|
||||||
|
{/* showsingleqdModal(); */}
|
||||||
|
{/* AttendanceSign */}
|
||||||
|
|
||||||
|
let obj = {
|
||||||
|
courseId: Number(props.datasource.courseId),
|
||||||
|
routerId: Number(props.datasource.routerId),
|
||||||
|
ids: [value.record.studentId],
|
||||||
|
taskId: Number(props.datasource.routerTaskId),
|
||||||
|
taskType: Number(props.datasource.type),
|
||||||
|
type: 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
let obj2 = {
|
||||||
|
courseId: Number(props.datasource.courseId),
|
||||||
|
routerId: Number(props.datasource.projectId),
|
||||||
|
ids: [value.record.studentId],
|
||||||
|
taskId: Number(props.datasource.projectTaskId),
|
||||||
|
taskType: Number(props.datasource.type),
|
||||||
|
type: 2,
|
||||||
|
};
|
||||||
|
console.log(obj, obj2)
|
||||||
|
state.tableDataTotalLoading = true;
|
||||||
|
api.AttendanceSign(props.types==1? obj : obj2).then(res=>{
|
||||||
|
console.log('res----签到是否成功',res)
|
||||||
|
message.destroy()
|
||||||
|
message.info('签到成功')
|
||||||
|
getTableData();
|
||||||
|
}).catch(err=>{
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
style="display:flex;justify-content:center;align-items:center;margin-right:12px;cursor:pointer;">
|
||||||
|
{value.signStatus?
|
||||||
|
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;display:flex;justify-content:center;align-items:center;'>
|
||||||
|
<div style='width:8px;height:8px;border-radius:8px;background:#4ea6ff;'></div>
|
||||||
|
</div>:
|
||||||
|
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;'></div>
|
||||||
|
}
|
||||||
|
<div>签到</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
onClick={()=>{
|
||||||
|
console.log("点击请假", value);
|
||||||
|
{/* showsingleqjModal(); */}
|
||||||
|
|
||||||
|
{/* AttendanceLeave */}
|
||||||
|
let obj = {
|
||||||
|
courseId: Number(props.datasource.courseId),
|
||||||
|
routerId: Number(props.datasource.routerId),
|
||||||
|
ids: [value.record.studentId],
|
||||||
|
taskId: Number(props.datasource.routerTaskId),
|
||||||
|
taskType: Number(props.datasource.type),
|
||||||
|
type: 1,
|
||||||
|
};
|
||||||
|
let obj2 = {
|
||||||
|
courseId: Number(props.datasource.courseId),
|
||||||
|
routerId: Number(props.datasource.projectId),
|
||||||
|
ids: [value.record.studentId],
|
||||||
|
taskId: Number(props.datasource.projectTaskId),
|
||||||
|
taskType: Number(props.datasource.type),
|
||||||
|
type: 2,
|
||||||
|
};
|
||||||
|
console.log(obj, obj2)
|
||||||
|
state.tableDataTotalLoading = true;
|
||||||
|
api.AttendanceLeave(props.types==1? obj : obj2).then(res=>{
|
||||||
|
console.log('res----请假是否成功',res)
|
||||||
|
message.destroy()
|
||||||
|
message.info('请假成功')
|
||||||
|
getTableData();
|
||||||
|
}).catch(err=>{
|
||||||
|
state.tableDataTotalLoading = false;
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
}}
|
||||||
|
style="display:flex;justify-content:center;align-items:center;cursor:pointer;">
|
||||||
|
{value.leaveStatus?
|
||||||
|
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;display:flex;justify-content:center;align-items:center;'>
|
||||||
|
<div style='width:8px;height:8px;border-radius:8px;background:#4ea6ff;'></div>
|
||||||
|
</div>:
|
||||||
|
<div style='width:16px;height:16px;margin-right:6px;border-radius:16px;border:1px solid #ccc;'></div>
|
||||||
|
}
|
||||||
|
<div>请假</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
return columns;
|
return columns;
|
||||||
};
|
};
|
||||||
//清空所选
|
|
||||||
|
// 清空所选
|
||||||
const clearLine = () => {
|
const clearLine = () => {
|
||||||
state.selectedRowKeys = [];
|
state.selectedRowKeys = [];
|
||||||
};
|
};
|
||||||
const showqdModal = () => {
|
const showqdModal = () => {
|
||||||
|
if(state.selectedStudents.length==0){
|
||||||
|
message.destroy()
|
||||||
|
message.error('请选择学员')
|
||||||
|
return
|
||||||
|
}
|
||||||
state.qdModal = true;
|
state.qdModal = true;
|
||||||
};
|
};
|
||||||
const closeqdModal = () => {
|
const closeqdModal = () => {
|
||||||
|
state.selectedRowKeys = [];
|
||||||
state.qdModal = false;
|
state.qdModal = false;
|
||||||
};
|
};
|
||||||
const showsingleqdModal = () => {
|
const showsingleqdModal = () => {
|
||||||
@@ -592,8 +856,78 @@ export default {
|
|||||||
state.singleqjModal = false;
|
state.singleqjModal = false;
|
||||||
};
|
};
|
||||||
const signQR = () => {
|
const signQR = () => {
|
||||||
state.signQRvisible = true;
|
state.codevisible = true;
|
||||||
|
state.codeInfo = {
|
||||||
|
title: "【签到】二维码",
|
||||||
|
name: props.datasource?.name,
|
||||||
|
url:
|
||||||
|
process.env.VUE_APP_BASE_API +
|
||||||
|
`/admin/student/studentSign?taskId=${
|
||||||
|
props.datasource.routerTaskId
|
||||||
|
}&taskType=${props.datasource.type}&type=${2}`,
|
||||||
|
};
|
||||||
|
console.log("codeInfo", state.codeInfo);
|
||||||
|
state.codeIndex = 0;
|
||||||
|
state.codeType = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//搜索学员
|
||||||
|
const searchTaskList = () => {
|
||||||
|
state.tableDataTotalLoading = true;
|
||||||
|
state.currentPage = 1;
|
||||||
|
getTableData();
|
||||||
|
};
|
||||||
|
|
||||||
|
// 重置按钮
|
||||||
|
function resetTaskList() {
|
||||||
|
state.selectedRowKeys = [];
|
||||||
|
state.tableDataTotalLoading = true;
|
||||||
|
state.currentPage = 1;
|
||||||
|
state.name = null;
|
||||||
|
state.projectName2 = undefined;
|
||||||
|
state.tableDataTotal = -1;
|
||||||
|
state.tableDataTotal2 = 0;
|
||||||
|
getTableData();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出数据
|
||||||
|
function exportTaskStu() {
|
||||||
|
console.log("props.datasource", props.datasource);
|
||||||
|
if(props.types==1){
|
||||||
|
window.open(
|
||||||
|
`${
|
||||||
|
process.env.VUE_APP_BASE_API
|
||||||
|
}/admin/student/exportTaskStudent?currentStageId=${
|
||||||
|
props.datasource.chapterId
|
||||||
|
}&type=2&pid=${props.datasource.courseId}&thirdType=1&taskId=${props.datasource.routerTaskId}`
|
||||||
|
);
|
||||||
|
}else{
|
||||||
|
window.open(
|
||||||
|
`${
|
||||||
|
process.env.VUE_APP_BASE_API
|
||||||
|
}/admin/student/exportTaskStudent?currentStageId=${
|
||||||
|
props.datasource.stageId
|
||||||
|
}&type=1&pid=${props.datasource.courseId}&thirdType=1&taskId=${props.datasource.projectTaskId}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// api
|
||||||
|
// .exportTaskStudent({
|
||||||
|
// pageNo: state.currentPage,
|
||||||
|
// pageSize: state.pageSize,
|
||||||
|
// currentStageId: props.datasource.stageId,
|
||||||
|
// currentTaskId: props.datasource.projectTaskId,
|
||||||
|
// type: 1,
|
||||||
|
// pid: props.datasource.projectId,
|
||||||
|
// })
|
||||||
|
// .then((res) => {
|
||||||
|
// console.log(res);
|
||||||
|
// })
|
||||||
|
// .catch((err) => {
|
||||||
|
// console.log(err);
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
selectProjectName,
|
selectProjectName,
|
||||||
@@ -612,6 +946,11 @@ export default {
|
|||||||
closesingleqtModal,
|
closesingleqtModal,
|
||||||
closesingleqjModal,
|
closesingleqjModal,
|
||||||
signQR,
|
signQR,
|
||||||
|
afterVisibleChange,
|
||||||
|
batchSign,
|
||||||
|
searchTaskList,
|
||||||
|
resetTaskList,
|
||||||
|
exportTaskStu
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -455,7 +455,7 @@
|
|||||||
<div
|
<div
|
||||||
class="operation"
|
class="operation"
|
||||||
style="cursor: pointer"
|
style="cursor: pointer"
|
||||||
@click="showAA(item.type, item.name)"
|
@click="showAA(item.type, item.name, item)"
|
||||||
:style="{
|
:style="{
|
||||||
display:
|
display:
|
||||||
item.type === 6 || item.type === 9
|
item.type === 6 || item.type === 9
|
||||||
@@ -1070,7 +1070,9 @@
|
|||||||
<!-- 活动考勤抽屉 -->
|
<!-- 活动考勤抽屉 -->
|
||||||
<active-attendance
|
<active-attendance
|
||||||
v-model:AAvisible="AAvisible"
|
v-model:AAvisible="AAvisible"
|
||||||
|
:datasource="liveData"
|
||||||
:title="showKaoqinText"
|
:title="showKaoqinText"
|
||||||
|
types="1"
|
||||||
classify="2"
|
classify="2"
|
||||||
/>
|
/>
|
||||||
<!-- 时间管理抽屉 -->
|
<!-- 时间管理抽屉 -->
|
||||||
@@ -1569,6 +1571,7 @@ export default {
|
|||||||
evaluationData: "",
|
evaluationData: "",
|
||||||
homeworkData: "",
|
homeworkData: "",
|
||||||
commonData: "",
|
commonData: "",
|
||||||
|
liveData: "",
|
||||||
voteData: "",
|
voteData: "",
|
||||||
commonLevelName: "",
|
commonLevelName: "",
|
||||||
examLevelName: "",
|
examLevelName: "",
|
||||||
@@ -1797,10 +1800,11 @@ export default {
|
|||||||
console.log("facestudent", state.facestudent);
|
console.log("facestudent", state.facestudent);
|
||||||
};
|
};
|
||||||
//考勤的抽屉
|
//考勤的抽屉
|
||||||
const showAA = (course) => {
|
const showAA = (course, a, data) => {
|
||||||
state.AAvisible = true;
|
state.AAvisible = true;
|
||||||
state.showKaoqinText = "【" + course + "】" + "考勤";
|
state.liveData = data;
|
||||||
console.log(state.showKaoqinText, 1111);
|
state.showKaoqinText = "直播";
|
||||||
|
console.log(state.showKaoqinText, 1111, data);
|
||||||
};
|
};
|
||||||
// 时间管理
|
// 时间管理
|
||||||
const showTime = (course) => {
|
const showTime = (course) => {
|
||||||
|
|||||||
@@ -567,7 +567,7 @@
|
|||||||
<div
|
<div
|
||||||
class="operation"
|
class="operation"
|
||||||
style="cursor: pointer"
|
style="cursor: pointer"
|
||||||
@click="showAA(item.name)"
|
@click="showAA(item.type, item.name, item)"
|
||||||
v-if="item.type == 6 || item.type == 9"
|
v-if="item.type == 6 || item.type == 9"
|
||||||
>
|
>
|
||||||
考勤
|
考勤
|
||||||
@@ -1262,12 +1262,14 @@
|
|||||||
v-model:FSvisible="FSvisible"
|
v-model:FSvisible="FSvisible"
|
||||||
:projectTaskInfo="facestudent"
|
:projectTaskInfo="facestudent"
|
||||||
/>
|
/>
|
||||||
<!-- 活动考勤抽屉 -->
|
<!-- 活动直播考勤抽屉 -->
|
||||||
<active-attendance
|
<active-attendance
|
||||||
v-model:AAvisible="AAvisible"
|
v-model:AAvisible="AAvisible"
|
||||||
:title="showkaoqinText"
|
:datasource="liveData"
|
||||||
classify="1"
|
:title="showKaoqinText"
|
||||||
/>
|
types="2"
|
||||||
|
classify="2"
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- 批量面授报名 -->
|
<!-- 批量面授报名 -->
|
||||||
<task-imp-stu v-model:TaskFaceImpStuvisible="TaskFaceImpStuvisible" />
|
<task-imp-stu v-model:TaskFaceImpStuvisible="TaskFaceImpStuvisible" />
|
||||||
@@ -2536,7 +2538,8 @@ export default {
|
|||||||
//直播、面授传递title
|
//直播、面授传递title
|
||||||
showWorkText: "",
|
showWorkText: "",
|
||||||
//直播、活动页面传递参数
|
//直播、活动页面传递参数
|
||||||
showkaoqinText: "",
|
showkaoqinText: "直播",
|
||||||
|
liveData:'',
|
||||||
//所有抽屉的传过去的type
|
//所有抽屉的传过去的type
|
||||||
itemstype: null,
|
itemstype: null,
|
||||||
|
|
||||||
@@ -2869,9 +2872,16 @@ export default {
|
|||||||
state.chooseGroupId = id;
|
state.chooseGroupId = id;
|
||||||
};
|
};
|
||||||
//活动考勤的抽屉
|
//活动考勤的抽屉
|
||||||
const showAA = (title) => {
|
{/* const showAA = (title) => {
|
||||||
state.AAvisible = true;
|
state.AAvisible = true;
|
||||||
state.showkaoqinText = title;
|
state.showkaoqinText = title;
|
||||||
|
}; */}
|
||||||
|
//考勤的抽屉
|
||||||
|
const showAA = (course, a, data) => {
|
||||||
|
state.AAvisible = true;
|
||||||
|
state.liveData = data;
|
||||||
|
state.showKaoqinText = "直播";
|
||||||
|
console.log(state.showKaoqinText, 1111, data);
|
||||||
};
|
};
|
||||||
//作业管理的抽屉
|
//作业管理的抽屉
|
||||||
const showWork = (name, id, item) => {
|
const showWork = (name, id, item) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user