You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js

995 lines
26 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, {Component} from "react";
import CoursesListType from '../coursesPublic/CoursesListType';
import {WordsBtn,ActionBtn} from 'educoder';
import ShixunWorkModal from './Shixunworkdetails/ShixunWorkModal';
import HomeworkModal from "../coursesPublic/HomeworkModal";
import DownloadMessageysl from '../../modals/DownloadMessageysl';
import NoneData from '../coursesPublic/NoneData';
import {
Form,
Select,
Input,
Button,
Checkbox,
Upload,
Icon,
message,
Modal,
Table,
Divider,
InputNumber,
Tag,
DatePicker,
Radio,
Tooltip,
notification,
Pagination,
Spin,
} from "antd";
import {Link, Switch, Route, Redirect} from 'react-router-dom';
import axios from 'axios';
import '../css/members.css'
import "../common/formCommon.css"
import '../css/Courses.css'
import './style.css'
import moment from 'moment';
import 'moment/locale/zh-cn';
import Startshixuntask from "../coursesPublic/Startshixuntask";
const Search = Input.Search;
const CheckboxGroup = Checkbox.Group;
const qs = require('qs');
//课堂作业设置
//作品列表(教师)
class ShixunStudentWork extends Component {
constructor(props) {
super(props);
this.state = {
props: props,
data: undefined,
page: 1,
limit:10,
loadingstate: true,
order: "code_rate",
b_order:"desc",
task_status: [],
course_group_info: [],
teacherdata: undefined,
checkedValuesine: undefined,
checkedValuesineinfo: [],
resultint: 0,
search: undefined,
visible: false,
userid: 0,
visibles: false,
userids: 0,
viewtrainingdata: {},
group_infolist: [],
duplicatechecking: false,
datalist:undefined,
showmodel:false,
jobsettingsdata:undefined,
DownloadType:false,
DownloadMessageval:undefined,
lunxun:true,
}
}
componentDidMount() {
console.log("ShixunStudentWork");
console.log("componentDidMount");
this.getTrainingjobsettings();
this.props.triggerRef(this);
}
// componentWillReceiveProps(nextProps) {
// // console.log("+++++++++916");
// // console.log(nextProps);
// // console.log(this.props)
// // console.log(this.props.isAdmin());
// if (nextProps.code_review != this.props.code_review) {
// if (nextProps.code_review !== undefined) {
// console.log("diaoyonglwangluo1");
// this.getTrainingjobsettings();
// }
// }
//
// }
getTrainingjobsettings=()=>{
this.getupdata();
this.getTrainingjobsetting();
}
// 获取数据地方
getTrainingjobsetting = () => {
var homeworkid = this.props.match.params.homeworkid;
let url = `/homework_commons/${homeworkid}/settings.json`;
axios.get(url).then((result) => {
if(result !== undefined){
this.setState({
jobsettingsdata: result,
})
this.props.Getdataback(result,result.data);
}
})
}
getupdata=(pages)=>{
let {order,b_order,page,limit,group_infolist,search}=this.state;
var homeworkid = this.props.match.params.homeworkid;
let url = "/homework_commons/" + homeworkid + "/code_review_results.json";
axios.get(url,{params:{
order:order,
sort:b_order,
page:pages===undefined?page:pages,
limit:limit,
group_ids:group_infolist,
search:search
},
paramsSerializer: function(params) {
return qs.stringify(params, {arrayFormat: 'brackets'})
}}).then((response) => {
if (response.data.status === undefined || response.data.status === 0) {
if(response.data!=undefined){
if(response.data.status!=-2){
let datas=[];
let list=response.data.users_reviews;
for(var i=0; i<list.length; i++){
datas.push({
number:i+1,
name:list[i].username,
stduynumber:list[i].student_id,
classroom:parseInt(list[i].code_rate),
operating:list[i].user_id
})
}
this.setState({
data: response.data,
datalist:datas,
lunxun:false,
duplicatechecking:false,
});
return;
}
}
}
if (response.data.status === -2) {
this.setState({
duplicatechecking: true
})
notification.open({
message:"提示",
description: response.data.message
});
}
if (response.data.status === -1) {
notification.open({
message:"提示",
description: response.data.message
});
}
this.setState({
lunxun:true,
})
setInterval(() => {
console.log("开始轮询了");
if(this.state.lunxun===true){
console.log("开始轮询了getupdata");
this.getupdatasysk();
}
}, 5000);
}).catch((error) => {
console.log(error)
});
let query = this.props.location.pathname;
const type = query.split('/');
this.setState({
shixuntypes:type[3]
})
};
getupdatasysk=(pages)=>{
let {order,b_order,page,limit,group_infolist,search}=this.state;
var homeworkid = this.props.match.params.homeworkid;
let url = "/homework_commons/" + homeworkid + "/code_review_results.json";
axios.get(url,{params:{
order:order,
sort:b_order,
page:pages===undefined?page:pages,
limit:limit,
group_ids:group_infolist,
search:search
},
paramsSerializer: function(params) {
return qs.stringify(params, {arrayFormat: 'brackets'})
}}).then((response) => {
if (response.data.status === undefined || response.data.status === 0) {
if(response.data!=undefined){
if(response.data.status!=-2){
console.log();
let datas=[];
let list=response.data.users_reviews;
for(var i=0; i<list.length; i++){
datas.push({
number:i+1,
name:list[i].username,
stduynumber:list[i].student_id,
classroom:parseInt(list[i].code_rate),
operating:list[i].user_id
})
}
this.setState({
data: response.data,
datalist:datas,
lunxun:false,
duplicatechecking:false,
});
}
}
}
}).catch((error) => {
console.log(error)
});
}
getcode_review_results=(order,b_order,page,limit,group_infolist,search)=>{
var homeworkid = this.props.match.params.homeworkid;
let url = "/homework_commons/" + homeworkid + "/code_review_results.json";
axios.get(url,{params:{
order:order,
sort:b_order,
page:page,
limit:limit,
group_ids:group_infolist,
search:search
},
paramsSerializer: function(params) {
return qs.stringify(params, {arrayFormat: 'brackets'})
}}).then((response) => {
if (response.data.status === undefined || response.data.status === 0) {
if(response.data!=undefined){
if(response.data.status!=-2) {
let datas = [];
let list = response.data.users_reviews;
for (var i = 0; i < list.length; i++) {
datas.push({
number: i + 1,
name: list[i].username,
stduynumber: list[i].student_id,
classroom: parseInt(list[i].code_rate),
operating: list[i].user_id
})
}
this.setState({
data: response.data,
datalist: datas
})
}
}
}
if (response.data.status === -2) {
this.setState({
duplicatechecking: true
})
notification.open({
message:"提示",
description: response.data.message
});
}
if (response.data.status === -1) {
notification.open({
message:"提示",
description: response.data.message,
});
}
}).catch((error) => {
console.log(error)
});
}
TablePagination = (pages) => {
this.setState({
page:pages
})
this.getupdata(pages)
}
inputSearchValue=(e)=>{
if(e.target.value===""){
this.setState({
search:undefined
})
}else{
this.setState({
search:e.target.value
})
}
}
searchValue=()=>{
let {order,b_order,page,limit,group_infolist,search} = this.state;
this.getcode_review_results(order,b_order,page,limit,group_infolist,search)
}
funorder=(value)=>{
let {order,b_order,page,limit,group_infolist,search} = this.state;
let newb_order;
if(order===value){
if(b_order==="desc"){
this.setState({
order:value,
b_order:"asc"
})
newb_order="asc";
}else{
this.setState({
order:value,
b_order:"desc"
})
newb_order="desc";
}
}else{
if(b_order==="desc"){
this.setState({
order:value,
b_order:"desc"
})
newb_order="desc";
}else{
this.setState({
order:value,
b_order:"asc"
})
newb_order="asc";
}
}
this.setState({
loadingstate:true,
})
this.getcode_review_results(value,newb_order,page,limit,group_infolist,search)
}
groupgroup=(checkedValues)=>{
let {order,b_order,page,limit,search} = this.state;
this.setState({
group_infolist:checkedValues
})
this.getcode_review_results(order,b_order,page,limit,checkedValues,search)
}
Viewstudenttraininginformation =(list)=>{
window.location.href =list
}
workshowmodel=()=>{
this.setState({
showmodel:true
})
}
hideshowmodel=()=>{
this.setState({
showmodel:false
})
}
//立即发布
homeworkstart=()=>{
let homeworkid=this.props.match.params.homeworkid;
let url="/homework_commons/"+homeworkid+"/publish_groups.json";
axios.get(url).then((response) => {
if(response.status===200){
let starttime= this.props.getNowFormatDates(1);
let endtime=this.props.getNowFormatDates(2);
this.setState({
modalname:"立即发布",
modaltype:response.data.course_groups===null||response.data.course_groups.length===0?2:1,
visible:true,
Topval:"学生将立即收到作业",
// Botvalleft:"暂不发布",
Botval:`本操作只对"未发布"的分班有效`,
starttime:"发布时间:"+moment(moment(new Date())).format("YYYY-MM-DD HH:mm"),
endtime:"截止时间:"+endtime,
Cancelname:"暂不发布",
Savesname:"立即发布",
Cancel:this.homeworkhide,
Saves:this.homeworkstartend,
course_groups:response.data.course_groups,
starttimes:starttime,
typs:"start",
})
}
}).catch((error) => {
console.log(error)
});
}
//立即截止
homeworkends=()=>{
let homeworkid=this.props.match.params.homeworkid;
let url="/homework_commons/"+homeworkid+"/end_groups.json";
axios.get(url).then((response) => {
if(response.status===200){
this.setState({
})
this.setState({
modalname:"立即截止",
modaltype:response.data.course_groups===null||response.data.course_groups.length===0?2:1,
visible:true,
Topval:"学生将不能再提交作业",
// Botvalleft:"暂不截止",
Botval:`本操作只对"提交中"的分班有效`,
Cancelname:"暂不截止",
Savesname:"立即截止",
Cancel:this.homeworkhide,
Saves:this.coursetaskend,
starttime:undefined,
endtime:undefined,
typs:"end",
course_groups:response.data.course_groups,
})
}
}).catch((error) => {
console.log(error)
});
}
// 立即发布
homeworkstartend=(ds,endtime)=>{
var homeworkid = this.props.match.params.homeworkid;
let {course_groupslist} = this.state;
let coursesId=this.props.match.params.coursesId;
let url ="/courses/"+coursesId+"/homework_commons/publish_homework.json";
axios.post(url,{
homework_ids:[homeworkid],
group_ids:course_groupslist,
end_time:endtime,
}).then((result)=>{
if(result.status===200){
if(result.data.status===0){
notification.open({
message:"提示",
description: result.data.message,
});
this.homeworkhide()
}
}
}).catch((error)=>{
console.log(error);
})
}
//立即截止确定按钮
coursetaskend=()=>{
var homeworkid = this.props.match.params.homeworkid;
let {course_groupslist} = this.state;
const cid = this.props.match.params.coursesId;
let url="/courses/"+cid+"/homework_commons/end_homework.json";
axios.post(url, {
group_ids:course_groupslist,
homework_ids: [homeworkid],
})
.then((response) => {
if (response.data.status == 0) {
notification.open({
message:"提示",
description: response.data.message,
});
this.homeworkhide()
}
})
.catch(function (error) {
console.log(error);
});
}
getcourse_groupslist=(id)=>{
this.setState({
course_groupslist:id
})
}
homeworkhide=()=>{
this.getupdata()
this.setState({
modalname:undefined,
modaltype:undefined,
visible:false,
Topval:undefined,
Topvalright:undefined,
Botvalleft:undefined,
Botval:undefined,
starttime:undefined,
endtime:undefined,
Cancelname:undefined,
Savesname:undefined,
Cancel:undefined,
Saves:undefined,
StudentList_value:undefined,
addname:undefined,
addnametype:false,
addnametab:undefined,
typs:undefined,
starttimes:undefined,
})
}
// 导出实习报告批量
/// 确认是否下载
// confirmysl(url){
// this.refs.DownloadMessage.confirmysl(url);
// axios.get(url).then((response) => {
// if(response.data.status&&response.data.status===-1){
// }else if(response.data.status&&response.data.status===-2){
// if(response.data.messages === "100"){
// // 已超出文件导出的上限数量100 ),建议:
// this.setState({
// DownloadType:true,
// DownloadMessageval:100
// })
// }else {
// //因附件资料超过500M
// this.setState({
// DownloadType:true,
// DownloadMessageval:500
// })
// }
// }else {
// this.props.showNotification(`正在下载中`);
// window.open("/api"+url, '_blank');
// }
// }).catch((error) => {
// console.log(error)
// });
// }
ChangeTab=(e)=>{
this.props.ChangeTab(e);
}
daochushixunbaogao=()=>{
let url =`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`;
this.confirmysl(url);
}
daochuzuoye =() =>{
let url = `/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`;
this.confirmysl(url);
}
confirmysl(url){
axios.get(url + '?export=true').then((response) => {
if(response === undefined){
return
}
if(response.data.status&&response.data.status===-1){
}else if(response.data.status&&response.data.status===-2){
if(response.data.message === "100"){
// 已超出文件导出的上限数量100 ),建议:
this.setState({
DownloadType:true,
DownloadMessageval:100
})
}else {
//因附件资料超过500M
this.setState({
DownloadType:true,
DownloadMessageval:500
})
}
}else {
this.props.showNotification(`正在下载中`);
window.open("/api"+url, '_blank');
}
}).catch((error) => {
console.log(error)
});
}
Downloadcal=()=>{
this.setState({
DownloadType:false,
DownloadMessageval:undefined
})
}
render() {
let {
data,
search,
order,
duplicatechecking,
datalist,
page,
jobsettingsdata,
} = this.state;
//
// let {data}=this.props;
let columns = [
{
title: '序号',
dataIndex: 'number',
key: 'number',
render: (text, record) => (
<span>
<a style={{"color": '#07111B', "text-align": "center","margin-left": "10px"}}>{record.number}</a>
</span>
)
},
{
title: '姓名',
dataIndex: 'name',
key: 'name',
render: (text, record) => (
<span>
<a style={{"color": '#07111B', "text-align": "center"}}>{record.name}</a>
</span>
)
},
{
title: '学号',
dataIndex: 'stduynumber',
key: 'stduynumber',
render: (text, record) => (
<span>
<a style={{"color": '#9A9A9A', "text-align": "center"}}>{record.stduynumber}</a>
</span>
),
},
{
title: '相似度',
key: 'classroom',
dataIndex: 'classroom',
render: (text, record) => (
<span>
<a style={{"color": record.classroom>=90?'#FF6800':"#747A7F", "text-align": "center"}}>{isNaN(record.classroom)?"--":record.classroom}%</a>
</span>
)
},
{
title: '操作',
dataIndex: 'operating',
key: 'operating',
render: (text, record) => (
<span>
<a onClick={()=>this.Viewstudenttraininginformation("/courses/"+this.props.match.params.coursesId+"/"+this.state.shixuntypes+"/"+this.props.match.params.homeworkid+"/review_detail/"+record.operating)} >查看</a>
</span>
)
},
];
if(this.props.isNotMember()===true){
columns.some((item,key)=> {
if (item.title === "学号") {
columns.splice(key, 1)
return true
}
}
)
}
const antIcon = <Icon type="loading" style={{ fontSize: 24 }} spin />;
return (
<div className=" clearfix " style={{margin: "auto" , minWidth:"1200px"}}>
{this.state.showmodel===true?<ShixunWorkModal
{...this.props}
visible={this.state.showmodel}
modalname={"代码查重"}
data={data&&data.group_info}
issCancel={()=>this.hideshowmodel()}
updatas={()=>this.getupdata()}
/>:""}
<DownloadMessageysl
{...this.props}
value={this.state.DownloadMessageval}
modalCancel={this.Downloadcal}
modalsType={this.state.DownloadType}
/>
{/*<DownloadMessage*/}
{/* {...this.props}*/}
{/* refs="DownloadMessage"*/}
{/*/>*/}
{/*立即发布*/}
<HomeworkModal
modaltype={this.state.modaltype}
modalname={this.state.modalname}
visible={this.state.visible}
Topval={this.state.Topval}
Topvalright={this.state.Topvalright}
Botvalleft={this.state.Botvalleft}
Botval={this.state.Botval}
starttime={this.state.starttime}
endtime={this.state.endtime}
Cancelname={this.state.Cancelname}
Savesname={this.state.Savesname}
Cancel={this.state.Cancel}
Saves={this.state.Saves}
course_groups={this.state.course_groups}
getcourse_groupslist={(id)=>this.getcourse_groupslist(id)}
starttimes={this.state.starttimes}
typs={this.state.typs}
/>
<div className={"educontent "}>
<div className="edu-back-white">
<style>
{`
.startbox{
height: 48px;
background: rgba(255,104,0,0.1);
line-height: 48px;
text-align: center;
}
.startfont{
font-size:14px;
font-family:MicrosoftYaHei;
font-weight:400;
color:rgba(255,104,0,1);
}
.shixunSpin{
color:#FF6801;
margin-right: 10px;
}
`}
</style>
<li className="clearfix startbox mb20" style={{display:duplicatechecking===true?"":"none"}}>
<Spin indicator={antIcon} spinning={duplicatechecking} className={"shixunSpin"}/>
<span className={"startfont"}>
正在执行查重完成后将为您自动刷新结果 温馨提示执行时间因查重作品数以及作品的代码量而异
</span>
</li>
<div className="justify break_full_word new_li edu-back-white" style={{minHeight: '480px',display:duplicatechecking===true?"":"none"}}>
<NoneData></NoneData>
</div>
<style>
{`
.newbutton{
width: 100px;
border: 1px solid #29BD8B;
color: #29BD8B!important;
}
`}
</style>
{data&&data?
<div style={{display:duplicatechecking===false?"":"none"}}>
<ul className="clearfix" style={{padding: '20px 16px 10px'}}>
<li className="clearfix ">
<span className="fl mr10 color-grey-8 ">查重时间{data&&data.last_review_time}</span>
{this.props.isAdmin()?duplicatechecking===false?<span className="fl ">
<a className="Actionbtn newbutton mr20 fl" onClick={this.workshowmodel}>代码查重</a>
</span>:"":""}
{/*请输入姓名或学号搜索*/}
<div className="fr mr5 search-new" style={{marginBottom: '1px'}}>
<Search
placeholder="请输入姓名或学号搜索"
id="subject_search_input"
autoComplete="off"
value={search}
onInput={this.inputSearchValue}
onSearch={this.searchValue}
></Search>
</div>
</li>
{/*分班情况*/}
{data&&data.group_info.length===0?"":<li className="clearfix mt10">
<span className="fl mr10 color-grey-8">分班情况</span>
<span className="fl ">
<a id="graduation_comment_no_limit"
onClick={()=>this.groupgroup([])}
className={this.state.group_infolist.length===0?"pl10 pr10 mr20 check_on":"pl10 pr10 mr20 "}>
不限
</a>
</span>
<CheckboxGroup onChange={this.groupgroup}
value={this.state.group_infolist}
style={{paddingTop: '4px',float: 'left',
maxWidth: '1020px'}}
>
{data&&data.group_info === undefined ? "" : data&&data.group_info.map((item, key) => {
return (
<span key={key}>
<Checkbox value={item.id} key={item.id} className="fl ">
<span>
{item.name}({item.members_count})
</span>
</Checkbox>
</span>
)
})}
</CheckboxGroup>
</li>}
</ul>
<div id="graduation_work_list" style={{padding: '0px 16px 10px'}}>
<div className="clearfix">
<span className="fl color-grey-6 font-12">
<span className="color-orange-tip">
{data&&data.copy_reviews_count}</span>
个疑似抄袭作品{data&&data.all_reviews_count}作品 </span>
<div className="fr color-grey-6 edu-menu-panel" style={{color: '#989898'}}>
<p>
<a data-remote="true" className={"color-grey-9 font-12"}>
{order === "code_rate" ? "相似度" : order === "student_id" ? "学号" : ""}
</a>
<i className="iconfont icon-xiajiantou ml5 font-12 color-grey-6"></i>
</p>
<ul className="edu-menu-list" style={{"width": "80px"}}>
<li onClick={(e) => this.funorder("code_rate")}>
<a className={"color-grey-9 font-12"} style={{"text-align": "center "}}>相似度</a>
</li>
<li onClick={(e) => this.funorder("student_id")}>
<a className={"color-grey-9 font-12"} style={{"text-align": "center "}}>学号</a>
</li>
</ul>
</div>
</div>
</div>
<div className={"justify break_full_word new_li edu-back-white"} style={{minHeight: "480px"}}>
<style>{`
.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot {
top: 72%;}
}
`}</style>
{datalist === undefined ? "" : datalist.length===0? <div className="alltask">
<div className="edu-tab-con-box clearfix edu-txt-center">
<img className="edu-nodata-img mb20" src="/images/educoder/nodata.png" />
<p className="edu-nodata-p mb20">暂时还没有相关数据哦</p>
</div>
</div>:<Table
dataSource={datalist}
columns={columns}
pagination={false}
/>}
</div>
</div>:""}
</div>
{
datalist === undefined ? "":datalist.length===0?"":datalist.length<11?
<div className="edu-txt-center mt30 mb20">
<Pagination showQuickJumper current={page}
onChange={this.TablePagination} pageSize={10}
total={datalist.length===0?0:data&&data.copy_reviews_count}></Pagination>
</div>
: ""
}
</div>
</div>
)
}
}
export default ShixunStudentWork;
// <div className="stud-class-set bor-bottom-greyE ">
// <div className=" clearfix edu-back-white poll_list">
// <a onClick={(e)=>this.ChangeTab(0)}>作品列表</a>
// <a onClick={(e)=>this.ChangeTab(1)}>作业问答</a>
// {this.props.isAdmin()?<a className="active" onClick={(e)=>this.ChangeTab(2)}>代码查重</a>:""}
// <a onClick={(e)=>this.ChangeTab(3)}>设置</a>
// <style>{`
// .drop_down_menu li a {
// padding: 0px;
// font-size: 14px;
// }
// .drop_down_menu {
// width: 93px;
// }
// .drop_down_menu li {
// overflow: visible;
// width: 93px;
// }
// .drop_down_menu, .drop_down_normal {
// padding-top: 10px;
// padding-bottom: 8px;
// }
// a:hover {
// color:#1A0B00 !important;
// }
// `}</style>
// {this.props.isAdmin() ? <li className="li_line drop_down fr color-blue font-16 mr8 mt20" style={{"padding": "0 20px"}}>
// 导出<i className="iconfont icon-xiajiantou font-12 ml2"></i>
// <ul className="drop_down_menu" style={{"right": "-0px", "left": "unset", "height": "auto"}}>
// <li><a onClick={()=>this.confirmysl(`/zip/shixun_report?homework_common_id=${this.props.match.params.homeworkid}`)}>实训报告</a>
// </li>
// <li><a onClick={()=>this.confirmysl(`/homework_commons/${this.props.match.params.homeworkid}/works_list.xlsx`)}>学生成绩</a>
// </li>
// </ul>
// </li> : ""}
// {this.props.isAdmin()?
// data&&data.end_immediately===true?
// <a className="fr color-blue font-16" onClick={this.homeworkends}>立即截止</a>
// :"": ""}
// {this.props.isAdmin()?
// data&&data.publish_immediately===true?
// <a className="fr color-blue font-16" onClick={this.homeworkstart}>立即发布</a> : "": ""}
// {
// jobsettingsdata&& jobsettingsdata.data === undefined ? ""
// : jobsettingsdata&& jobsettingsdata.data.commit_des === null || jobsettingsdata&& jobsettingsdata.data.commit_des === undefined ? "" :
// <a className="fr color-blue font-16"
// href={`/courses/${this.state.props.match.params.coursesId}/${this.state.shixuntypes}/${ jobsettingsdata&& jobsettingsdata.data === undefined ? "" : jobsettingsdata&& jobsettingsdata.data.id}/commitsummary/${this.state.props.match.params.homeworkid}`}>{ jobsettingsdata&& jobsettingsdata.data.commit_des}</a>
// }
// { jobsettingsdata&&jobsettingsdata.data === undefined ? "" : <Startshixuntask
// {...this.props}
// data={ jobsettingsdata&& jobsettingsdata.data}
// />}
{/* </div>*/}
{/*</div>*/}