修改bug,添加四分屏功能
This commit is contained in:
parent
d0bfba96ae
commit
81eef127a7
|
@ -40,7 +40,7 @@
|
|||
</a-col>
|
||||
<a-col :span="8">
|
||||
<a-form-item label="在职状态">
|
||||
<j-dict-select-tag ref="xqDictTag" placeholder="请选择在职状态" v-model:value="queryParam.zt" dictCode="kc_export_config_tpkwcqkjzglx,zt,zt,true group by zt"/>
|
||||
<j-dict-select-tag ref="xqDictTag" placeholder="请选择在职状态" v-model:value="queryParam.zt" dictCode="kc_export_config_tpkwcqkjzglx,zt,zt,(zt = '在职' or zt = '退休') group by zt"/>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<!-- <a-col :lg="8">
|
||||
|
|
|
@ -775,6 +775,12 @@ function loadData(){
|
|||
let child = item.child;
|
||||
Object.values(child).forEach(item => {
|
||||
let x:any = item;
|
||||
// if(x.pullUrl == '-1') {
|
||||
// x.isOnLine = true;
|
||||
// }
|
||||
// if(x.pullUrl == '-2') {
|
||||
// x.isOnLine = false;
|
||||
// }
|
||||
// if(x.pullUrl == 'https://kczx.nenu.edu.cn:9553/live_hls/yfjxl101s_lbzj.m3u8')
|
||||
if(x.pullUrl){
|
||||
getListAction.push(liveIsExist(x));
|
||||
|
@ -916,7 +922,7 @@ function getIsOnLineClass(record){
|
|||
if(!record?.child['学生全景']?.isOnLine){
|
||||
bfStatusInfoList.push('学生全景没有信号');
|
||||
}
|
||||
if(!record?.child['PPT']?.isOnLine){
|
||||
if(record.child['PPT'] && !record?.child['PPT']?.isOnLine){
|
||||
bfStatusInfoList.push('PPT没有信号');
|
||||
}
|
||||
if(allIsOnLine == 4){
|
||||
|
|
|
@ -30,6 +30,11 @@ export const columns: BasicColumn[] = [
|
|||
align: "center",
|
||||
dataIndex: 'skrq'
|
||||
},
|
||||
{
|
||||
title: '节次',
|
||||
align: "center",
|
||||
dataIndex: 'hh'
|
||||
},
|
||||
{
|
||||
title: '上课地点',
|
||||
align: "center",
|
||||
|
|
|
@ -14,22 +14,24 @@
|
|||
|
||||
<div style=" width: 100%;margin-left: 30px;" v-html="content"></div>
|
||||
<!-- 题干信息 -->
|
||||
<div style="width: 100%; padding: 0 40px; margin: 0 auto" v-for="(item, index) in tiganData" :key="index">
|
||||
<div style="width: 100%; padding: 0 10px; margin: 0 auto" v-for="(item, index) in tiganData" :key="index">
|
||||
<!-- 单选题 -->
|
||||
<div style="width: 100%" v-if="(item.wjType == 3 || item.wjType == '3') && item.wjSubtype==null">
|
||||
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">单选题</div>
|
||||
<a-card>
|
||||
<template #title>
|
||||
<span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span>
|
||||
|
||||
<div style="white-space: pre-wrap; word-wrap: break-word"><span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span></div>
|
||||
<div v-if="item.picPath">
|
||||
<j-upload v-model:value="item.picPath" fileType="image" disabled :maxCount="item.picPath.split(',').length" :buttonVisible="true" ></j-upload>
|
||||
</div>
|
||||
<div style="text-align: right;">题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<!-- <template #extra>
|
||||
<span style="margin-left: 40px" v-if="isShow"
|
||||
>题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</span
|
||||
>
|
||||
</template>
|
||||
</template> -->
|
||||
<a-radio-group v-model:value="item.itemSelected" style="width: 100%" size="default" :disabled="disabled">
|
||||
<div style="width: 100%" v-for="(tmxx, index) in item.wjxWjxxTmxxList" :key="index">
|
||||
<a-radio :value="tmxx.itemIndex + ``" style="width: 100%; margin-bottom: 5px">
|
||||
|
@ -44,15 +46,12 @@
|
|||
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">判断题</div>
|
||||
<a-card>
|
||||
<template #title>
|
||||
<span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span>
|
||||
|
||||
<div style="white-space: pre-wrap; word-wrap: break-word"><span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span></div>
|
||||
<div v-if="item.picPath">
|
||||
<j-upload v-model:value="item.picPath" fileType="image" disabled :maxCount="item.picPath.split(',').length" :buttonVisible="true" ></j-upload>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<span style="margin-left: 40px" v-if="isShow"
|
||||
>题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</span
|
||||
>
|
||||
<div style="text-align: right;">题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</div>
|
||||
</template>
|
||||
<a-radio-group v-model:value="item.itemSelected" style="width: 100%" size="default" :disabled="disabled">
|
||||
<div style="width: 100%" v-for="(tmxx, index) in item.wjxWjxxTmxxList" :key="index">
|
||||
|
@ -68,15 +67,12 @@
|
|||
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">多选题</div>
|
||||
<a-card>
|
||||
<template #title>
|
||||
<span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word" />
|
||||
|
||||
<div style="white-space: pre-wrap; word-wrap: break-word"><span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span></div>
|
||||
<div v-if="item.picPath">
|
||||
<j-upload v-model:value="item.picPath" fileType="image" disabled :maxCount="item.picPath.split(',').length" :buttonVisible="true" ></j-upload>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<span style="margin-left: 40px" v-if="isShow"
|
||||
>题目分值:<span class="answer-word"> {{ item.wjScore }}</span> 分</span
|
||||
>
|
||||
<div style="text-align: right;">题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</div>
|
||||
</template>
|
||||
<a-checkbox-group v-model:value="item.itemSelected" style="width: 100%" size="default" :disabled="disabled">
|
||||
<a-row>
|
||||
|
@ -94,16 +90,12 @@
|
|||
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">填空题</div>
|
||||
<a-card>
|
||||
<template #title>
|
||||
<span>{{ index + 1 }}、</span
|
||||
><span v-html="item.wjTitle" style="font-weight: bold; white-space: pre-wrap; word-wrap: break-word" />
|
||||
|
||||
<div style="white-space: pre-wrap; word-wrap: break-word"><span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span></div>
|
||||
<div v-if="item.picPath">
|
||||
<j-upload v-model:value="item.picPath" fileType="image" disabled :maxCount="item.picPath.split(',').length" :buttonVisible="true" ></j-upload>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<span style="margin-left: 40px" v-if="isShow"
|
||||
>题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</span
|
||||
>
|
||||
<div style="text-align: right;">题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</div>
|
||||
</template>
|
||||
<a-row>
|
||||
<a-col :span="24">
|
||||
|
@ -123,16 +115,12 @@
|
|||
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">简答题</div>
|
||||
<a-card>
|
||||
<template #title>
|
||||
<span>{{ index + 1 }}、</span
|
||||
><span v-html="item.wjTitle" style="font-weight: bold; white-space: pre-wrap; word-wrap: break-word" />
|
||||
|
||||
<div style="white-space: pre-wrap; word-wrap: break-word"><span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span></div>
|
||||
<div v-if="item.picPath">
|
||||
<j-upload v-model:value="item.picPath" fileType="image" disabled :maxCount="item.picPath.split(',').length" :buttonVisible="true" ></j-upload>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<span style="margin-left: 40px" v-if="isShow"
|
||||
>题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</span
|
||||
>
|
||||
<div style="text-align: right;">题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</div>
|
||||
</template>
|
||||
<a-row>
|
||||
<a-col :span="24">
|
||||
|
@ -152,16 +140,12 @@
|
|||
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">文件题</div>
|
||||
<a-card>
|
||||
<template #title>
|
||||
<span>{{ index + 1 }}、</span
|
||||
><span v-html="item.wjTitle" style="font-weight: bold; white-space: pre-wrap; word-wrap: break-word" />
|
||||
|
||||
<div style="white-space: pre-wrap; word-wrap: break-word"><span>{{ index + 1 }}、</span><span v-html="item.wjTitle" style="white-space: pre-wrap; word-wrap: break-word"></span></div>
|
||||
<div v-if="item.picPath">
|
||||
<j-upload v-model:value="item.picPath" fileType="image" disabled :maxCount="item.picPath.split(',').length" :buttonVisible="true" ></j-upload>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<span style="margin-left: 40px" v-if="isShow"
|
||||
>题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</span
|
||||
>
|
||||
<div style="text-align: right;">题目分值: <span class="answer-word">{{ item.wjScore }}</span> 分</div>
|
||||
</template>
|
||||
<a-row>
|
||||
<a-col :span="24">
|
||||
|
|
|
@ -1,8 +1,14 @@
|
|||
<template>
|
||||
<a-layout-footer style="margin-bottom:10px;">
|
||||
<span class="footerLeft">TEL:0431-85099971</span>
|
||||
<span class="footerRight">Copyright 东北师范大学教务处 2022</span>
|
||||
</a-layout-footer>
|
||||
<!-- <a-layout-footer style="margin-bottom:10px;"> -->
|
||||
<div class="ant-layout-footer">
|
||||
<a-row :span="24">
|
||||
<a-col :xs="24" :md="12" :sm="24"><span class="footerLeft">TEL:0431-85099971</span></a-col>
|
||||
<a-col :xs="24" :md="12" :sm="24" style="text-align: right;"><span class="footerRight">Copyright 东北师范大学教务处 2022</span></a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
<!-- <span class="footerLeft">TEL:0431-85099971</span>
|
||||
<span class="footerRight">Copyright 东北师范大学教务处 2022</span> -->
|
||||
<!-- </a-layout-footer> -->
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
</script>
|
||||
|
@ -11,15 +17,12 @@
|
|||
.footerLeft{
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
float:left;
|
||||
}
|
||||
.footerRight{
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
float: right;
|
||||
}
|
||||
.ant-layout-footer{
|
||||
line-height: 0;
|
||||
background: #FFF;
|
||||
}
|
||||
</style>
|
|
@ -39,7 +39,7 @@
|
|||
<span style="margin-left:15px;">
|
||||
<a-tooltip placement="topRight">
|
||||
<template #title>
|
||||
<span>平台分别在三个时间节点(上课后10分钟,课中50分钟,下课前10分钟)抓取学生全景图片进行AI人流量识别,当前显示的人数为最近一个时间的人数识别</span>
|
||||
<span>平台分别在三个时间节点(上课后10分钟,课中50分钟,下课前10分钟)抓取学生全景图片进行AI人流量识别,当前显示的人数为最近一个时间的人数识别,目前部分教室摄像头拍摄画面广角待更新,AI识别出勤人数仅供参考</span>
|
||||
</template>
|
||||
<!-- <Icon icon="ant-design:question-circle-outlined" /> -->
|
||||
<span class="helpClass">?</span>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
<span style="margin-left:15px;">
|
||||
<a-tooltip placement="topRight">
|
||||
<template #title>
|
||||
<span>平台分别在三个时间节点(上课后10分钟,课中50分钟,下课前10分钟)抓取学生全景图片进行AI人流量识别,当前显示的人数为最近一个时间的人数识别</span>
|
||||
<span>平台分别在三个时间节点(上课后10分钟,课中50分钟,下课前10分钟)抓取学生全景图片进行AI人流量识别,当前显示的人数为最近一个时间的人数识别,目前部分教室摄像头拍摄画面广角待更新,AI识别出勤人数仅供参考</span>
|
||||
</template>
|
||||
<span class="helpClass">?</span>
|
||||
</a-tooltip>
|
||||
|
|
|
@ -49,10 +49,10 @@
|
|||
<BlockOutlined />
|
||||
<span>课程资源</span>
|
||||
</a-menu-item>
|
||||
<!-- <a-menu-item key="sub7" @click="getGzt('khcl')">
|
||||
<a-menu-item key="sub7" @click="getGzt('khcl')">
|
||||
<BlockOutlined />
|
||||
<span>上传考核材料</span>
|
||||
</a-menu-item> -->
|
||||
</a-menu-item>
|
||||
<!-- <a-menu-item key="sub6">
|
||||
<template #icon>
|
||||
<BlockOutlined />
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
<template>
|
||||
<div>
|
||||
<a-row>
|
||||
<a-col><a-button type="primary" @click="init">刷新</a-button> </a-col>
|
||||
<a-col :span="12" v-for="(item) in list">
|
||||
<a-row style="text-align: center;">
|
||||
<a-col class="colCss">{{item.name}}</a-col>
|
||||
<a-col class="colCss">总次数:{{item.totalcount}}</a-col>
|
||||
<a-col class="colCss">使用次数:{{item.usecount}}</a-col>
|
||||
<a-col class="colCss">剩余次数:{{item.remaincount}}</a-col>
|
||||
<a-col class="colCss">到期时间:{{item.endtime}}</a-col>
|
||||
</a-row>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" name="zyJxdg-zyJxdg" setup>
|
||||
import { ref, reactive,onMounted } from 'vue';
|
||||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
import { defHttp } from '/@/utils/http/axios';
|
||||
|
||||
const list = ref<any>([]);
|
||||
function init(){
|
||||
defHttp.get({url:'/zyInfoStudent/zyInfoStudent/getWpSycccs'}).then(res=>{
|
||||
console.log("🚀 ~ defHttp.get ~ res:", res)
|
||||
list.value = res
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
init();
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.jeecg-basic-table-form-container {
|
||||
.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
|
||||
}
|
||||
}
|
||||
.colCss{
|
||||
line-height: 30px;
|
||||
}
|
||||
</style>
|
|
@ -10,6 +10,9 @@
|
|||
<a-tab-pane key="3" tab="测验统计">
|
||||
<CyKctjList></CyKctjList>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="4" tab="查重次数剩余数量">
|
||||
<CccssyslList></CccssyslList>
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
<!-- 表单区域 -->
|
||||
<ZyJxdgModal ref="registerModal" @success="handleSuccess"></ZyJxdgModal>
|
||||
|
@ -31,6 +34,7 @@
|
|||
import TjsjList from '/@/views/zy/sysZy/kczygl/TjsjList.vue';
|
||||
import ZyKctjList from '/@/views/zy/sysZy/kczygl/ZyKctjList.vue';
|
||||
import CyKctjList from '/@/views/zy/sysZy/kczygl/CyKctjList.vue';
|
||||
import CccssyslList from '/@/views/zy/sysZy/kczygl/CccssyslList.vue';
|
||||
|
||||
const globSetting = useGlobSetting();
|
||||
const baseApiUrl = globSetting.domainUrl;
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
<a-col :lg="6">
|
||||
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</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="handleCsbz" style="margin-left: 8px" hidden> 修复次数不足的问题</a-button>
|
||||
</a-col>
|
||||
</span>
|
||||
</a-col>
|
||||
|
@ -68,6 +69,7 @@
|
|||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
||||
import { useGlobSetting } from '/@/hooks/setting';
|
||||
import { defHttp } from '/@/utils/http/axios';
|
||||
|
||||
|
||||
const globSetting = useGlobSetting();
|
||||
|
@ -154,6 +156,13 @@
|
|||
createMessage.warning("正在向文件服务器进行传输,请稍等10秒刷新后进行预览")
|
||||
}
|
||||
}
|
||||
|
||||
//修改因检测次数不足的导致查重结果出不来的问题
|
||||
function handleCsbz(){
|
||||
defHttp.post({url:'/zyInfoStudent/zyInfoStudent/cxtjByJccsbz'}).then(res=>{
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 详情
|
||||
|
|
|
@ -164,9 +164,16 @@ export const columnsKhcl: BasicColumn[] = [
|
|||
},
|
||||
},
|
||||
{
|
||||
title: '状态',
|
||||
title: '是否全部完成',
|
||||
align: "center",
|
||||
dataIndex: 'zyStatus_dictText'
|
||||
dataIndex: 'zyStatus',
|
||||
customRender:({text}) =>{
|
||||
var rt = "未完成";
|
||||
if(text=='2'){
|
||||
rt = "已完成";
|
||||
}
|
||||
return rt;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '学年学期',
|
||||
|
|
|
@ -0,0 +1,230 @@
|
|||
<template>
|
||||
<div>
|
||||
<!--查询区域-->
|
||||
<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-dict-select-tag ref="xqDictTag" placeholder="请选择学年学期" v-model:value="queryParam.xqxn" dictCode="kc_xqxn_history,title,title,true order by start_time desc"/>
|
||||
</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-col>
|
||||
</span>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</div>
|
||||
<!--引用表格-->
|
||||
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||
<!--插槽:table标题-->
|
||||
<template #tableTitle>
|
||||
<a-button type="primary" preIcon="ant-design:export-outlined" @click="batchHandleKhcl" style="margin-left: 8px">上传考核材料</a-button>
|
||||
</template>
|
||||
<!--操作栏-->
|
||||
<template #action="{ record }">
|
||||
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
|
||||
</template>
|
||||
<!--字段回显插槽-->
|
||||
<template #htmlSlot="{text}">
|
||||
<div v-html="text"></div>
|
||||
</template>
|
||||
<!--省市区字段回显插槽-->
|
||||
<!--<template #pcaSlot="{text}">
|
||||
{{ getAreaTextByCode(text) }}
|
||||
</template>-->
|
||||
<template #fileSlot="{text}">
|
||||
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
|
||||
</template>
|
||||
</BasicTable>
|
||||
<!-- 表单区域 -->
|
||||
<ZyInfoModal ref="registerModal" @success="handleSuccess"></ZyInfoModal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" name="zyInfo-zyInfo" setup>
|
||||
import { ref, reactive } from 'vue';
|
||||
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||
import { useListPage } from '/@/hooks/system/useListPage';
|
||||
import { columnsKhcl } from './ZyInfo.data';
|
||||
import { listKhcl, deleteOne, batchDelete, getImportUrl, getExportUrl } from './ZyInfo.api';
|
||||
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||
import ZyInfoModal from './components/ZyInfoModal.vue'
|
||||
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
import { defHttp } from '/@/utils/http/axios';
|
||||
|
||||
const queryParam = ref<any>({zyStatus:'1,2'});
|
||||
const toggleSearchStatus = ref<boolean>(false);
|
||||
const { createConfirm, createMessage } = useMessage();
|
||||
const registerModal = ref();
|
||||
//注册table数据
|
||||
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||
tableProps: {
|
||||
title: 'zy_info',
|
||||
api: listKhcl,
|
||||
columns:columnsKhcl,
|
||||
canResize:false,
|
||||
useSearchForm: false,
|
||||
showActionColumn: false,
|
||||
actionColumn: {
|
||||
width: 120,
|
||||
fixed: 'right',
|
||||
},
|
||||
beforeFetch: (params) => {
|
||||
params.column = '',params.order = '';//新生成的默认不带排序
|
||||
return Object.assign(params, queryParam.value);
|
||||
},
|
||||
},
|
||||
exportConfig: {
|
||||
name: "zy_info",
|
||||
url: getExportUrl,
|
||||
},
|
||||
importConfig: {
|
||||
url: getImportUrl,
|
||||
success: handleSuccess
|
||||
},
|
||||
});
|
||||
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
|
||||
const labelCol = reactive({
|
||||
xs: { span: 24 },
|
||||
sm: { span: 7 },
|
||||
});
|
||||
const wrapperCol = reactive({
|
||||
xs: { span: 24 },
|
||||
sm: { span: 16 },
|
||||
});
|
||||
|
||||
/**
|
||||
* 新增事件
|
||||
*/
|
||||
function handleAdd() {
|
||||
registerModal.value.disableSubmit = false;
|
||||
registerModal.value.add();
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑事件
|
||||
*/
|
||||
function handleEdit(record: Recordable) {
|
||||
registerModal.value.disableSubmit = false;
|
||||
registerModal.value.edit(record);
|
||||
}
|
||||
|
||||
/**
|
||||
* 详情
|
||||
*/
|
||||
function handleDetail(record: Recordable) {
|
||||
registerModal.value.disableSubmit = true;
|
||||
registerModal.value.edit(record);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除事件
|
||||
*/
|
||||
async function handleDelete(record) {
|
||||
await deleteOne({ id: record.id }, handleSuccess);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除事件
|
||||
*/
|
||||
async function batchHandleDelete() {
|
||||
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
|
||||
}
|
||||
|
||||
/**
|
||||
* 成功回调
|
||||
*/
|
||||
function handleSuccess() {
|
||||
(selectedRowKeys.value = []) && reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作栏
|
||||
*/
|
||||
function getTableAction(record) {
|
||||
return [
|
||||
{
|
||||
label: '编辑',
|
||||
onClick: handleEdit.bind(null, record),
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 下拉操作栏
|
||||
*/
|
||||
function getDropDownAction(record) {
|
||||
return [
|
||||
{
|
||||
label: '详情',
|
||||
onClick: handleDetail.bind(null, record),
|
||||
}, {
|
||||
label: '删除',
|
||||
popConfirm: {
|
||||
title: '是否确认删除',
|
||||
confirm: handleDelete.bind(null, record),
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
//上传考核材料
|
||||
function batchHandleKhcl() {
|
||||
if (selectedRowKeys.value.length == 0) {
|
||||
createMessage.warn('请勾选要上传的作业数据!');
|
||||
return;
|
||||
}
|
||||
console.log("🚀 ~ batchHandleKhcl ~ selectedRowKeys.value:", selectedRowKeys.value)
|
||||
// batchZyinfoKhcl({ ids: selectedRowKeys.value }, reload);
|
||||
// defHttp.post({url:'/zyInfoStudent/zyInfoStudent/uploadSckhcl',params:{id:selectedRowKeys.value.join(',')}}).then(res=>{})
|
||||
defHttp.post({url:'/zyInfoStudent/zyInfoStudent/uploadSckhcl',data:{id:selectedRowKeys.value.join(',')}}).then(res=>{
|
||||
reload();
|
||||
})
|
||||
createMessage.success("系统上传中,请等待")
|
||||
}
|
||||
/**
|
||||
* 查询
|
||||
*/
|
||||
function searchQuery() {
|
||||
reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置
|
||||
*/
|
||||
function searchReset() {
|
||||
queryParam.value = {};
|
||||
selectedRowKeys.value = [];
|
||||
//刷新数据
|
||||
reload();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.jeecg-basic-table-form-container {
|
||||
.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
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -380,9 +380,7 @@
|
|||
<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
|
||||
>
|
||||
<!-- <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>
|
||||
|
|
|
@ -380,7 +380,7 @@
|
|||
<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>
|
||||
<!-- <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>
|
||||
|
|
|
@ -0,0 +1,485 @@
|
|||
<template>
|
||||
<a-spin :spinning="confirmLoading" >
|
||||
<a-form ref="formRef" style="background:#f9f9f9;" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||
<a-row>
|
||||
<a-col :span="24">
|
||||
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||
<a-row>
|
||||
<div class="wrapper-back">
|
||||
<div class="wrapper-title">基本信息</div>
|
||||
<a-col :span="24">
|
||||
<a-form-item label="作业题目">
|
||||
<span class="spanb-word">{{ formData.title }}</span>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24" v-if="dataKhnr.length > 0">
|
||||
<a-form-item label="考察内容">
|
||||
<a-table :columns="columnsKhnr" class="spanb-word" rowKey="id" :data-source="dataKhnr" :pagination="false" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="作业截止时间" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
|
||||
<span class="spanb-word">{{ formData.endTime }}</span>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="作业发布时间" :labelCol="labelCol2" :wrapperCol="wrapperCol2">
|
||||
<span class="spanb-word">{{ formData.startTime }}</span>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<a-form-item label="作业要求">
|
||||
<div class="spanb-word" style="margin-top:5px" v-html="formData.content"></div>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24" v-if="formData.filePath">
|
||||
<a-form-item label="参考资料">
|
||||
<span>{{ lastString(formData.filePath) }}</span>
|
||||
<a-button type="primary" style="margin-left: 10px" @click="downLoad(formData.filePath)">下载</a-button>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
|
||||
<a-col :span="24" v-show="formData.sturead == '1' && formData.pfbz">
|
||||
<a-form-item label="评分标准" layout="inline">
|
||||
<div class="spanb-word" style="margin-top:5px" v-html="formData.pfbz"></div>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</div>
|
||||
<a-col :span="24" v-if="formData.wwtgl" class="wrapper-back">
|
||||
<div class="wrapper-title">查重设置</div>
|
||||
<a-form-item layout="inline" style="margin-left: 100px">
|
||||
<a-form-item label="检测通过率" :labelCol="labelCol3" :wrapperCol="wrapperCol3">
|
||||
<span style="padding: 7px 10px"></span>
|
||||
<a-input-number v-model:value="formData.wwtgl" placeholder="检测通过率" style="width: 60%" :max="100" :min="0" disabled>
|
||||
<template #addonAfter> % </template>
|
||||
</a-input-number>
|
||||
</a-form-item>
|
||||
<a-form-item label="比对库设置" :labelCol="labelCol3" :wrapperCol="wrapperCol3">
|
||||
<div style="padding: 7px 20px">维普</div>
|
||||
<div style="padding: 0 10px">
|
||||
<a-checkbox v-model:checked="formData.wwcc" style="margin-left: 10px;" disabled>
|
||||
<span class="Check-title">维普资源库查重:</span><br>
|
||||
<span class="Check-concent">中文科技期刊数据库、硕博学位论文库、高校特色论文库、互联网数据资源/互联网文档资源</span>
|
||||
</a-checkbox>
|
||||
<a-checkbox v-model:checked="formData.xncc" disabled>
|
||||
<span class="Check-title">学校作业库查重:</span><br>
|
||||
<span class="Check-concent">历届学生提供的作业库内查重</span>
|
||||
</a-checkbox>
|
||||
<a-checkbox v-model:checked="formData.nwcc" disabled>
|
||||
<span class="Check-title">本次作业查重:</span><br>
|
||||
<span class="Check-concent">本次学生提交的作业间查重</span>
|
||||
</a-checkbox>
|
||||
</div>
|
||||
<div style="padding: 7px 20px">AIGC</div>
|
||||
<div style="padding: 0 10px">
|
||||
<a-checkbox v-model:checked="formData.aigccc" style="margin-left: 10px" disabled>
|
||||
<span class="Check-title">AIGC查重:</span><br>
|
||||
<span class="Check-concent">检测作业是否部分或全部由AI模型生成</span>
|
||||
</a-checkbox>
|
||||
</div>
|
||||
</a-form-item>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
|
||||
<a-col v-show="formData.pyContent || formData.pyFilePath|| formData.score">
|
||||
<div class="wrapper-back">
|
||||
<div class="wrapper-title">批阅信息</div>
|
||||
<a-row>
|
||||
<a-col :span="24" v-if="formData.pyContent">
|
||||
<a-form-item label="批阅内容" layout="inline">
|
||||
<div class="spanb-word" style="margin-top:5px" v-html="formData.pyContent"></div>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24" v-if="formData.pyFilePath">
|
||||
<a-form-item label="批阅附件">
|
||||
<span>{{ lastString(formData.pyFilePath) }}</span>
|
||||
<a-button type="primary" style="margin-left: 10px" @click="downLoad(formData.pyFilePath)">下载</a-button>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24" v-show="showType == '1'">
|
||||
<div class="wps-iframe" id="wpsiframeid" style="width:100%;height: 500px;"></div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
</a-col>
|
||||
|
||||
|
||||
</a-row>
|
||||
</a-form>
|
||||
</a-col>
|
||||
<!-- <a-col :span="24">
|
||||
<span class="spana">作业分值:{{formData.score?formData.score:'未填写'}}</span>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<span class="spana">描述:
|
||||
<span v-if="formData.content">
|
||||
{{formData.content}}
|
||||
</span>
|
||||
<span v-else>暂无内容</span>
|
||||
</span>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<span class="spana">附件:
|
||||
<span v-if="formData.filePath">
|
||||
<a-button :ghost="true" type="primary" preIcon="ant-design:download" size="small" @click="downloadFile(formData.filePath)"> 下载 </a-button>
|
||||
</span>
|
||||
<span v-else>暂无内容</span>
|
||||
</span>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<span class="spana">上传时间:{{formData.startTime}} ~ {{formData.endTime}}</span>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<span class="spana">是否网络查重:{{formData.wwcc=='0'?'否':'是'}}</span> <span class="spanb">网络通过率:{{formData.wwtgl?formData.wwtgl+"%":'未配置'}}</span>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<span class="spana">是否课程内查重:{{formData.nwcc=='0'?'否':'是'}}</span> <span class="spanb">网络通过率:{{formData.nwtgl?formData.nwtgl+"%":'未配置'}}</span>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<span class="spana">Aigc是否查重:{{formData.aigccc=='0'?'否':'是'}}</span> <span class="spanb">网络通过率:{{formData.aigctgl?formData.aigctgl+"%":'未配置'}}</span>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<span class="spana">是否校内查重:{{formData.xncc=='0'?'否':'是'}}</span> <span class="spanb">网络通过率:{{formData.xntgl?formData.xntgl+"%":'未配置'}}</span>
|
||||
</a-col> -->
|
||||
</a-row>
|
||||
</a-form>
|
||||
</a-spin>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted, unref } from 'vue';
|
||||
import { defHttp } from '/@/utils/http/axios';
|
||||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||
import { getValueType } from '/@/utils';
|
||||
import { saveOrUpdate } from '../ZyInfo.api';
|
||||
import { Form } from 'ant-design-vue';
|
||||
import { useRouter } from 'vue-router';
|
||||
import dayjs, { Dayjs } from 'dayjs';
|
||||
import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
||||
import WebOfficeSDK from '/@/views/zy/zyInfoStudent/components/wpsApi/web-office-sdk-solution-v2.0.7.es'
|
||||
|
||||
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||
//当前路由信息
|
||||
const { currentRoute } = useRouter();
|
||||
const { query } = unref(currentRoute);
|
||||
const { rwbh } = query; //获取传递参数
|
||||
const props = defineProps({
|
||||
formDisabled: { type: Boolean, default: false },
|
||||
formData: { type: Object, default: () => {} },
|
||||
formBpm: { type: Boolean, default: true },
|
||||
});
|
||||
const showType = ref<string>('1');
|
||||
const formRef = ref();
|
||||
const useForm = Form.useForm;
|
||||
const emit = defineEmits(['register', 'ok']);
|
||||
const dataKhnr = ref<any>([]);
|
||||
const formData = reactive<Record<string, any>>({
|
||||
id: '',
|
||||
title: '',
|
||||
zyType: '0',
|
||||
content: '',
|
||||
filePath: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
wwcc: '0',
|
||||
wwtgl: undefined,
|
||||
nwcc: '0',
|
||||
nwtgl: undefined,
|
||||
aigccc: '0',
|
||||
aigctgl: undefined,
|
||||
rwbh: '',
|
||||
xncc: '0',
|
||||
xntgl: undefined,
|
||||
});
|
||||
const { createMessage } = useMessage();
|
||||
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
||||
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
||||
// const labelCol2 = ref<any>({ xs: { span: 24 }, sm: { span: 3 } });
|
||||
// const wrapperCol2 = ref<any>({ xs: { span: 24 }, sm: { span: 20 } });
|
||||
|
||||
const labelCol2 = reactive({
|
||||
sm: { span: 10 },
|
||||
});
|
||||
const wrapperCol2 = reactive({
|
||||
sm: { span: 10 },
|
||||
});
|
||||
const labelCol3 = reactive({
|
||||
sm: { span: 4 },
|
||||
});
|
||||
const wrapperCol3 = reactive({
|
||||
sm: { span: 20 },
|
||||
});
|
||||
|
||||
const confirmLoading = ref<boolean>(false);
|
||||
//表单验证
|
||||
const validatorRules = {
|
||||
title: [{ required: true, message: '请输入作业名称!' }],
|
||||
// zyType: [{ required: true, message: '请输入类型!'},],
|
||||
startTime: [{ required: true, message: '请输入开始时间!' }],
|
||||
endTime: [{ required: true, message: '请输入结束时间!' }],
|
||||
wwcc: [{ required: true, message: '请输入外网是否查重!' }],
|
||||
wwtgl: [{ required: false }, { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!' }],
|
||||
nwcc: [{ required: true, message: '请输入内网查重!' }],
|
||||
nwtgl: [{ required: false }, { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!' }],
|
||||
aigccc: [{ required: true, message: '请输入aigc查重!' }],
|
||||
aigctgl: [{ required: false }, { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!' }],
|
||||
xncc: [{ required: true, message: '请输入aigc查重!' }],
|
||||
xntgl: [{ required: false }, { pattern: /^-?\d+\.?\d*$/, message: '请输入数字!' }],
|
||||
};
|
||||
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
|
||||
const disabledDate = (current: Dayjs) => {
|
||||
return current && current < dayjs().subtract(1, 'days').endOf('day');
|
||||
};
|
||||
// 表单禁用
|
||||
const disabled = computed(() => {
|
||||
if (props.formBpm === true) {
|
||||
if (props.formData.disabled === false) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return props.formDisabled;
|
||||
});
|
||||
|
||||
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 downLoad(file) {
|
||||
if (file) {
|
||||
let url = getFileAccessHttpUrl(file);
|
||||
if (url) {
|
||||
window.open(url);
|
||||
}
|
||||
} else {
|
||||
createMessage.warning('暂无文件或文件上传中');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*/
|
||||
function add() {
|
||||
edit({ rwbh });
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑
|
||||
*/
|
||||
function edit(record) {
|
||||
console.log("🚀 ~ edit ~ record:", record)
|
||||
nextTick(() => {
|
||||
resetFields();
|
||||
//赋值
|
||||
Object.assign(formData, record);
|
||||
handleKcnr(formData.kcnr);
|
||||
|
||||
|
||||
const parts = record.stuFilePath.split('.');
|
||||
const filetype = parts[parts.length - 1];
|
||||
console.log(`🚀 ~ nextTick ~ filetype:`, filetype)
|
||||
// var file = getFileAccessHttpUrl(record.filePath);
|
||||
// ylurl.value = file;
|
||||
let wpsType = "w";
|
||||
if(filetype=='doc' || filetype=='docx'){
|
||||
showType.value = '1';
|
||||
wpsType = "w";
|
||||
}else if(filetype=='pdf'){
|
||||
showType.value = '1';
|
||||
wpsType = "f";
|
||||
}else if(filetype=='ppt' || filetype=='pptx' ){
|
||||
showType.value = '1';
|
||||
wpsType = "p";
|
||||
}else if(filetype=='xls' || filetype=='xlsx' ){
|
||||
showType.value = '1';
|
||||
wpsType = "s";
|
||||
}
|
||||
|
||||
if(showType.value == '1'){
|
||||
const element = document.getElementById('wpsiframeid');
|
||||
// 清空内容
|
||||
element.innerHTML = '';
|
||||
const jssdk = WebOfficeSDK.init({
|
||||
officeType: wpsType,
|
||||
appId: 'SX20241118WSUGQN',
|
||||
fileId: formData.stuId,
|
||||
mount:document.querySelector('.wps-iframe'),
|
||||
commonOptions: {
|
||||
isShowDocMap: false, //是否开启目录功能,默认开启
|
||||
isShowTopArea: false, // 隐藏顶部区域(头部和工具栏)
|
||||
isShowHeader: false, // 隐藏头部区域
|
||||
isBrowserViewFullscreen: true, // 是否在浏览器区域全屏
|
||||
isIframeViewFullscreen: true, // 是否在 iframe 区域内全屏
|
||||
acceptVisualViewportResizeEvent: true // 控制 WebOffice 是否接受外部的 VisualViewport
|
||||
},
|
||||
wordOptions: {
|
||||
isShowDocMap: false, // 是否开启目录功能,默认开启
|
||||
isBestScale: true, // 打开文档时,默认以最佳比例显示
|
||||
isShowBottomStatusBar: false, // 是否展示底部状态栏
|
||||
}
|
||||
//token: getToken()
|
||||
})
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function lastString(record) {
|
||||
console.log('😓', record);
|
||||
const parts = record.split('/');
|
||||
console.log('🧔', parts);
|
||||
return parts[parts.length - 1];
|
||||
}
|
||||
/**
|
||||
* 提交数据
|
||||
*/
|
||||
async function submitForm() {
|
||||
// 触发表单验证
|
||||
await validate();
|
||||
confirmLoading.value = true;
|
||||
const isUpdate = ref<boolean>(false);
|
||||
//时间格式化
|
||||
let model = formData;
|
||||
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(',');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (model.wwcc == '1') {
|
||||
if (!model.wwtgl) {
|
||||
createMessage.warning('网络通过率不能为空');
|
||||
confirmLoading.value = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (model.nwcc == '1') {
|
||||
if (!model.nwtgl) {
|
||||
createMessage.warning('内网通过率不能为空');
|
||||
confirmLoading.value = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (model.aigccc == '1') {
|
||||
if (!model.aigctgl) {
|
||||
createMessage.warning('AIGC通过率不能为空');
|
||||
confirmLoading.value = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (model.xncc == '1') {
|
||||
if (!model.xntgl) {
|
||||
createMessage.warning('校内通过率不能为空');
|
||||
confirmLoading.value = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
await saveOrUpdate(model, isUpdate.value)
|
||||
.then((res) => {
|
||||
if (res.success) {
|
||||
createMessage.success(res.message);
|
||||
emit('ok');
|
||||
} else {
|
||||
createMessage.warning(res.message);
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
confirmLoading.value = false;
|
||||
});
|
||||
}
|
||||
|
||||
//选择考察内容
|
||||
function handleKcnr(kcnr) {
|
||||
if (kcnr) {
|
||||
defHttp.get({ url: '/teachingunitcontent/kcTeachingUnitContentOne/getAllList', params: { id: kcnr } }).then((res) => {
|
||||
console.log('🤦♀️', res);
|
||||
dataKhnr.value = res;
|
||||
});
|
||||
} else {
|
||||
dataKhnr.value = [];
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
add,
|
||||
edit,
|
||||
submitForm,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.antd-modal-form {
|
||||
min-height: 300px !important;
|
||||
overflow-y: auto;
|
||||
padding: 24px 24px 24px 24px;
|
||||
}
|
||||
.spanSm {
|
||||
top: -22px;
|
||||
position: inherit;
|
||||
padding: 0 0 0 164px;
|
||||
color: #a9a9a9;
|
||||
}
|
||||
.spana {
|
||||
margin-left: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
.spanb {
|
||||
margin-left: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
.spanb-word {
|
||||
color: #999999;
|
||||
}
|
||||
.wrapper-back {
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
margin-top: 10px;
|
||||
padding-top: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
.wrapper-title {
|
||||
font-size: 18px;
|
||||
border-left: 4px solid #1ab394;
|
||||
font-weight: bold;
|
||||
padding-left: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.Check-title{
|
||||
color: #333;
|
||||
font-weight: bold;
|
||||
}
|
||||
.Check-concent{
|
||||
color: #999;
|
||||
}
|
||||
</style>
|
|
@ -81,7 +81,7 @@
|
|||
</a-form-item>
|
||||
</a-col>
|
||||
|
||||
<a-col v-if="formData.pyContent || formData.pyFilePath">
|
||||
<a-col v-show="formData.pyContent || formData.pyFilePath|| formData.score">
|
||||
<div class="wrapper-back">
|
||||
<div class="wrapper-title">批阅信息</div>
|
||||
<a-row>
|
||||
|
@ -96,6 +96,9 @@
|
|||
<a-button type="primary" style="margin-left: 10px" @click="downLoad(formData.pyFilePath)">下载</a-button>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24" v-show="showType == '1'">
|
||||
<div class="wps-iframe" id="wpsiframeid" style="width:100%;height: 500px;"></div>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</div>
|
||||
</a-col>
|
||||
|
@ -155,6 +158,7 @@ import { useRouter } from 'vue-router';
|
|||
import dayjs, { Dayjs } from 'dayjs';
|
||||
import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
||||
import WebOfficeSDK from '/@/views/zy/zyInfoStudent/components/wpsApi/web-office-sdk-solution-v2.0.7.es'
|
||||
|
||||
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||
//当前路由信息
|
||||
|
@ -166,6 +170,7 @@ const props = defineProps({
|
|||
formData: { type: Object, default: () => {} },
|
||||
formBpm: { type: Boolean, default: true },
|
||||
});
|
||||
const showType = ref<string>('0');
|
||||
const formRef = ref();
|
||||
const useForm = Form.useForm;
|
||||
const emit = defineEmits(['register', 'ok']);
|
||||
|
@ -283,11 +288,58 @@ function add() {
|
|||
* 编辑
|
||||
*/
|
||||
function edit(record) {
|
||||
console.log("🚀 ~ edit ~ record:", record)
|
||||
nextTick(() => {
|
||||
resetFields();
|
||||
//赋值
|
||||
Object.assign(formData, record);
|
||||
handleKcnr(formData.kcnr);
|
||||
|
||||
|
||||
// const parts = record.stuFilePath.split('.');
|
||||
// const filetype = parts[parts.length - 1];
|
||||
// console.log(`🚀 ~ nextTick ~ filetype:`, filetype)
|
||||
// let wpsType = "w";
|
||||
// if(filetype=='doc' || filetype=='docx'){
|
||||
// showType.value = '1';
|
||||
// wpsType = "w";
|
||||
// }else if(filetype=='pdf'){
|
||||
// showType.value = '1';
|
||||
// wpsType = "f";
|
||||
// }else if(filetype=='ppt' || filetype=='pptx' ){
|
||||
// showType.value = '1';
|
||||
// wpsType = "p";
|
||||
// }else if(filetype=='xls' || filetype=='xlsx' ){
|
||||
// showType.value = '1';
|
||||
// wpsType = "s";
|
||||
// }
|
||||
|
||||
// if(showType.value == '1'){
|
||||
// const element = document.getElementById('wpsiframeid');
|
||||
// // 清空内容
|
||||
// element.innerHTML = '';
|
||||
// const jssdk = WebOfficeSDK.init({
|
||||
// officeType: wpsType,
|
||||
// appId: 'SX20241118WSUGQN',
|
||||
// fileId: formData.stuId,
|
||||
// mount:document.querySelector('.wps-iframe'),
|
||||
// commonOptions: {
|
||||
// isShowDocMap: false, //是否开启目录功能,默认开启
|
||||
// isShowTopArea: false, // 隐藏顶部区域(头部和工具栏)
|
||||
// isShowHeader: false, // 隐藏头部区域
|
||||
// isBrowserViewFullscreen: true, // 是否在浏览器区域全屏
|
||||
// isIframeViewFullscreen: true, // 是否在 iframe 区域内全屏
|
||||
// acceptVisualViewportResizeEvent: true // 控制 WebOffice 是否接受外部的 VisualViewport
|
||||
// },
|
||||
// wordOptions: {
|
||||
// isShowDocMap: false, // 是否开启目录功能,默认开启
|
||||
// isBestScale: true, // 打开文档时,默认以最佳比例显示
|
||||
// isShowBottomStatusBar: false, // 是否展示底部状态栏
|
||||
// }
|
||||
// //token: getToken()
|
||||
// })
|
||||
// }
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,415 @@
|
|||
/**
|
||||
* 定义用户头部其它按钮菜单
|
||||
*/
|
||||
interface IUserHeaderSubItemsConf {
|
||||
/**
|
||||
* 类型
|
||||
*/
|
||||
type: 'export_img' | 'split_line' | 'custom';
|
||||
/**
|
||||
* 文本
|
||||
*/
|
||||
text?: string;
|
||||
/**
|
||||
* 事件订阅
|
||||
*/
|
||||
subscribe?: ((arg0?: any) => any) | string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义用户头部按钮配置
|
||||
*/
|
||||
interface IUserHeaderButtonConf {
|
||||
/**
|
||||
* 提示
|
||||
*/
|
||||
tooltip?: string;
|
||||
/**
|
||||
* 事件订阅
|
||||
*/
|
||||
subscribe?: ((arg0?: any) => any) | string;
|
||||
|
||||
/**
|
||||
* 菜单项
|
||||
*/
|
||||
items?: IUserHeaderSubItemsConf[];
|
||||
}
|
||||
|
||||
/**
|
||||
* 用于保存iframe原始尺寸
|
||||
*/
|
||||
interface IIframeWH {
|
||||
width: string;
|
||||
height: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义用户头部配置
|
||||
*/
|
||||
interface IUserHeadersConf {
|
||||
/**
|
||||
* 返回按钮
|
||||
*/
|
||||
backBtn?: IUserHeaderButtonConf;
|
||||
/**
|
||||
* 分享按钮
|
||||
*/
|
||||
shareBtn?: IUserHeaderButtonConf;
|
||||
/**
|
||||
* 其他按钮
|
||||
*/
|
||||
otherMenuBtn?: IUserHeaderButtonConf;
|
||||
}
|
||||
interface ICommonOptions {
|
||||
/**
|
||||
* 是否显示顶部区域,头部和工具栏
|
||||
*/
|
||||
isShowTopArea: boolean;
|
||||
/**
|
||||
* 是否显示头部
|
||||
*/
|
||||
isShowHeader: boolean;
|
||||
/**
|
||||
* 是否需要父级全屏
|
||||
*/
|
||||
isParentFullscreen: boolean;
|
||||
/**
|
||||
* 是否在iframe区域内全屏
|
||||
*/
|
||||
isIframeViewFullscreen: boolean;
|
||||
/**
|
||||
* 是否在浏览器区域内全屏
|
||||
*/
|
||||
isBrowserViewFullscreen: boolean;
|
||||
}
|
||||
/**
|
||||
* 文字自定义配置
|
||||
*/
|
||||
interface IWpsOptions {
|
||||
/**
|
||||
* 是否显示目录
|
||||
*/
|
||||
isShowDocMap?: boolean;
|
||||
/**
|
||||
* 默认以最佳显示比例打开
|
||||
*/
|
||||
isBestScale?: boolean;
|
||||
/**
|
||||
* pc-是否展示底部状态栏
|
||||
*/
|
||||
isShowBottomStatusBar?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 表格自定义配置
|
||||
*/
|
||||
interface IEtOptions {
|
||||
/**
|
||||
* pc-是否展示底部状态栏
|
||||
*/
|
||||
isShowBottomStatusBar?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* pdf自定义配置
|
||||
*/
|
||||
interface IPDFOptions {
|
||||
isShowComment?: boolean;
|
||||
isInSafeMode?: boolean;
|
||||
/**
|
||||
* pc-是否展示底部状态栏
|
||||
*/
|
||||
isShowBottomStatusBar?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 演示自定义配置
|
||||
*/
|
||||
interface IWppOptions {
|
||||
/**
|
||||
* pc-是否展示底部状态栏
|
||||
*/
|
||||
isShowBottomStatusBar?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据表自定义配置
|
||||
*/
|
||||
interface IDBOptions {
|
||||
/**
|
||||
* 是否显示使用反馈按钮
|
||||
*/
|
||||
isShowFeedback?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* 定义用户通用事件订阅
|
||||
*/
|
||||
interface ISubscriptionsConf {
|
||||
[key: string]: any;
|
||||
/**
|
||||
* 导航事件
|
||||
*/
|
||||
navigate: (arg0?: any) => any;
|
||||
/**
|
||||
* WPSWEB ready 事件
|
||||
*/
|
||||
ready: (arg0?: any) => any;
|
||||
/**
|
||||
* 打印事件
|
||||
*/
|
||||
print?: {
|
||||
custom?: boolean,
|
||||
subscribe: (arg0?: any) => any,
|
||||
};
|
||||
/**
|
||||
* 导出 PDF 事件
|
||||
*/
|
||||
exportPdf?: (arg0?: any) => any;
|
||||
}
|
||||
|
||||
interface ITokenData {
|
||||
token: string;
|
||||
timeout: number;
|
||||
}
|
||||
|
||||
interface IClipboardData {
|
||||
text: string;
|
||||
html: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户配置
|
||||
*/
|
||||
interface IConfig {
|
||||
/**
|
||||
* WPSWEB iframe 挂载点
|
||||
*/
|
||||
mount?: HTMLElement;
|
||||
/**
|
||||
* url参数
|
||||
*/
|
||||
url?: string;
|
||||
wpsUrl?: string; // 即将废弃
|
||||
/**
|
||||
* 头部
|
||||
*/
|
||||
headers?: IUserHeadersConf;
|
||||
/**
|
||||
* 头部
|
||||
*/
|
||||
mode?: 'nomal' | 'simple';
|
||||
/**
|
||||
* 通用配置
|
||||
*/
|
||||
commonOptions?: ICommonOptions;
|
||||
/**
|
||||
* 文字自定义配置
|
||||
*/
|
||||
wpsOptions?: IWpsOptions;
|
||||
wordOptions?: IWppOptions;
|
||||
/**
|
||||
* 表格自定义配置
|
||||
*/
|
||||
etOptions?: IEtOptions;
|
||||
excelOptions?: IEtOptions;
|
||||
/**
|
||||
* 演示自定义配置
|
||||
*/
|
||||
wppOptions?: IWppOptions;
|
||||
pptOptions?: IWppOptions;
|
||||
/**
|
||||
* pdf自定义配置
|
||||
*/
|
||||
pdfOptions?: IPDFOptions;
|
||||
/**
|
||||
* db自定义配置
|
||||
*/
|
||||
dbOptions?: IDBOptions;
|
||||
/**
|
||||
* 事件订阅
|
||||
*/
|
||||
subscriptions?: ISubscriptionsConf;
|
||||
// 调试模式
|
||||
debug?: boolean;
|
||||
commandBars?: IWpsCommandBars[];
|
||||
print?: {
|
||||
custom?: boolean,
|
||||
callback?: string,
|
||||
};
|
||||
|
||||
exportPdf?: {
|
||||
callback?: string,
|
||||
};
|
||||
|
||||
// 获取token
|
||||
refreshToken?: TRefreshToken;
|
||||
|
||||
cooperUserAttribute?: {
|
||||
isCooperUsersAvatarVisible?: boolean,
|
||||
cooperUsersColor?: [{
|
||||
userId: string | number,
|
||||
color: string,
|
||||
}],
|
||||
};
|
||||
}
|
||||
|
||||
// type eventConfig = {
|
||||
// eventName: cbEventNames,
|
||||
// }
|
||||
|
||||
/** ============================= */
|
||||
interface IMessage {
|
||||
eventName: string;
|
||||
msgId?: string;
|
||||
callbackId?: number;
|
||||
data?: any;
|
||||
url?: any;
|
||||
result?: any;
|
||||
error?: any;
|
||||
_self?: boolean;
|
||||
sdkInstanceId?: number
|
||||
}
|
||||
|
||||
/**
|
||||
* WPSWEBAPI
|
||||
*/
|
||||
interface IWpsWebApi {
|
||||
WpsApplication?: () => any;
|
||||
}
|
||||
|
||||
/**
|
||||
* 工具栏
|
||||
*/
|
||||
interface IWpsCommandBars {
|
||||
cmbId: string;
|
||||
attributes: IWpsCommandBarAttr[] | IWpsCommandBarObjectAttr;
|
||||
}
|
||||
|
||||
/**
|
||||
* 工具栏属性
|
||||
*/
|
||||
interface IWpsCommandBarAttr {
|
||||
name: string;
|
||||
value: any;
|
||||
}
|
||||
/**
|
||||
* 工具栏属性
|
||||
*/
|
||||
interface IWpsCommandBarObjectAttr {
|
||||
[propName: string]: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* D.IWPS 定义
|
||||
*/
|
||||
|
||||
interface IWps extends IWpsCompatible {
|
||||
version: string;
|
||||
url: string;
|
||||
iframe: any;
|
||||
Enum? : any; // 即将废弃
|
||||
Events?: any; // 即将废弃
|
||||
Props?: string;
|
||||
advancedApiReady: () => Promise<any>;
|
||||
/**
|
||||
* 兼容1.x用法
|
||||
*/
|
||||
ready?:() => Promise<any>;
|
||||
destroy: () => Promise<any>;
|
||||
WpsApplication?: () => any;
|
||||
WordApplication?: () => any;
|
||||
EtApplication?: () => any;
|
||||
ExcelApplication?: () => any;
|
||||
WppApplication?: () => any;
|
||||
PPTApplication?: () => any;
|
||||
PDFApplication?: () => any;
|
||||
Application?: any;
|
||||
CommonApi?: any;
|
||||
commonApiReady: () => Promise<any>;
|
||||
setToken: (tokenData: {
|
||||
token: string, timeout?: number, hasRefreshTokenConfig: boolean,
|
||||
}) => Promise<any>;
|
||||
tokenData?: { token: string } | null;
|
||||
commandBars?: IWpsCommandBars[] | null;
|
||||
iframeReady?: boolean;
|
||||
on: (eventName: string, handle: (event?: any) => void) => void;
|
||||
off: (eventName: string, handle: (event?: any) => void) => void;
|
||||
Stack?: any;
|
||||
Free?: (objId: any) => Promise<any>;
|
||||
}
|
||||
|
||||
/**
|
||||
* 兼容1.x用法
|
||||
*/
|
||||
interface IWpsCompatible {
|
||||
tabs?: {
|
||||
getTabs: () => Promise<Array<{tabKey: number, text: string}>>
|
||||
switchTab: (tabKey: number) => Promise<any>,
|
||||
}
|
||||
setCommandBars?: (args: Array<IWpsCommandBars>) => Promise<void>;
|
||||
save?: () => Promise<any>;
|
||||
ApiEvent?: {
|
||||
AddApiEventListener: (eventName: string, handle: (event?: any) => void) => void
|
||||
RemoveApiEventListener: (eventName: string, handle: (event?: any) => void) => void
|
||||
}
|
||||
executeCommandBar?: (id: string) => void
|
||||
}
|
||||
|
||||
interface IFlag {
|
||||
advancedApiReadySended: boolean;
|
||||
advancedApiReadySendedJust: boolean;
|
||||
commonApiReadySended: boolean;
|
||||
commonApiReadySendedJust: boolean;
|
||||
}
|
||||
|
||||
interface ICbEvent {
|
||||
refreshToken?: TRefreshToken;
|
||||
}
|
||||
|
||||
interface IWebOfficeSDK {
|
||||
config: (conf: IConfig) => IWps | undefined;
|
||||
init: (conf: IAppConfig) => IWps | undefined;
|
||||
OfficeType: OfficeType;
|
||||
}
|
||||
|
||||
interface IReadyEvent {
|
||||
event: string;
|
||||
callback?: (...args: any) => void;
|
||||
after?: boolean;
|
||||
}
|
||||
|
||||
type TRefreshToken = () => ITokenData | Promise<ITokenData>;
|
||||
|
||||
type sendMsgToWps = (msg: IMessage) => void;
|
||||
type getId = () => string;
|
||||
|
||||
interface IAppConfig extends IConfig {
|
||||
appId: string;
|
||||
fileId: string | number;
|
||||
officeType: string;
|
||||
/**
|
||||
* @deprecated use token instead
|
||||
*/
|
||||
fileToken?: string | ITokenData;
|
||||
token?: string | ITokenData;
|
||||
endpoint?: string;
|
||||
customArgs?: Record<string, string | number>;
|
||||
/**
|
||||
* @deprecated A config item for WebOfficeSDK.config
|
||||
*/
|
||||
url?: string;
|
||||
mount?: any;
|
||||
attrAllow: string | string[];
|
||||
isListenResize?: boolean; // sdk内部是否监听resize变化,默认监听
|
||||
}
|
||||
|
||||
type OfficeType = {
|
||||
Spreadsheet: string,
|
||||
Writer: string,
|
||||
Presentation: string,
|
||||
Pdf: string,
|
||||
Otl: string
|
||||
}
|
||||
|
||||
export { IAppConfig, ICbEvent, IClipboardData, ICommonOptions, IConfig, IDBOptions, IEtOptions, IFlag, IIframeWH, IMessage, IPDFOptions, IReadyEvent, ISubscriptionsConf, ITokenData, IUserHeaderButtonConf, IUserHeaderSubItemsConf, IUserHeadersConf, IWebOfficeSDK, IWppOptions, IWps, IWpsCommandBarAttr, IWpsCommandBarObjectAttr, IWpsCommandBars, IWpsCompatible, IWpsOptions, IWpsWebApi, OfficeType, TRefreshToken, getId, sendMsgToWps };
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue