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

1973 lines
67 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: #fafafa; height: calc(100vh - 225px); overflow-y: auto; margin: 10px 0; padding: 8px 0 0 0">
<div v-if="showType == 0">
<a-row>
<a-col :span="24"><span class="title">课程考试次数设置</span><a-divider /></a-col>
<div class="tishi">温馨提示:设置完成后,您也可以在课程教学过程中,随时根据实际情况进行调整。</div>
<div class="work-img">
<img class="work-img-img" src="../../../assets/images/homework.png" />
</div>
<a-col :span="24" style="text-align: center; color: #494b56">
<div>老师您好,</div>
<div>请根据课程教学大纲的要求,</div>
<div>设置学生修完本课程需要完成的考试次数及每次考试在总成绩中所占的比例。</div>
<div style="margin-top: 30px" class="ant-btn buttonClass"><a @click="handleSzzycs(1)">设置考试次数</a></div>
</a-col>
</a-row>
</div>
<div v-if="showType == 1">
<a-row>
<a-col :span="24"><span class="title">期末考试次数设置</span><a-divider /></a-col>
<a-col :span="24" style="padding: 0 0 0 30px">
<a-row>
<a-col :span="24" style="margin-top: 10px; height: 50px">
<a-row style="text-align: center">
<a-col :span="8"
><span>课程作业占比:</span><span>{{ kczyzb }}%;</span></a-col
>
<a-col :span="8"
><span>期末考试占比:</span><span>{{ qmkszb }}%;</span></a-col
>
<a-col :span="8"
><span>课堂测验占比:</span><span>{{ ktcyzb }}%;</span></a-col
>
</a-row>
</a-col>
<a-col :span="18" style="margin-top: 5px">
<span style="color: #777777">学生修完本课程需要完成的考试次数:</span>
<a-input-number style="width: 30%" v-model:value="zycs" @change="handleZycs" :max="100" disabled /><span style="margin-left: 5px"
>次</span
>
</a-col>
<!-- <a-col :span="6" style="text-align: right; padding: 5px 0 0 0">
<a @click="handleAddZycs" class="ant-btn buttonClass mar-right20"><Icon icon="ant-design:file-add-outlined" />新增考试</a>
</a-col> -->
</a-row>
</a-col>
<a-col :span="24" style="margin-top: 10px">
<a-table :columns="columns" :data-source="tableData" :pagination="false">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'score'">
<span>
<a-input-number v-model:value="record.score" :min="0" :max="100" @blur="handleJscjbfb">
<template #addonAfter> % </template></a-input-number
>
</span>
</template>
<template v-else-if="column.key === 'lstitle'">
<span> 第{{ record.sort }}次考试 </span>
</template>
<template v-else-if="column.key === 'action'">
<span>
<a @click="handleDelZycs(record.sort)">删除</a>
</span>
</template>
</template>
</a-table>
</a-col>
<a-col :span="24" style="margin-top: 30px; font-size: 18px">
<div style="text-align: center">
<a-button class="buttonClass" @click="handleBatchAdd"><Icon icon="ant-design:save-outlined" />保存</a-button>
<a-divider type="vertical" />
<a-button class="buttonClass" @click="reloadZy"><Icon icon="ant-design:export-outlined" />返回</a-button>
</div>
</a-col>
</a-row>
</div>
<div v-if="showType == 2">
<a-spin :spinning="confirmLoading">
<a-row>
<a-col :span="24">
<div style="text-align: right">
<a-button style="margin-right: 10px" type="primary" @click="handleYyzy" :disabled="editDisabled">引用作业</a-button>
</div>
<span class="title">编辑考试</span> - <span class="title2">布置考试:设置第{{ zyInfo.sort }}次考试内容及要求</span>
<a-divider />
</a-col>
<a-col :span="24">
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-row>
<a-col :span="24">
<div class="region">
<div class="region-title"><span class="region-title-headline"></span>基本信息</div>
<a-col :span="24">
<a-form-item label="考试题目" v-bind="validateInfos.title">
<a-input v-model:value="zyInfo.title" placeholder="请输入考试题目" :disabled="editDisabled"></a-input>
</a-form-item>
</a-col>
<!-- <a-col :span="24">
<a-form-item label="考察内容" v-bind="validateInfos.kcnr">
<a-textarea v-model:value="zyInfo.kcnr" placeholder="请输入描述" hidden></a-textarea>
<a-button type="primary" @click="handleKcnr" :disabled="editDisabled">选择</a-button>
</a-form-item>
</a-col>
<a-col :span="24" style="padding: 0 20px" v-if="dataKhnr.length > 0">
<a-table :columns="columnsKhnr" rowKey="id" :data-source="dataKhnr" :pagination="false" />
</a-col> -->
<a-col :span="24">
<a-form-item label="考试截止时间" v-bind="validateInfos.endTime">
<a-date-picker
placeholder="请选择考试截止时间"
v-model:value="zyInfo.endTime"
:disabled-date="disabledDate"
:show-time="{ format: 'YYYY-MM-DD HH:mm' }"
valueFormat="YYYY-MM-DD HH:mm"
format="YYYY-MM-DD HH:mm"
style="width: 100%"
@change="handleEndTime"
/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="考试发布时间" v-bind="validateInfos.startTime">
<a-date-picker
placeholder="请选择考试发布时间"
v-model:value="zyInfo.startTime"
:disabled-date="disabledDate"
:show-time="{ format: 'YYYY-MM-DD HH:mm' }"
valueFormat="YYYY-MM-DD HH:mm"
format="YYYY-MM-DD HH:mm"
style="width: 90%"
:disabled="editDisabled"
/>
<span>
<a-popover title="温馨提示">
<template #content>
<p
>填写考试发布时间,则考试在指定时间进行发布;如未填写考试发布时间,则布置完成考试后,可手动点击“发布考试”进行考试发布。</p
>
</template>
<Icon
icon="ant-design:question-circle-outlined"
:size="20"
style="float: right; margin-top: 5px; color: #029c88; margin-right: 19px"
/>
</a-popover>
</span>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="考试要求" v-bind="validateInfos.content">
<j-editor v-model:value="zyInfo.content" v-if="zyyqShow" @blur="handleZyyqShow(0)" />
<div style="color: #777777" v-html="zyInfo.content" v-if="!zyyqShow"></div>
<div @click="handleZyyqShow(1)" class="tishi" v-if="!editDisabled">温馨提示:点击可编辑考试要求</div>
<!-- <div @click="handleZyyqShow(1)"><span style="cursor: pointer; color: #18a689">温馨提示:点击可编辑考试要求</span></div> -->
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="参考资料" v-bind="validateInfos.filePath">
<j-upload v-model:value="zyInfo.filePath" :disabled="editDisabled"></j-upload>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="评分标准" layout="inline" v-bind="validateInfos.pfbz">
<a-form-item
label="是否允许学生查看"
:labelCol="labelCol2"
:wrapperCol="wrapperCol2"
style="margin-top: -1px; margin-left: -17px"
>
<j-dict-select-tag
type="radio"
v-model:value="zyInfo.sturead"
dictCode="yn"
placeholder="请选择评分标准是否允许学生查看"
:disabled="editDisabled"
/>
</a-form-item>
<a-form-item label="">
<j-editor v-model:value="zyInfo.pfbz" v-if="pfbzShow" @blur="handlePfbzShow(0)" />
<div v-html="zyInfo.pfbz" v-if="!pfbzShow"></div>
<div class="tishi" @click="handlePfbzShow(1)" v-if="!editDisabled">温馨提示:点击可编辑评分标准</div>
</a-form-item>
</a-form-item>
</a-col>
</div>
</a-col>
<a-col :span="24">
<div class="region">
<div class="region-title"><span class="region-title-headline"></span>学生互评</div>
<a-form-item label="学生互评">
<div class="tishi" v-if="zyInfo.xshpkg == '1'"
>每份考试至少互评三次每个学生互评五份考试。按时完成互评任务的学生可额外获得最终分数的2%作为互评奖励互评考试质量高的学生可额外获得最终分数的5%作为互评奖励。</div
>
<j-dict-select-tag
type="radio"
v-model:value="zyInfo.xshpkg"
dictCode="yn"
placeholder="请选择是否允许学生查看"
style="margin-top: 15px"
:disabled="editDisabled"
@change="handleXshpkg"
/>
<div v-if="zyInfo.xshpkg == '1'">
<!-- <a-form-item label="设置互评人数" :labelCol="labelCol3" :wrapperCol="wrapperCol3" style="margin-top: 20px">
<a-input-number v-model:value="zyInfo.xshprsq" placeholder="请设置互评人数" style="width: 60%" :max="100" :min="0">
<template #addonAfter>人</template>
</a-input-number>
</a-form-item> -->
<a-form-item
label="互评结果使用"
:labelCol="labelCol3"
:wrapperCol="wrapperCol3"
style="margin-top: 20px; margin-left: -30px"
>
<a-radio-group v-model:value="zyInfo.sfzzcj" style="width: 100%" size="default" :disabled="editDisabled">
<a-radio :value="'1'" style="width: 100%; margin-bottom: 5px">互评成绩为最终成绩</a-radio>
<a-radio :value="'0'" style="width: 100%; margin-bottom: 5px">互评成绩作为教师评分的参考成绩</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
label="是否允许学生看到互评成绩"
:labelCol="labelCol4"
:wrapperCol="wrapperCol4"
style="margin-top: 20px; margin-left: -10px"
>
<a-radio-group v-model:value="zyInfo.xssfck">
<a-radio :value="'1'" style="margin-top: 5px">是(匿名)</a-radio>
<a-radio :value="'0'" style="margin-top: 5px">否</a-radio>
</a-radio-group>
<!-- <j-dict-select-tag
type="radio"
v-model:value="zyInfo.xshpkg"
dictCode="yn"
placeholder="请选择是否允许学生查看"
style="margin-top: 15px"
/> -->
</a-form-item>
<a-form-item label="互评开始时间" :labelCol="labelCol2" :wrapperCol="wrapperCol2" hidden>
<a-date-picker
placeholder="请选择互评开始时间"
v-model:value="zyInfo.xshpkssj"
:disabled-date="disabledDate"
:show-time="{ format: 'YYYY-MM-DD HH:mm' }"
valueFormat="YYYY-MM-DD HH:mm"
format="YYYY-MM-DD HH:mm"
style="width: 100%"
/>
</a-form-item>
<a-form-item label="互评结束时间" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
<a-date-picker
placeholder="请选择互评结束时间"
v-model:value="zyInfo.xshpjssj"
:disabled-date="disabledDate"
:show-time="{ format: 'YYYY-MM-DD HH:mm' }"
valueFormat="YYYY-MM-DD HH:mm"
format="YYYY-MM-DD HH:mm"
style="width: 100%"
/>
</a-form-item>
</div>
</a-form-item>
</div>
</a-col>
<a-col :span="24">
<div class="region">
<div class="region-title"><span class="region-title-headline"></span>查重设置</div>
<a-form-item label="是否进行查重" :labelCol="labelCol3" :wrapperCol="wrapperCol3">
<j-dict-select-tag
type="radio"
v-model:value="zyInfo.sfcc"
dictCode="yn"
placeholder="请选择是否查重"
:disabled="editDisabled"
/>
</a-form-item>
<a-form-item
label="检测通过率"
:labelCol="labelCol3"
:wrapperCol="wrapperCol3"
style="margin: -1px; margin-left: -10px"
v-if="zyInfo.sfcc == '1'"
>
<a-input-number
v-model:value="zyInfo.wwtgl"
placeholder="请输入检测通过率"
style="width: 50%"
:max="100"
:min="0"
:disabled="editDisabled"
>
<template #addonAfter> % </template>
</a-input-number>
</a-form-item>
<a-form-item
label="比对库设置"
:labelCol="labelCol3"
:wrapperCol="wrapperCol3"
style="margin-left: -10px"
v-if="zyInfo.sfcc == '1'"
>
<div style="padding: 5px 0">维普</div>
<div style="display: flex; flex-direction: column">
<a-checkbox v-model:checked="zyInfo.wwcc" :disabled="editDisabled" style="margin-left: 8px">
<span class="bled-countenance">维普资源库查重</span><br />
<span class="bled-countenance2">中文科技期刊数据库、硕博学位论文库、高校特色论文库、互联网数据资源/互联网文档资源</span>
</a-checkbox>
<a-checkbox v-model:checked="zyInfo.xncc" :disabled="editDisabled">
<span class="bled-countenance">学校作业库查重</span><br /><span class="bled-countenance2">历届学生提供的作业库内查重</span>
</a-checkbox>
<a-checkbox v-model:checked="zyInfo.nwcc" :disabled="editDisabled">
<span class="bled-countenance">本次作业查重</span><br /><span class="bled-countenance2">本次学生提交的作业间查重</span>
</a-checkbox>
</div>
<div style="padding: 5px 0">AIGC</div>
<div>
<a-checkbox v-model:checked="zyInfo.aigccc" style="margin-left: 8px" :disabled="editDisabled">
<span class="bled-countenance">AIGC查重</span><br /><span class="bled-countenance2"
>检测作业是否部分或全部由AI模型生成</span
>
</a-checkbox>
</div>
</a-form-item>
</div>
</a-col>
<a-col :span="24" style="text-align: center; margin-top: 10px; margin-bottom: 40px">
<a-button type="primary" @click="submitForm">保存</a-button>
<a-button type="primary" @click="reloadZy" style="margin-left: 15px">返回</a-button>
</a-col>
</a-row>
</a-form>
</a-col>
</a-row>
</a-spin>
</div>
<div v-show="showType == 3" style="overflow-y: auto">
<a-row>
<a-col :span="24"
><span class="title">批阅考试</span> - <span class="title2">考试详情页</span>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="reloadZy" style="float: right; margin-right: 8px"> 返回</a-button>
<a-popover title="温馨提示">
<template #content>
<p>1、非高峰期预计30分钟内返回检测结果高峰期预计时间会更长请您耐心等待</p>
<p>2、点击互评分数可查看同学间互评考试详情</p>
<p>3、点击最高查重率可分别查看学生“维普考试库查重”、“学校考试库查重”、“本次考试查重”、“AIGC查重”相似率</p>
<p>4、学生上传的课程考试全部存档</p>
</template>
<Icon icon="ant-design:question-circle-outlined" :size="30" style="float: right; margin-right: 8px; color: #029c88" />
</a-popover>
<a-divider
/></a-col>
<a-col :span="24" style="overflow: hidden">
<!--查询区域-->
<div class="sear-distance">
<a-form @keyup.enter.native="searchQueryZyxq" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
<a-col :lg="12">
<a-form-item label="学生姓名">
<j-input placeholder="请输入学生姓名" v-model:value="queryParam.studentName"></j-input>
</a-form-item>
</a-col>
<a-col :lg="12">
<a-form-item label="学生学号">
<j-input placeholder="请输入学生学号" v-model:value="queryParam.createBy"></j-input>
</a-form-item>
</a-col>
<a-col :lg="12">
<a-form-item label="考试状态">
<!-- <j-input placeholder="请输入学生学号" v-model:value="queryParam.createBy"></j-input> -->
<a-select v-model:value="queryType" style="width: 100%">
<a-select-option value="">全部</a-select-option>
<a-select-option value="1">待提交</a-select-option>
<a-select-option value="2">已提交</a-select-option>
<a-select-option value="5">待评阅</a-select-option>
<a-select-option value="4">已评阅</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :span="24">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQueryZyxq">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls" style="margin-left: 8px"> 导出</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="batchHandleFabu" style="margin-left: 8px">发布成绩</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="batchHandleKhcl" style="margin-left: 8px"
>上传考核材料</a-button
>
<span class="tishi" style="margin-left: 20px; padding: 10px">温馨提示:考试完成后,请及时发布评分</span>
</a-col>
</a-row>
</a-form>
</div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
<template #zgcclaction="{ record }">
<div v-if="record.alltgl">
<span v-if="record.filePath">
<template v-if="record.zgccl && record.zgccl != '0'">
<span v-if="record.zgccl <= record.alltgl" title="通过" style="color: #36b395; cursor: pointer" @click="handleViewInfo(record)">
{{ record.zgccl }}
</span>
<span v-else title="未通过" style="color: red" @click="handleViewInfo(record)">{{ record.zgccl }}</span>
</template>
<template v-else>查重中</template>
</span>
<span v-else> </span>
</div>
<div v-else>
<span></span>
</div>
</template>
<template #scoreaction="{ record }">
<span style="color: #36b395; cursor: pointer" v-if="record.scoreFabu == '1' || !record.filePath">
{{ record.score }}
</span>
<span style="color: #36b395; cursor: pointer" v-if="record.scoreFabu != '1' && record.filePath">
<a-input v-model:value="record.score" style="width: 90%" @blur="handleChangeScore(record)" />
</span>
</template>
<template #xshpfsaction="{ record }">
<span style="color: #36b395; cursor: pointer" @click="handleXshpfs(record)">
{{ record.xshpfs }}
</span>
</template>
<template #htmlSlot="{ text }">
<div v-html="text"></div>
</template>
</BasicTable>
</a-col>
</a-row>
</div>
<div v-if="showType == 4">
<a-row>
<a-col :span="24"
><span class="title">批阅考试</span> - <span class="title2">考试详情页</span> - <span class="title2">查重相似度详情</span>
<a-button type="primary" @click="handleShowType(3)" style="float: right; margin-right: 8px"
><Icon icon="ant-design:export-outlined" />返回</a-button
>
<a-divider
/></a-col>
<a-col :span="24">
<a-table :columns="columnsCcjg" :data-source="tableCcjgData" :pagination="false">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<span>
<a @click="handleOpenLwxx(record)">查看</a>
</span>
</template>
</template>
</a-table>
</a-col>
</a-row>
</div>
<div v-if="showType == 5">
<a-row>
<a-col :span="24"
><span class="title">批阅考试</span> - <span class="title2">考试详情页</span> - <span class="title2">学生互评详情</span>
<a-button type="primary" @click="handleShowType(3)" style="float: right; margin-right: 8px"
><Icon icon="ant-design:export-outlined" />返回</a-button
>
<a-divider
/></a-col>
<a-col :span="24">
<a-table :columns="columnsXshp" :data-source="tableXshpData" :pagination="false"> </a-table>
</a-col>
</a-row>
</div>
<div v-if="showType == 999">
<a-row>
<a-col :span="24"><span class="title">期末考试</span><a-divider /></a-col>
<a-col :span="24" style="text-align: right; margin-top: 5px">
<a @click="handleSzzycs(2)" class="ant-btn buttonClass"><Icon icon="ant-design:edit-outlined" />修改期末考试次数</a>
<!-- <a-divider type="vertical" />
<a @click="handleAddOne" class="ant-btn buttonClass mar-right20"><Icon icon="ant-design:file-add-outlined" />新增考试</a> -->
</a-col>
<a-col :span="24">
<a-row style="padding: 10px">
<a-col :lg="24" v-for="(item, index) in tableData" style="padding: 0 5px 12px 5px; border-radius: 5px" :key="index">
<a-card :title="'第' + item.sort + '次作业(占比' + item.score + '%)'" v-if="!item.endTime" class="cardClass module-bg">
<template #extra><span class="card-label3"> 待设置</span> </template>
<p class="sznrClass">尚未布置作业题目及具体要求</p>
<div style="text-align: right">
<a @click="handleEdit(item, false)" class="home-status"><Icon icon="ant-design:file-text-outlined" />设置作业内容及要求</a>
<a-divider type="vertical" />
<a @click="handleDelete(item)" class="home-status"><Icon icon="ant-design:delete-outlined" />删除</a>
</div>
</a-card>
<a-card
:title="'第' + item.sort + '次作业(占比' + item.score + '%)'"
v-if="item.endTime && (item.zyStatus == '1' || item.zyStatus == '2')"
class="cardClass module-bg"
>
<template #extra><span class="card-label">已发布</span> </template>
<div class="ellip-title">
<span class="ellipsis elli-title" :title="item.title">{{ item.title }}</span>
<a class="button-zhta" @click="openXkrs(item)">{{ item.xkxs }}人选课</a>
</div>
<div style="width: 100%; display: flex">
<div class="data-suggest zuanqu" @click="handleZyxx(item, '1')"
><span>{{ item.wtjnum }}人</span><span>待提交</span></div
>
<!-- <div class="data-suggest zuanqu" @click="handleZyxx(item, '2')"
><span>{{ item.ytjnum }}人</span><span>已提交</span></div
> -->
<div class="data-suggest zuanqu" @click="handleZyxx(item, '5')"
><span>{{ item.dpynum }}人</span><span>待评阅</span></div
>
<div class="data-suggest zuanqu" @click="handleZyxx(item, '4')"
><span>{{ item.ypynum }}人</span><span>已评阅</span></div
>
</div>
<div class="flex">
<div style="width: 100%; display: flex; margin-top: 20px">
<div class="ellip-word"
><span class="ellip-word2">作业发布时间:</span
>{{ item.startTime ? dayjs(item.startTime).format('YYYY.MM.DD HH:mm') : '未设置' }}</div
>
<div class="ellip-word"><span class="ellip-word2">作业截止时间:</span>{{ dayjs(item.endTime).format('YYYY.MM.DD HH:mm') }}</div>
</div>
<div style="text-align: right; margin-top: 20px; margin-bottom: -10px; width: 100%">
<!-- <a @click="handleWxtx(item)" class="home-status"><Icon icon="ant-design:wechat-outlined" />微信提醒</a>
<a-divider type="vertical" /> -->
<a @click="handleEdit(item, true)" v-if="item.ytjnum > 0" class="home-status"><Icon icon="ant-design:form-outlined" />编辑作业</a>
<a @click="handleChehui(item)" v-if="item.dpynum == 0 && item.ypynum == 0" class="home-status"
><Icon icon="ant-design:import-outlined" />撤回作业</a
>
<a-divider type="vertical" v-if="item.dpynum == 0 && item.ypynum == 0" />
<a @click="handleZyxx(item, '')" class="home-status"><Icon icon="ant-design:file-done-outlined" />批阅作业</a>
<a-divider type="vertical" v-if="item.dpynum == 0 && item.ypynum == 0" />
<a @click="handleDelete(item)" v-if="item.dpynum == 0 && item.ypynum == 0" class="home-status"
><Icon icon="ant-design:delete-outlined" />删除</a
>
</div>
</div>
</a-card>
<a-card
:title="'第' + item.sort + '次作业(占比' + item.score + '%)'"
v-if="item.endTime && item.zyStatus == '0'"
class="cardClass"
bodyStyle="background: #fff;"
>
<template #extra><span class="card-label2">待发布</span> </template>
<div class="ellip-title">
<span class="ellipsis elli-title" :title="item.title">{{ item.title }}</span>
<a class="button-zhta" @click="openXkrs(item)">{{ item.xkxs }}人选课</a>
</div>
<div style="width: 100%">
<div class="ellip-word"
><span class="ellip-word2">作业发布时间:</span
>{{ item.startTime ? dayjs(item.startTime).format('YYYY.MM.DD HH:mm') : '未设置' }}</div
>
<div class="ellip-word"><span class="ellip-word2">作业截止时间:</span>{{ dayjs(item.endTime).format('YYYY.MM.DD HH:mm') }}</div>
</div>
<div style="height: 45px">&nbsp;</div>
<div style="text-align: right; margin-top: 30px">
<a @click="handleEdit(item, false)" class="home-status"><Icon icon="ant-design:form-outlined" />编辑作业</a>
<a-divider type="vertical" />
<a @click="handleFabu(item)" class="home-status"><Icon icon="ant-design:upload-outlined" />发布作业</a>
<a-divider type="vertical" />
<a @click="handleDelete(item)" class="home-status"><Icon icon="ant-design:delete-outlined" />删除</a>
</div>
</a-card>
</a-col>
</a-row>
</a-col>
</a-row>
</div>
<SzybStudentModal ref="SzybStudentModalpage" @success="handleSuccess"></SzybStudentModal>
<ZyInfoStudentScoreModal ref="registerScoreModal" @success="handleSuccess"></ZyInfoStudentScoreModal>
<KcTeachingUnitContentOneListModal ref="registerZcjcModal" @success="handleCheckZcjcSuccess"></KcTeachingUnitContentOneListModal>
<ZyInfoDetailModal ref="registerDetialModal" @success="handleSuccess"></ZyInfoDetailModal>
<ZyInfoModal ref="registerModal" @success="handleSuccess"></ZyInfoModal>
<ZyInfoEditModal ref="registerEditModal" @success="handleSuccess"></ZyInfoEditModal>
<ZyInfoStudentListModal ref="ZyInfoStudentListModalPage" @success="handleSuccess"></ZyInfoStudentListModal>
<ZyInfoStudentModal ref="ZyInfoStudentModalPage"></ZyInfoStudentModal>
<XxhbbksListModal ref="XxhbbksListModalPage"></XxhbbksListModal>
<YyzyListModal ref="YyzyListModalPage" @success="handleCallYinyong"></YyzyListModal>
</div>
</template>
<script lang="ts" name="zyInfo-zyInfo" setup>
import { ref, reactive, onMounted, unref } from 'vue';
import { list, deleteOne } from './ZyInfo.api';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
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 { JInput } from '/@/components/Form';
import { Form } from 'ant-design-vue';
import { saveOrUpdate } from '/@/views/zy/zyInfo/ZyInfo.api';
import { getValueType } from '/@/utils';
import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';
import dayjs, { Dayjs } from 'dayjs';
import { useListPage } from '/@/hooks/system/useListPage';
import { newcolumns } from '/@/views/zy/zyInfoStudent/ZyInfoStudent.data';
import { newlist, getExportUrl, batchFabu, batchFabu2, batchKhcl } from '/@/views/zy/zyInfoStudent/ZyInfoStudent.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
import { useGlobSetting } from '/@/hooks/setting';
import { openByUrl } from '/@/utils/file/download';
import SzybStudentModal from '/@/views/zy/zyInfoStudent/components/SzybStudentModal.vue';
import ZyInfoStudentScoreModal from '/@/views/zy/zyInfoStudent/components/ZyInfoStudentScoreModal.vue';
import KcTeachingUnitContentOneListModal from '/@/views/zy/zyInfo/zyCheckZcjc/KcTeachingUnitContentOneListModal.vue';
import ZyInfoDetailModal from './components/ZyInfoDetailModal.vue';
import ZyInfoModal from './components/ZyInfoModal.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 ZyInfoEditModal from './components/ZyInfoEditModal.vue';
import YyzyListModal from '/@/views/zy/zyInfo/YyzyListModal.vue';
const globSetting = useGlobSetting();
const baseApiUrl = globSetting.domainUrl;
//当前路由信息
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 queryParamZy = ref<any>({});
const registerModal = ref();
const current = ref<number>(0);
const total = ref<number>(0);
const pageNo = ref<number>(0);
const pageSize = ref<number>(100);
const tableData = ref<any>([]);
const showType = ref<number>(0);
const zycs = ref<number>(0);
const otherKszb = ref<number>(0);
const kczyzb = ref<number>(0);
const qmkszb = ref<number>(0);
const ktcyzb = ref<number>(0);
const zycsDisabled = ref<boolean>(false);
const zyInfo = ref<any>({});
const formRef = ref();
const confirmLoading = ref<boolean>(false);
const zyyqShow = ref<boolean>(false);
const pfbzShow = ref<boolean>(false);
const editDisabled = ref<boolean>(false);
const queryType = ref<string>('');
const dataKhnr = ref<any>([]);
const tableCcjgData = ref<any>([]);
const tableXshpData = ref<any>([]);
const rowSelectionKhnr = ref<any>([]);
const SzybStudentModalpage = ref();
const registerScoreModal = ref();
const registerZcjcModal = ref();
const ZyInfoStudentListModalPage = ref();
const ZyInfoStudentModalPage = ref();
const XxhbbksListModalPage = ref();
const registerEditModal = ref();
const registerDetialModal = ref();
const YyzyListModalPage = ref();
const pdfUrl = ref('/downPath/ylhpsf.pdf');
//注册table数据
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
api: newlist,
columns: newcolumns,
canResize: false,
useSearchForm: false,
pagination: {
current: 1,
pageSize: 10,
},
actionColumn: {
width: '170px',
fixed: 'right',
},
showTableSetting: true,
defSort: {
field: 'name',
order: 'ascend',
},
beforeFetch: (params) => {
// params.column = 'publishTime',params.order = 'desc';//新生成的默认不带排序
return Object.assign(params, queryParam.value);
},
},
exportConfig: {
name: '学生考试信息',
url: getExportUrl,
params: () => {
return Object.assign({}, queryParam.value);
},
},
});
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] =
tableContext;
//设置考试删除功能
const disabledDate = (current: Dayjs) => {
return current && current < dayjs().subtract(1, 'days').endOf('day');
};
const useForm = Form.useForm;
//引用作业
function handleYyzy() {
var params = { xqxn, rwbh };
YyzyListModalPage.value.disableSubmit = true;
YyzyListModalPage.value.init(params);
}
//引用作业回调
function handleCallYinyong(record) {
console.log('👯‍♂️', record);
var zysort = zyInfo.value.sort; //防止顺序错误
var zyid = zyInfo.value.id; //替换原来的id防止新增
record.id = zyid;
record.sort = zysort;
record.zyLeixing = '1'; //作业类型,期末考试
zyInfo.value = record;
console.log('😠', zyInfo);
}
function handleXshpkg(record) {
console.log('👨‍👧‍👦', record);
}
function handleEndTime(record) {
console.log('👽', record);
zyInfo.value.xshpkssj = record;
}
//获取查重结果
function handleViewInfo(record) {
defHttp.get({ url: '/zyCcjg/zyCcjg/ccjglist', params: { zyStuId: record.id } }).then((res) => {
console.log('🤦‍♀️', res);
tableCcjgData.value = res;
});
handleShowType(4);
}
//教师修改考试分数
function handleChangeScore(record) {
console.log('👯', record);
var score = record.score;
console.log('👝', score);
console.log('👝', isNaN(score));
if (isNaN(score)) {
createMessage.error('请输入正确的评分1');
return;
} else if (parseInt(score) > 100 || parseInt(score) < 0) {
createMessage.error('请输入正确的评分2');
return;
}
defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editFabu', params: { id: record.id, score: record.score } }).then((res) => {
console.log('😮', res);
handleSuccess();
});
}
//学生互评详细
function handleXshpfs(record) {
defHttp.get({ url: '/zyInfoStudentHp/zyInfoStudentHp/list', params: { zyStuId: record.id, pageSize: -1 } }).then((res) => {
console.log('🤦‍♀️', res);
tableXshpData.value = res.records;
console.log('😒', res.records);
console.log('👨‍🦰', tableXshpData.value);
});
handleShowType(5);
}
//产看论文报告
function handleOpenLwxx(record) {
window.open(record.paperviewurl, '_blank');
}
//选择章次节次后的回调
function handleCheckZcjcSuccess(record) {
console.log('🙅‍♂️', record);
console.log('🙅‍♂️', record[0]);
var kcnr = '';
kcnr = kcnr ? kcnr : '';
for (var i = 0; i < record.length; i++) {
kcnr = kcnr + record[i] + ',';
}
if (kcnr.indexOf(',') > -1) {
kcnr = kcnr.substring(0, kcnr.length - 1);
}
zyInfo.value.kcnr = kcnr;
console.log('💑', kcnr);
if (kcnr) {
defHttp.get({ url: '/teachingunitcontent/kcTeachingUnitContentOne/getAllList', params: { id: kcnr } }).then((res) => {
console.log('🤦‍♀️', res);
dataKhnr.value = res;
});
} else {
dataKhnr.value = [];
}
}
//选择考察内容
function handleKcnr() {
registerZcjcModal.value.disableSubmit = false;
registerZcjcModal.value.init({ rwbh, xnxq: xqxn, createBy: teano });
// defHttp.get({ url: '/teachingunitcontent/kcTeachingUnitContentOne/getAllList', params: { rwbh, xnxq: xqxn, createBy: teano } }).then((res) => {
// console.log('🤦‍♀️', res);
// dataKhnr.value = res;
// });
}
/**
* 考试详情查询
*/
function searchQueryZyxq() {
selectedRowKeys.value = [];
queryParam.value.mainId = zyInfo.value.id;
queryParam.value.queryType = queryType.value;
reload();
}
//新增一次考试
function handleAddOne() {
defHttp.post({ url: '/zyInfo/zyInfo/addOne', params: { rwbh, xnxq: xqxn, teano } }).then((res) => {
handleSuccess2();
});
}
//撤回发布
function handleNoScoreFabu(record: Recordable) {
defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editFabu', params: { id: record.id, scoreFabu: '0' } }).then((res) => {
handleSuccess();
});
}
//设置样本
function handleSzyb(record: Recordable) {
SzybStudentModalpage.value.disabled = false;
SzybStudentModalpage.value.edit(record);
}
//下载
function handleDown(text) {
downloadFile(text);
}
//预览
function yulanFile(record) {
var url2 = getFileAccessHttpUrl(record.pdfPath);
let url = baseApiUrl + '/generic/web/viewer.html?file=' + encodeURIComponent(url2);
window.open(url, '_blank');
}
//驳回
function handleBohui(record: Recordable) {
createConfirm({
iconType: 'warning',
title: '驳回',
content: '您确定驳回此考试吗,驳回后需要学生重新提交?',
okText: '确认',
cancelText: '取消',
onOk: () => {
defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editBohui', params: { id: record.id } }).then((res) => {
handleSuccess();
});
},
});
}
//填写评分
function handleScore(record: Recordable) {
registerScoreModal.value.disableSubmit = false;
registerScoreModal.value.edit(record);
}
//发布确定评分
function handleScoreFabu(record: Recordable) {
//判断
if (!record.score) {
createMessage.warn('请填写评分!');
return;
}
defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/editFabu', params: { id: record.id, scoreFabu: '1' } }).then((res) => {
handleSuccess();
});
}
/**
* 操作栏
*/
function getTableAction(record) {
if (record.filePath) {
if (record.scoreFabu == '1') {
let list = [
{
label: '撤回发布',
onClick: handleNoScoreFabu.bind(null, record),
},
// {
// label: '标记考试',
// onClick: handleSzyb.bind(null, record),
// },
{
label: '下载',
onClick: handleDown.bind(null, record.filePath),
},
{
label: '预览',
onClick: yulanFile.bind(null, record),
},
];
return list;
} else {
let list = [
{
label: '驳回',
onClick: handleBohui.bind(null, record),
},
// {
// label: record.score ? '修改评分' : '评分',
// onClick: handleScore.bind(null, record),
// },
// {
// label: '发布评分',
// onClick: handleScoreFabu.bind(null, record),
// },
{
label: '下载',
onClick: handleDown.bind(null, record.filePath),
},
{
label: '预览',
onClick: yulanFile.bind(null, record),
},
];
return list;
}
} else {
let list = [];
return list;
}
}
//发布作业评分
async function batchHandleFabu() {
console.log('🧐', { id: zyInfo.value.id });
defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/getNoScore', params: { id: zyInfo.value.id } }).then((res) => {
console.log('🦴', res);
var list = res;
console.log('🧚‍♀️', list.length);
if (list.length > 0) {
var studentName = '';
for (var i = 0; i < list.length; i++) {
studentName = studentName + list[i].studentName + '、';
}
createConfirm({
iconType: 'warning',
title: '确认发布',
content:
'当前学生:' +
studentName +
'没有给与评分,<span style="color:red;font-size:14px;font-weight:700;">若继续发布成绩学生成绩为0</span>是否发布成绩数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
batchFabu2({ id: zyInfo.value.id }, handleBatchSuccess);
},
});
} else {
createConfirm({
iconType: 'warning',
title: '确认发布',
content: '是否发布成绩数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
batchFabu2({ id: zyInfo.value.id }, handleBatchSuccess);
},
});
}
});
}
function handleBatchSuccess() {
//正常刷新列表
reload();
//提交校内查重记录
defHttp.post({ url: '/zyInfoStudent/zyInfoStudent/xnccBatchWeipu', params: { id: zyInfo.value.id } }).then((res) => {});
}
function batchHandleKhcl() {
if (selectedRowKeys.value.length == 0) {
createMessage.warn('请勾选要上传的数据!');
return;
}
batchKhcl({ ids: selectedRowKeys.value }, reload);
}
//
//表单验证
const validatorRules = {
title: [{ required: true, message: '请输入考试名称!' }],
endTime: [{ required: true, message: '请输入结束时间!' }],
pfbz: [{ required: true, message: '请输入评分标准!' }],
};
const { resetFields, validate, validateInfos } = useForm(zyInfo, validatorRules, { immediate: true });
const labelCol = reactive({
xs: { span: 24 },
sm: { span: 4 },
});
const wrapperCol = reactive({
xs: { span: 24 },
sm: { span: 16 },
});
const labelCol2 = reactive({
sm: { span: 6 },
});
const wrapperCol2 = reactive({
sm: { span: 18 },
});
const labelCol3 = reactive({
sm: { span: 4 },
});
const wrapperCol3 = reactive({
sm: { span: 20 },
});
const labelCol4 = reactive({
sm: { span: 10 },
});
const wrapperCol4 = reactive({
sm: { span: 12 },
});
//考试要求切换
function handleZyyqShow(type) {
if (type == 1) {
zyyqShow.value = true;
} else {
zyyqShow.value = false;
}
}
//评分标准切换
function handlePfbzShow(type) {
if (type == 1) {
pfbzShow.value = true;
} else {
pfbzShow.value = false;
}
}
//尚未布置考试题目及具体要求
function handleSzzynr(record) {
zyInfo.value = record;
dataKhnr.value = [];
handleShowType(2);
}
//批量进行保存
function handleBatchAdd() {
var list = tableData.value;
var sfjx = 0; //是否继续
var cjbfb = kczyzb.value; //成绩百分比
var cjbfb2 = ktcyzb.value; //成绩百分比
var zcj = 0;
var score22 = 0;
if (list.length == 0) {
createMessage.error('作业次数不能为空!');
return;
}
for (var i = 0; i < list.length; i++) {
console.log('🥵', list);
var score = list[i].score;
if (score == null || score + '' == '') {
createMessage.error('第' + (i + 1) + '次作业占总成绩的百分比不能为空!');
sfjx = 1;
break;
}
if (score < 0 || score > 100) {
createMessage.error('作业成绩百分比必须在0-100之间');
sfjx = 1;
break;
}
score22 = parseInt(score22) + parseInt(score);
if (score22 > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
sfjx = 1;
break;
}
}
zcj = parseInt(score22) + parseInt(cjbfb) + parseInt(cjbfb2);
if (zcj > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
sfjx = 1;
}
if (sfjx == 1) {
return;
}
createConfirm({
iconType: 'warning',
title: '确认保存',
content: '设置完期末考试次数后,需要对期末考试的内容和要求进行设置,然后进行发布',
okText: '确认',
cancelText: '取消',
onOk: () => {
defHttp.post({ url: '/zyInfo/zyInfo/batchQmAdd', data: list }).then((res) => {
reloadZy();
});
},
});
}
function handleJscjbfb() {
var list = tableData.value;
var cjbfb = qmkszb.value; //成绩百分比
var cjbfb2 = kczyzb.value; //成绩百分比
var zcj = 0;
var score22 = 0;
for (var i = 0; i < list.length; i++) {
console.log('🥵', list);
var score = list[i].score;
if (score == null || score + '' == '') {
createMessage.error('第' + (i + 1) + '次作业占总成绩的百分比不能为空!');
break;
}
score22 = parseInt(score22) + parseInt(score);
if (score < 0 || score > 100) {
createMessage.error('作业成绩百分比必须在0-100之间');
break;
}
if (score22 > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
break;
}
}
zcj = parseInt(score22) + parseInt(cjbfb) + parseInt(cjbfb2);
if (zcj > 100) {
createMessage.error('作业总的百分比(课程作业占比+期末考试占比+课堂测验占比已经超过100%,请重新输入');
}
}
function handleSzzycs(val) {
defHttp.get({ url: '/zyInfo/zyInfo/zyzb', params: { rwbh, xqxn, teano, zyLeixing: '1' } }).then((res) => {
console.log('😥', res);
var list = res;
for (var i = 0; i < list.length; i++) {
if (list[i].zyLeixing == '0') {
kczyzb.value = list[i].score;
} else if (list[i].zyLeixing == '1') {
qmkszb.value = list[i].score;
} else if (list[i].zyLeixing == '2') {
} else if (list[i].zyLeixing == '3') {
ktcyzb.value = list[i].score;
}
}
});
if (val == 1) {
zycs.value = 1;
handleZycs();
}
handleShowType(1);
}
//显示第几个类型模块
function handleShowType(val) {
if (tableData.value.length > 0) {
zycsDisabled.value = true;
} else {
zycsDisabled.value = false;
}
console.log('👩‍👩‍👧‍👧', zycsDisabled);
showType.value = val;
}
//新增一次考试,再最后面添加
function handleAddZycs() {
var changeZycs = zycs.value;
zycs.value = changeZycs + 1;
handleZycs();
}
//删除指定第几次考试
function handleDelZycs(index) {
var dataList = tableData.value;
dataList.splice(index - 1, 1);
tableData.value = dataList;
zycs.value = dataList.length;
handleZycs();
}
//动态添加考试次数
function handleZycs() {
var dataList = tableData.value;
var changeZycs = zycs.value;
if (changeZycs > dataList.length) {
for (var i = dataList.length; i < changeZycs; i++) {
dataList.push({
sort: i + 1,
lstitle: '第' + (i + 1) + '次考试',
score: '',
rwbh: rwbh,
xqxn: xqxn,
createBy: teano,
zyLeixing: '1',
});
}
} else if (changeZycs < dataList.length) {
for (var i = dataList.length; i > changeZycs; i--) {
dataList.pop();
}
} else {
for (let i = 0; i < dataList.length; i++) {
var ppar = dataList[i];
ppar.sort = i + 1;
dataList[i] = ppar;
}
}
tableData.value = dataList;
}
/**
* 提交数据
*/
async function submitForm() {
// 触发表单验证
await validate();
confirmLoading.value = true;
const isUpdate = ref<boolean>(false);
//时间格式化
let model = zyInfo.value;
if (model.id) {
isUpdate.value = true;
}
//循环数据
for (let data in model) {
//如果该数据是数组并且是字符串类型
if (model[data] instanceof Array) {
let valueType = getValueType(formRef.value.getProps, data);
//如果是字符串类型的需要变成以逗号分割的字符串
if (valueType === 'string') {
model[data] = model[data].join(',');
}
}
}
console.log('👕', model);
var xshpkg = model.xshpkg;
if (xshpkg == '1') {
var sfzzcj = model.sfzzcj;
if (!sfzzcj) {
createMessage.warning('请先设置互评成绩是否为最终成绩!');
confirmLoading.value = false;
return;
}
var xssfck = model.xssfck;
if (!xssfck) {
createMessage.warning('请先设置是否允许学生看到互评成绩!');
confirmLoading.value = false;
return;
}
var xshpkssj = model.xshpkssj;
if (!xshpkssj) {
createMessage.warning('请先设置互评开始时间!');
confirmLoading.value = false;
return;
}
var xshpjssj = model.xshpjssj;
if (!xshpjssj) {
createMessage.warning('请先设置互评结束时间!');
confirmLoading.value = false;
return;
}
}
var wwtgl = model.wwtgl;
console.log('💂‍♂️', wwtgl);
var wwcc = model.wwcc;
var xncc = model.xncc;
var nwcc = model.nwcc;
var aigccc = model.aigccc;
console.log('🚶‍♂️', model);
var sfcc = model.sfcc;
console.log('🚶‍♂️', model);
if (sfcc == '1') {
//开启查重再进行验证,否则不进行验证
if (wwtgl) {
if ((wwcc == false && xncc == false && nwcc == false && aigccc == false) || (!wwcc && !xncc && !nwcc && !aigccc)) {
createMessage.warning('您设置了检测通过率,但您没有设置查重比对库,请先设置查重比对库!');
confirmLoading.value = false;
return;
}
console.log('1111111111', wwtgl, wwcc, xncc, aigccc);
} else {
console.log('22222222222', wwtgl, wwcc, xncc, aigccc);
if(!wwtgl){
createMessage.warning('您设置了查重,但您没设置检测通过率,请先设置检测通过率');
confirmLoading.value = false;
return;
}
if (wwcc == true || xncc == true || nwcc == true || aigccc == true || wwcc == 'true' || xncc == 'true' || nwcc == 'true' || aigccc == 'true') {
createMessage.warning('您设置了查重比对库,但您没设置检测通过率,请先设置检测通过率');
confirmLoading.value = false;
return;
}
}
} else {
//如果不进行查重,则强制清空查重配置数据
model.wwtgl = null;
model.wwcc = null;
model.xncc = null;
model.nwcc = null;
model.aigccc = null;
}
var xshpkssj = model.xshpkssj;
var xshpjssj = model.xshpjssj;
if (xshpkssj && xshpjssj) {
var xshpkssjTimestamp = Date.parse(xshpkssj);
var xshpjssjTimestamp = Date.parse(xshpjssj);
if (xshpkssjTimestamp > xshpjssjTimestamp) {
createMessage.warning('考试截止时间不能大于互评结束时间!');
confirmLoading.value = false;
return;
}
}
var endTime = model.endTime;
var startTime = model.startTime;
if (endTime && startTime) {
var endTimestamp = Date.parse(endTime);
var startTimestamp = Date.parse(startTime);
if (endTimestamp < startTimestamp) {
createMessage.warning('考试发布时间不能大于考试截止时间!');
confirmLoading.value = false;
return;
}
}
if (xshpkssj && endTime) {
var endTimestamp = Date.parse(xshpkssj);
var startTimestamp = Date.parse(endTime);
if (endTimestamp < startTimestamp) {
createMessage.warning('互评开始间不能小于考试截止时间!');
confirmLoading.value = false;
return;
}
}
await saveOrUpdate(model, isUpdate.value)
.then((res) => {
if (res.success) {
createMessage.success(res.message);
reloadZy();
} else {
createMessage.warning(res.message);
}
})
.finally(() => {
confirmLoading.value = false;
});
}
const columns = [
{
title: '序号',
dataIndex: 'sort',
key: 'sort',
},
{
title: '考试次数',
dataIndex: 'lstitle',
key: 'lstitle',
},
{
title: '本次考试占总成绩的百分比',
dataIndex: 'score',
key: 'score',
},
// {
// title: '操作',
// key: 'action',
// },
];
const columnsCcjg = [
{
title: '序号',
dataIndex: 'no',
key: 'no',
customRender: (text) => {
return text.index + 1;
},
width: 80,
},
{
title: '学生姓名',
dataIndex: 'stuName',
key: 'stuName',
},
{
title: '学生学号',
dataIndex: 'stuNo',
key: 'stuNo',
},
{
title: '比对库',
dataIndex: 'bdkname',
key: 'bdkname',
},
{
title: '是否查重',
dataIndex: 'ccType',
key: 'ccType',
customRender: (text) => {
return '是';
},
},
{
title: '查重率(%',
dataIndex: 'percentage',
key: 'percentage',
},
{
title: '操作',
key: 'action',
},
];
const columnsXshp = [
{
title: '序号',
dataIndex: 'no',
key: 'no',
customRender: (text) => {
return text.index + 1;
},
width: 80,
},
{
title: '学生姓名',
dataIndex: 'stuName',
key: 'stuName',
},
{
title: '学生学号',
dataIndex: 'stuId',
key: 'stuId',
},
{
title: '互评时间',
dataIndex: 'createTime',
key: 'createTime',
},
{
title: '互评分数',
dataIndex: 'stuScore',
key: 'stuScore',
},
];
const columnsKhnr = [
{
title: '序号',
dataIndex: 'no',
key: 'no',
customRender: (text) => {
return text.index + 1;
},
width: 80,
},
{
title: '章次',
dataIndex: 'title',
key: 'title',
},
{
title: '节次',
dataIndex: 'twoTitle',
key: 'twoTitle',
},
];
function classFun(type) {
if (type == '0') {
return 'background: #fe1a1a';
} else if (type == '1') {
return 'background: #c6c209';
} else if (type == '2') {
return 'background: #18a689';
}
}
/**
* 新增事件
*/
function handleAdd() {
registerModal.value.disableSubmit = false;
registerModal.value.add();
}
function handleChehui(record) {
createConfirm({
iconType: 'warning',
title: '撤回考试',
content: '您确认撤回此次考试吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
defHttp
.post({
url: '/zyInfo/zyInfo/editChehui',
params: { id: record.id },
})
.then((res) => {
createMessage.success(res.message);
handleSuccess2();
});
},
});
}
/**
* 编辑事件
*/
function handleEdit(record, type) {
if (!record.sturead) {
record.sturead = '1';
}
if (!record.xshpkg) {
record.xshpkg = '1';
}
if (!record.sfzzcj) {
record.sfzzcj = '1';
}
if (!record.xssfck) {
record.xssfck = '1';
}
if (!record.sfcc) {
record.sfcc = '1';
}
editDisabled.value = type;
zyInfo.value = record;
dataKhnr.value = [];
var kcnr = zyInfo.value.kcnr;
if (kcnr) {
defHttp.get({ url: '/teachingunitcontent/kcTeachingUnitContentOne/getAllList', params: { id: kcnr } }).then((res) => {
dataKhnr.value = res;
});
}
handleShowType(2);
}
function handleBjzy(record) {
registerEditModal.value.disableSubmit = false;
registerEditModal.value.edit(record);
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
registerDetialModal.value.disableSubmit = true;
registerDetialModal.value.edit(record);
}
//批阅考试信息
function handleZyxx(record, type) {
if (type == '1') {
if (!record.wtjnum || record.wtjnum == '0') {
createMessage.error('当前人数为0不能进行查询');
return;
}
} else if (type == '2') {
if (!record.ytjnum || record.ytjnum == '0') {
createMessage.error('当前人数为0不能进行查询');
return;
}
} else if (type == '3') {
if (!record.wpynum || record.wpynum == '0') {
createMessage.error('当前人数为0不能进行查询');
return;
}
} else if (type == '4') {
if (!record.ypynum || record.ypynum == '0') {
createMessage.error('当前人数为0不能进行查询');
return;
}
} else if (type == '4') {
if (!record.dpynum || record.dpynum == '0') {
createMessage.error('当前人数为0不能进行查询');
return;
}
}
zyInfo.value = record;
handleShowType(3);
queryType.value = type;
rowSelection.value = [];
selectedRowKeys.value = [];
console.log('🧟‍♀️', rowSelection);
queryParam.value = {};
queryParam.value.mainId = record.id;
queryParam.value.queryType = type;
reload();
}
//获取选课人数
function openXkrs(record) {
console.log(`🚀 ~ openXkrs ~ record:`, record);
XxhbbksListModalPage.value.disableSubmit = true;
XxhbbksListModalPage.value.init(record);
}
/**
* 删除事件
*/
async function handleDelete(record) {
if (record.endTime) {
createConfirm({
iconType: 'warning',
title: '删除',
content: '您已经对考试的内容和要求进行了设置,如果继续删除,内容和要求将一并删除,确认进行删除吗?',
okText: '确认',
cancelText: '取消',
onOk: () => {
deleteOne({ id: record.id }, handleSuccess2);
},
});
} else {
deleteOne({ id: record.id }, handleSuccess2);
}
}
//发布考试
async function handleFabu(record) {
createConfirm({
iconType: 'warning',
title: '确认发布',
content: '是否发布考试数据',
okText: '确认',
cancelText: '取消',
onOk: () => {
var url = '/zyInfo/zyInfo/release';
var params = { id: record.id, zyStatus: '1' };
defHttp.post({ url: url, params }).then((res) => {
handleZySuccess(record.id);
});
},
});
}
/**
* 成功回调,用于删除
*/
function handleSuccess2() {
total.value = 1;
handlePageChange(1);
}
/**
* 成功回调,用于增加、修改、发布和撤回
*/
function handleSuccess() {
searchQueryZyxq();
}
function handleZySuccess(zyid) {
setTimeout(() => {
handleSuccess2();
}, 1500);
var url = '/zyInfo/zyInfo/editStudent';
defHttp.get({ url: url, params: { id: zyid } }).then((res) => {});
defHttp.get({ url: '/zyInfo/zyInfo/sendZyWechat', params: { id: zyid } }).then((res) => {});
}
/**
* 查询
*/
function searchQuery() {
total.value = 1;
handlePageChange(1);
}
/**
* 重置
*/
function searchReset() {
queryParam.value = {};
total.value = 1;
searchQueryZyxq();
}
//查询列表数据
function reloadZy() {
queryParamZy.value.pageNo = current.value;
queryParamZy.value.pageSize = pageSize.value;
queryParamZy.value.rwbh = rwbh;
queryParamZy.value.xnxq = xqxn;
// queryParamZy.value.teano = teano;
queryParamZy.value.zyLeixing = '1';
// queryParamZy.value.column = 'a.sort';
// queryParamZy.value.order = 'asc';
defHttp.get({ url: '/zyInfo/zyInfo/list', params: queryParamZy.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;
zycs.value = tableData.value.length;
if (tableData.value.length > 0) {
showType.value = 999;
} else {
showType.value = 0;
}
});
}
function handlePageChange(record) {
current.value = record;
reloadZy();
}
onMounted(() => {
searchQuery();
});
</script>
<style lang="less" scoped>
.title {
margin-left: 20px;
font-size: 16px;
font-weight: bold;
}
.title2 {
font-size: 16px;
font-weight: bold;
}
.ant-divider-horizontal {
display: flex;
clear: both;
width: 100%;
min-width: 100%;
margin: 3px 0 5px;
}
.tishi {
width: 100%;
font-size: 12px;
color: #fd8f02;
margin-top: -4px;
background: #fffbf2;
text-align: center;
padding: 6px 0;
}
.cardClass {
min-height: 200px;
}
.sznrClass {
line-height: 40px;
text-align: center;
}
.ant-card {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgb(0 0 0);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5715;
list-style: none;
font-feature-settings: tnum;
position: relative;
border-radius: 5px;
border: 1px solid #f0f0f0;
background: #f7f7f7;
}
.ant-card:hover {
box-sizing: border-box;
box-shadow: 2px 2px 10px 1px #d4d4d4;
}
.ant-card-head {
min-height: 48px;
margin-bottom: -1px;
padding: 0 24px;
color: rgba(0, 0, 0, 0.85);
font-weight: 500;
font-size: 16px;
background: transparent;
border-bottom: 1px solid #dadada;
border-radius: 2px 2px 0 0;
}
.ellipsis {
overflow: hidden; /* 确保超出容器的内容被裁剪 */
white-space: nowrap; /* 确保文本在一行内显示 */
text-overflow: ellipsis; /* 超出部分显示省略号 */
}
.ellip-title {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-top: -10px;
}
.elli-title {
font-size: 16px;
font-weight: bold;
}
.ellip-word {
font-size: 12px;
color: #666666;
margin-right: 10px;
}
.ellip-word2 {
font-size: 12px;
color: #333;
font-weight: bold;
}
.zuanqu:hover {
cursor: pointer;
color: #18a689;
background: #eff6f4;
}
.data-suggest {
display: flex;
flex-direction: column;
text-align: center;
width: 25%;
margin-right: 5px;
padding: 8px 3px;
border-radius: 5px;
background: #f7f7f7;
margin-top: 10px;
}
.data-suggest span:nth-child(1) {
font-size: 16px;
font-weight: bold;
}
.data-suggest span:nth-child(2) {
font-size: 12px;
}
.work-img {
width: 100%;
display: flex;
justify-content: center;
margin-top: 80px;
margin-bottom: 30px;
}
.work-img-img {
width: 180px;
height: 139px;
}
.buttonClass {
background: #1ab394;
font-weight: 600;
color: #fff;
border-radius: 3px;
border: none;
}
.mar-right20 {
margin-right: 14px;
}
.button-zhta {
color: #666666;
cursor: pointer;
}
.button-zhta:hover {
cursor: pointer;
color: #18a689;
}
.sear-distance {
padding: 0 10px;
}
.ant-form-item {
box-sizing: border-box;
margin: 10px 0;
padding: 0;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5715;
list-style: none;
font-feature-settings: tnum;
/* margin-bottom: 24px; */
vertical-align: top;
}
.bled-countenance {
color: #666;
}
.bled-countenance2 {
color: #999999;
font-size: 12px;
}
.region {
margin: 6px 12px;
padding-bottom: 20px;
background: #fff;
border-radius: 5px;
border: 1px solid #e6e6e6;
}
.region:hover {
margin: 6px 12px;
padding-bottom: 20px;
background: #fff;
border-radius: 5px;
border: 1px solid #e6e6e6;
box-shadow: 2px 2px 10px 1px #d4d4d4;
}
.region-title {
font-size: 16px;
color: #333;
height: 50px;
line-height: 50px;
border-bottom: 1px solid #e1e4eb;
margin-bottom: 20px;
display: flex;
}
.region-title-headline {
display: block;
width: 5px;
height: 16px;
background: #18a689;
border-radius: 6px;
margin-top: 18px;
margin-right: 20px;
}
.module-bg {
background: #fff;
border-radius: 6px;
border: 1px solid #e6e6e6;
}
.home-status {
color: #1ab394;
}
.home-status:hover {
color: #333;
}
.card-label {
background: #81cbbc;
border-radius: 4px;
color: #fff;
padding: 2px 6px;
}
.card-label2 {
background: #84c4fa;
border-radius: 4px;
color: #fff;
padding: 2px 6px;
}
.card-label3 {
background: #fabe84;
border-radius: 4px;
color: #fff;
padding: 2px 6px;
}
.zbClass {
margin-left: 15px;
}
.image-container {
padding: 10px;
width: 100%; /* 设置容器宽度 */
height: auto; /* 设置容器高度 */
overflow: hidden; /* 隐藏溢出的部分 */
display: flex;
align-items: center;
justify-content: center;
}
.rotated-image {
max-width: 100%; /* 最大宽度为容器宽度 */
max-height: 100%; /* 最大高度为容器高度 */
object-fit: contain; /* 保持图片内容不失真 */
transform: rotate(90deg); /* 假设图片已经旋转90度 */
}
</style>