dbsd_kczx/src/views/zy/zyInfo/StudentZyInfoList.vue

518 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div style="background: #fff; height: calc(100vh - 225px); overflow-y: auto; overflow-x: hidden; margin: 10px 5px">
<!--查询区域-->
<!-- <div class="jeecg-basic-table-form-container">
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
<a-col :lg="8">
<a-form-item label="作业名称">
<j-input placeholder="请输入作业名称" v-model:value="queryParam.title"></j-input>
</a-form-item>
</a-col>
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
</a-col>
</span>
</a-col>
</a-row>
</a-form>
</div> -->
<a-row>
<a-col :span="24" v-for="(item, index) in tableData" :key="index" style="padding: 0px 0px 5px 5px; border-radius: 10px; overflow: hidden;">
<div style="width: 100%; height:40px;border-radius: 10px 10px 0 0; background-color: #cdf5ed">
<a-col :span="24" style="height:40px; line-height:40px; padding-left:15px; color:#333; overflow: hidden;" >
<!-- <div style="font-size: 18px;font-weight: bold;" class="ellipsis">{{item.title}}</div> -->
<div style="font-size: 18px; font-weight: bold">第{{ item.sort }}次作业</div>
</a-col>
</div>
<a-card style="height:165px; border: 1px solid #eeeeee">
<div class="rotate" :style="classFun(item)">{{ callText(item) }}</div>
<a-row style="top: -60px; position: relative">
<a-col :span="24" class="zytitle" :title="item.title">{{ item.title }}</a-col>
<a-col :span="12" class="zyCon"><span class="zyCon-word">作业时间:</span>{{ dayjs(item.startTime).format('YYYY.MM.DD HH:mm') }} ~ {{ dayjs(item.endTime).format('YYYY.MM.DD HH:mm') }}</a-col>
<a-col :span="12" class="zyCon"><span class="zyCon-word">互评时间:</span><span v-if="item.xshpkg == '1'">{{ dayjs(item.xshpkssj).format('YYYY.MM.DD HH:mm') }} ~ {{ dayjs(item.xshpjssj).format('YYYY.MM.DD HH:mm') }}</span><span v-else>未设置互评</span></a-col>
<a-col :span="12" class="zyCon Score-List">
<!-- <div class="Score-List-row">
<span class="List-row-number">{{ item.stuscore ? item.stuscore : '未评' }}分</span>
<span class="List-row-word">作业得分</span>
</div>
<div class="Score-List-row" v-if="handleSfkshp(item)" @click="handleHpfs(item)">
<span class="List-row-number">{{ item.xshpfs ? item.xshpfs : '未评' }}分</span>
<span class="List-row-word">互评分数</span>
</div>
<div class="Score-List-row" v-if="handleSfkshp(item)">
<span class="List-row-number">{{ item.jxfs ? item.jxfs : '未评' }}分</span>
<span class="List-row-word">互评奖励</span>
</div> -->
<a-popover title="得分情况">
<template #content>
<p>作业得分:{{ item.stuscore ? item.stuscore : '未评' }}分</p>
<p v-if="item.jxfs">互评奖励:{{ item.jxfs ? item.jxfs : '未评' }}分</p>
</template>
<div class="Score-List-row">
<span class="List-row-number">{{ item.zzdf ? item.zzdf : '未评' }}分</span>
<span class="List-row-word">总分</span>
</div>
</a-popover>
<a-popover title="查重情况">
<template #content>
<p><span class="zyCon-word">维普资源库查重:</span>{{ getCctype(item, '1') }}</p>
<p><span class="zyCon-word">本次作业查重:</span>{{ getCctype(item, '2') }}</p>
<p><span class="zyCon-word">学校作业库查重:</span>{{ getCctype(item, '4') }}</p>
<p><span class="zyCon-word">Aigc查重</span>{{ getCctype(item, '3') }}</p>
</template>
<div class="Score-List-row">
<span class="List-row-number">{{ item.zgccl?item.zgccl:'-' }}</span>
<span class="List-row-word">查重率</span>
</div>
</a-popover>
<!-- <div class="Score-List-row">
<span class="List-row-number">{{ item.zgccl?item.zgccl:'-' }}</span>
<span class="List-row-word">查重率</span>
</div> -->
</a-col>
<!-- <a-col :span="24" class="zyCon">
<div style="float: left" class="wpopen" :title="item.wwsftg" @click="handleOpenCcjg(item, '0')"><span class="zyCon-word">维普资源库查重:</span>{{ getCctype(item, '1') }}</div>
<div style="float: right" class="wpopen" :title="item.nwsftg" @click="handleOpenCcjg(item, '1')"><span class="zyCon-word">本次作业查重:</span>{{ getCctype(item, '2') }}</div>
</a-col>
<a-col :span="24" class="zyCon">
<div style="float: left" class="wpopen" :title="item.xnsftg" @click="handleOpenCcjg(item, '3')"><span class="zyCon-word">学校作业库查重:</span>{{ getCctype(item, '4') }}</div>
<div style="float: right" class="wpopen" :title="item.aigcsftg" @click="handleOpenCcjg(item, '2')"><span class="zyCon-word">Aigc查重</span>{{ getCctype(item, '3') }}</div>
</a-col> -->
<a-col :span="12" style="text-align: center; margin-top:12px; border-top: 1px solid #f6f6f6; padding-top:15px">
<a-button class="zyCon-button" type="primary" @click="handleDetail(item)">
详情
</a-button>
<a-button class="zyCon-button" type="primary" @click="handleShangchuan(item)" v-if="!item.stuFilePath">
上传
</a-button>
<a-button class="zyCon-button" type="primary" @click="handleDownload(item)" v-if="item.stuFilePath">
下载
</a-button>
<a-button class="zyCon-button" type="primary" @click="handlePreview(item)" v-if="item.stuFilePath">
预览
</a-button>
<a-button class="zyCon-button" type="primary" @click="handleHuping(item)" v-if="handleSfkshp(item)==1 || handleSfkshp(item)==2" :disabled="handleSfkshp(item)!=1" :title="handleSfkshp(item)==1?'':'未到互评时间或已过互评时间'">
互评
</a-button>
</a-col>
</a-row>
</a-card>
</a-col>
<a-col :span="24">
<div v-show="tableData.length > 0">
<a-pagination v-model="current" :total="total" @change="handlePageChange" :pageSize="pageSize" style="text-align: right; margin-top:5px; margin-bottom:10px" />
</div>
<div v-show="tableData.length == 0">
<a-empty />
</div>
</a-col>
</a-row>
<ZyInfoDetailModal ref="registerModal" @success="handleSuccess"></ZyInfoDetailModal>
<ZyInfoStudentListModal ref="ZyInfoStudentListModalPage"></ZyInfoStudentListModal>
<ZyInfoStudentModal ref="ZyInfoStudentModalPage" @success="handleSuccess"></ZyInfoStudentModal>
<XxhbbksListModal ref="XxhbbksListModalPage"></XxhbbksListModal>
</div>
</template>
<script lang="ts" name="zyInfo-zyInfo" setup>
import { ref, reactive, onMounted, unref } from 'vue';
import { list, deleteOne } from './ZyInfo.api';
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
import { Input, Popover, Pagination, Empty } from 'ant-design-vue';
import { defHttp } from '/@/utils/http/axios';
import { useMessage } from '/@/hooks/web/useMessage';
import { useRouter } from 'vue-router';
import { downloadFile } from '/@/utils/common/renderUtils';
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
import { useGlobSetting } from '/@/hooks/setting';
import dayjs from 'dayjs';
import JInput from '/@/components/Form/src/jeecg/components/JInput.vue';
import ZyInfoDetailModal from './components/ZyInfoDetailModal.vue';
import ZyInfoStudentListModal from '/@/views/zy/zyInfoStudent/ZyInfoStudentListModal.vue';
import ZyInfoStudentModal from '/@/views/zy/zyInfoStudent/components/ZyInfoStudentModal.vue';
import XxhbbksListModal from '/@/views/kc/xxhbbks/XxhbbksListModal.vue';
import { def } from '@vue/shared';
//当前路由信息
const { currentRoute } = useRouter();
const { query } = unref(currentRoute);
const { rwbh, xqxn, type, teano } = query; //获取传递参数
const APagination = Pagination;
const { createConfirm, createMessage } = useMessage();
const queryParam = ref<any>({});
const toggleSearchStatus = ref<boolean>(false);
const registerModal = ref();
const ZyInfoStudentListModalPage = ref();
const ZyInfoStudentModalPage = ref();
const XxhbbksListModalPage = ref();
const current = ref<number>(0);
const total = ref<number>(0);
const pageNo = ref<number>(0);
const pageSize = ref<number>(6);
const tableData = ref<any>([]);
const globSetting = useGlobSetting();
const baseApiUrl = globSetting.domainUrl;
let router = useRouter();
const labelCol = reactive({
xs: { span: 24 },
sm: { span: 7 },
});
const wrapperCol = reactive({
xs: { span: 24 },
sm: { span: 16 },
});
function handleHpfs(record){
var href = '/stuzy/zyhpDetail';
router.push({ path: href, query: { rwbh, xqxn, type, teano, zyStuId: record.stuId, mainId: record.id } });
}
function handleOpenCcjg(record, type) {
var text = "0";
if (type == '0') {
if (record.wwcc == 'true') {
text = '1';
} else {
text = '0';
}
} else if (type == '1') {
if (record.nwcc == 'true') {
text = '1';
} else {
text = '0';
}
} else if (type == '2') {
if (record.aigccc == 'true') {
text = '1';
} else {
text = '0';
}
} else if (type == '3') {
if (record.xncc == 'true') {
text = '1';
} else {
text = '0';
}
}
if(text == '0'){
createMessage.error("此项不查重,请更换查询");
return;
}
defHttp.get({ url: '/zyCcjg/zyCcjg/getCcjg', params: { zyStuId: record.stuId, ccType: type } }).then((res) => {
console.log('🧙‍♂️', res);
var url = res.paperviewurl;
if(url){
window.open(url, '_blank');
}else{
createMessage.error("当前暂无结果");
}
});
}
function handleSfkshp(record) {
var sfkshp = record.xshpkg;
var xshpkssj = new Date(record.xshpkssj);
var xshpjssj = new Date(record.xshpjssj);
var nowTime = new Date();
if (record.stuFilePath && sfkshp == '1' && nowTime.getTime() >= xshpkssj.getTime() && nowTime.getTime() <= xshpjssj.getTime()) {
return 1;
}else if(record.stuFilePath && sfkshp == '1'){
return 2
}else{
return 3;
}
}
function handleHuping(record) {
console.log('🧒', record);
var href = '/stuzy/zyhp';
router.push({ path: href, query: { rwbh, xqxn, type, teano, zyStuId: record.stuId, mainId: record.id } });
}
function getCctype(record, type) {
var text = '-';
if (type == '1') {
if (record.wwcc == 'true') {
if (record.wwxsl) {
text = record.wwxsl + '%';
} else if (record.wwsftg && record.wwsftg.indexOf('失败') != -1) {
text = '失败';
} else if (record.stuFilePath) {
text = '检测中';
} else {
text = '待提交';
}
} else {
text = '不查重';
}
} else if (type == '2') {
if (record.nwcc == 'true') {
if (record.nwxsl) {
text = record.nwxsl + '%';
} else if (record.nwsftg && record.nwsftg.indexOf('失败') != -1) {
text = '失败';
} else if (record.stuFilePath) {
text = '检测中';
} else {
text = '待提交';
}
} else {
text = '不查重';
}
} else if (type == '3') {
if (record.aigccc == 'true') {
if (record.aigcxsl) {
text = record.aigcxsl + '%';
} else if (record.aigcsftg && record.aigcsftg.indexOf('失败') != -1) {
text = '失败';
} else if (record.stuFilePath) {
text = '检测中';
} else {
text = '待提交';
}
} else {
text = '不查重';
}
} else if (type == '4') {
if (record.xncc == 'true') {
if (record.xnxsl) {
text = record.xnxsl + '%';
} else if (record.xnsftg && record.xnsftg.indexOf('失败') != -1) {
text = '失败';
} else if (record.stuFilePath) {
text = '检测中';
} else {
text = '待提交';
}
} else {
text = '不查重';
}
}
return text;
}
function classFun(record) {
if (record.stuscore) {
return 'background: linear-gradient(180deg, #4ad5b9, #18a689);';
} else if (record.stuFilePath) {
return 'background: linear-gradient(180deg, #fea317, #ff7d28);';
} else {
return 'background: linear-gradient(180deg, #f84444, #d40505)';
}
}
function callText(record) {
if (record.stuscore) {
return '已完成';
} else if (record.stuFilePath) {
return '待评分';
} else {
return '待提交';
}
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
registerModal.value.disableSubmit = true;
registerModal.value.edit(record);
}
//上传作业附件
function handleShangchuan(record) {
let timestamp = new Date().getTime();
let startTimestamp = Date.parse(record.startTime);
if (timestamp < startTimestamp) {
createMessage.error('还未到提交作业时间!');
return;
}
let endTimestamp = Date.parse(record.endTime);
if (timestamp > endTimestamp) {
createMessage.error('提交作业时间已过!');
return;
}
ZyInfoStudentModalPage.value.disableSubmit = false;
var param = { id: record.stuId, zyfj: record.filePath };
ZyInfoStudentModalPage.value.edit(param);
// createConfirm({
// iconType: 'warning',
// title: '确认上传',
// content: '作业上传后,不可修改,请仔细检查后提交',
// okText: '确认',
// cancelText: '取消',
// onOk: () => {
// ZyInfoStudentModalPage.value.disableSubmit = false;
// var param = {id:record.stuId,zyfj:record.filePath}
// ZyInfoStudentModalPage.value.edit(param);
// }
// });
}
//预览
function handlePreview(record) {
var url2 = getFileAccessHttpUrl(record.stuPdfPath);
let url = baseApiUrl + '/generic/web/viewer.html?file=' + encodeURIComponent(url2);
window.open(url, '_blank');
}
function handleDownload(record) {
downloadFile(record.stuFilePath);
}
//获取选课人数
function openXkrs(record) {
console.log(`🚀 ~ openXkrs ~ record:`, record);
XxhbbksListModalPage.value.disableSubmit = false;
XxhbbksListModalPage.value.init(record);
}
/**
* 成功回调,用于增加、修改、发布和撤回
*/
function handleSuccess() {
reload();
}
/**
* 查询
*/
function searchQuery() {
total.value = 1;
handlePageChange(1);
}
/**
* 重置
*/
function searchReset() {
queryParam.value = {};
//刷新数据
total.value = 1;
handlePageChange(1);
}
function reload() {
queryParam.value.pageNo = current.value;
queryParam.value.pageSize = pageSize.value;
queryParam.value.rwbh = rwbh;
queryParam.value.xqxn = xqxn;
queryParam.value.teano = teano;
queryParam.value.zyStatus = '1,2,3,4';
queryParam.value.column = 'createTime';
queryParam.value.order = 'desc';
defHttp.get({ url: '/zyInfo/zyInfo/stuList', params: queryParam.value }).then((res) => {
// console.log(`🚀 ~ defHttp.get ~ res:`, res)
total.value = res.total;
pageNo.value = res.pages;
current.value = res.current;
tableData.value = res.records;
});
}
function handlePageChange(record) {
current.value = record;
reload();
}
onMounted(() => {
searchQuery();
});
</script>
<style lang="less" scoped>
.jeecg-basic-table-form-container {
padding: 0;
width: 99%;
.table-page-search-submitButtons {
display: block;
margin-bottom: 24px;
white-space: nowrap;
}
.query-group-cust {
width: calc(50% - 15px);
min-width: 100px !important;
}
.query-group-split-cust {
width: 30px;
display: inline-block;
text-align: center;
}
}
.jeecg-basic-table-form-container .ant-form {
padding: 12px 10px 0px 10px;
margin-bottom: 0px;
background-color: #fff;
border-radius: 2px;
}
.ellipsis {
overflow: hidden; /* 确保超出容器的内容被裁剪 */
white-space: nowrap; /* 确保文本在一行内显示 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
}
.zyCon {
line-height: 30px;
color: #999;
}
.rotate {
transform: rotate(45deg);
background: linear-gradient(90deg, #93d861, #8ddc53, #35C495);
color: #fff;
padding: 10px;
position: relative;
top: -68px;
right: -400px;
text-align: center;
font-size: 12px;
}
.wpopen:hover{
cursor: pointer;
color:#18a689;
}
.zyCon-word{
color: #333;
}
.Score-List{
display: flex;
padding: 10px 0;
}
.Score-List-row{
display: flex;
width: 50%;
flex-direction:column;
margin-right: 10px;
justify-content: center;
text-align: center;
background: #f7f7f7;
padding: 10px 0;
}
.List-row-number{
font-weight: bold;
font-size: 18px;
color: #ffa200;
}
.Score-List-row :hover{
color: #1ab394;
cursor: pointer;
}
.List-row-word{
color: #999;
font-size: 12px;
}
.zyCon-button{
margin-right: 10px;
}
.zytitle{
font-size: 16px;
font-weight: 700;
overflow: hidden; /* 确保超出容器的内容被裁剪 */
white-space: nowrap; /* 确保文本在一行内显示 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
}
</style>