You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

492 lines
15 KiB

<template>
<div>
<!--查询区域-->
<div class="jeecg-basic-table-form-container">
<a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
<!-- <a-col :lg="8">
<a-form-item label="年度" name="annualId">
<a-input placeholder="请输入年度"
v-model:value="queryParam.annualId"></a-input>
</a-form-item>
</a-col>-->
<!-- <a-col :lg="8">
<a-form-item label="比赛名称" name="compId">
<a-input placeholder="请输入比赛名称"
v-model:value="queryParam.compId"></a-input>
</a-form-item>
</a-col>-->
<a-col :lg="8" v-if="!isStu">
<a-form-item label="报名编号" name="applyCode">
<a-input placeholder="请输入报名编号" v-model:value="queryParam.applyCode" />
</a-form-item>
</a-col>
<a-col :lg="8">
<a-form-item label="作品名称" name="topicName">
<a-input placeholder="请输入作品名称" v-model:value="queryParam.topicName" />
</a-form-item>
</a-col>
<a-col :lg="8">
<a-form-item label="状态" name="status">
<a-select ref="select" v-model:value="queryParam.status" style="width: 100%" @focus="focus" placeholder="请选择作品状态">
<a-select-option value="0">待评分</a-select-option>
<a-select-option value="1">已评分</a-select-option>
<a-select-option value="2">待驳回</a-select-option>
<a-select-option value="3">已驳回</a-select-option>
<a-select-option value="4">待提交</a-select-option>
</a-select>
</a-form-item>
</a-col>
<!-- <template v-if="toggleSearchStatus">
&lt;!&ndash; <a-col :lg="8">
<a-form-item label="年度比赛名称" name="annualCompId">
<a-input placeholder="请输入年度比赛名称"
v-model:value="queryParam.annualCompId"></a-input>
</a-form-item>
</a-col>&ndash;&gt;
&lt;!&ndash; <a-col :lg="8">
<a-form-item label="驳回原因" name="backInfo">
<a-input placeholder="请输入驳回原因"
v-model:value="queryParam.backInfo"></a-input>
</a-form-item>
</a-col>&ndash;&gt;
</template>-->
<a-col :xl="6" :lg="7" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
<!-- <a @click="toggleSearchStatus = !toggleSearchStatus"
style="margin-left: 8px">
{{ toggleSearchStatus ? '收起' : '展开' }}
<Icon
:icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'"/>
</a>-->
</a-col>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle v-if="isStu">
<a-button type="primary" @click="handleWorkUpload"> 上传作品 </a-button>
<a-button type="primary" @click="handleBack"> 申请驳回 </a-button>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(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>
<!-- 表单区域 -->
<UpfilePersionModal ref="registerModal" @success="handleSuccess" />
</div>
<AddScore @score-finish="scoreFinish" ref="addScoreRef" />
<WorkUpload ref="workUploadRef" />
<work-info-modal ref="workInfoModalRef" />
<a-modal v-model:visible="modalVisible" title="驳回原因" @cancel="clearBackInfo" @ok="submitBackInfo">
<a-row>
<a-col :span="4" :offset="1">
<span>驳回原因:</span>
</a-col>
<a-col :span="18">
<a-textarea v-model:value="backInfo" placeHolder="请输入驳回原因" aallowClear :autosize="{ minRows: 5 }" />
</a-col>
</a-row>
</a-modal>
</template>
<script lang="ts" name="upfile_persion-upfilePersion" setup>
import { reactive, ref } from 'vue';
import { BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns } from './UpfilePersion.data';
import {
applyWorkBack,
batchDelete,
canScore,
canUpload,
deleteOne,
getDownWork,
getExportUrl,
getImportUrl,
judgeReg,
judgeRoles,
list,
saveOrUpdate,
startScore,
startScoreWithFile,
updateAnnualCompPointStatus,
updateStatus,
workBack,
works,
} from './UpfilePersion.api';
import UpfilePersionModal from './components/UpfilePersionModal.vue';
import { getAreaTextByCode } from '/@/components/Form/src/utils/Area';
import AddScore from '/@/views/UpfilePersion/components/AddScore.vue';
import { useUserStore } from '/@/store/modules/user';
import { message } from 'ant-design-vue';
import { useRoute } from 'vue-router';
import WorkUpload from '/@/views/UpfilePersion/components/WorkUpload.vue';
import WorkInfoModal from '/@/views/UpfilePersion/components/WorkInfoModal.vue';
import { downloadFile } from '/@/api/common/api';
import { router } from '/@/router';
import { useGlobSetting } from '/@/hooks/setting';
const globalSetting = useGlobSetting();
const formRef = ref();
const queryParam = reactive<any>({});
const toggleSearchStatus = ref<boolean>(false);
const registerModal = ref();
const addScoreRef = ref();
const workUploadRef = ref();
const workInfoModalRef = ref();
const userStore = useUserStore();
const modalVisible = ref(false);
// 路由信息
const route = useRoute();
if (!route.query.annualCompPointId) {
router.replace('/page-demo/exception/404');
}
// 角色判断+是否报名
const isStu = ref(false);
const isCommittee = ref(false);
const isSuperAdmin = ref(false);
const isReg = ref(false);
(async (router) => {
isCommittee.value = await judgeRoles({ roles: 'committee' });
isSuperAdmin.value = await judgeRoles({ roles: 'superAdmin' });
isStu.value = await judgeRoles({ roles: 'xs' });
isReg.value = await judgeReg({ annualCompPointId: route.query.annualCompPointId });
// 学生是否报名
if (isStu.value && !isReg.value) {
router.back();
message.error('报名信息不存在,请报名后查看作品');
}
})(router);
//注册table数据
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
title: '作品集',
api: () => list({ annualCompPointId: route.query.annualCompPointId, ...queryParam }),
columns,
canResize: false,
useSearchForm: false,
actionColumn: {
width: 250,
fixed: 'right',
},
beforeFetch: (params) => {
queryParam.pageNo = params.pageNo;
queryParam.pageSize = params.pageSize;
return Object.assign(params, queryParam);
},
},
exportConfig: {
name: 'upfile_persion',
url: getExportUrl,
params: queryParam,
},
importConfig: {
url: getImportUrl,
success: handleSuccess,
},
});
const [registerTable, { reload, collapseAll, updateTableDataRecord, 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) {
if (record.status !== 4 && record.status !== 3) {
return message.error('当前状态下无法删除作品');
}
await deleteOne({ id: record.id }, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
// 准备评分
async function handleScore(record) {
await canScore(record);
addScoreRef.value.modalShow(true, record);
}
// 开始评分
async function scoreFinish(payload) {
payload.applyCode = payload.enrollCode;
/* await startScore(payload);
// 修改作品状态为已评分
await updateStatus(payload);
// 修改年度比赛项目状态
await updateAnnualCompPointStatus(payload);*/
await startScoreWithFile(payload);
await reload();
}
// 上传作品
const isCanUpload = ref(false);
async function handleWorkUpload() {
console.log(123, route.query.annualCompPointId);
isCanUpload.value = false;
await canUpload({ annualCompPointId: route.query.annualCompPointId });
isCanUpload.value = true;
if (isCanUpload.value) {
workUploadRef.value.modalShow(true, route.query.annualCompPointId, reload);
}
}
async function handleWorkSubmit(record) {
if (record.status !== 4 && record.status !== 3) {
return message.error('作品禁止重复提交');
} else {
record.status = 0;
record.backInfo = '';
const resp = await saveOrUpdate(record, true);
if (resp.success) {
await reload();
message.success('提交成功');
} else {
message.error('提交失败');
}
}
}
const backInfo = ref('');
let backRecord: any = null;
function clearBackInfo() {
backInfo.value = '';
modalVisible.value = false;
}
function submitBackInfo() {
backRecord.backInfo = backInfo.value;
startBack(backRecord);
modalVisible.value = false;
}
// 驳回
async function handleBack(record) {
backInfo.value = '';
modalVisible.value = true;
backRecord = record;
}
async function startBack(record) {
if (await judgeRoles({ roles: 'user' })) {
await applyWorkBack({
annualCompPointId: route.query.annualCompPointId,
backInfo: backInfo.value,
});
} else {
await workBack({ ...record });
}
await reload();
}
function handlePreview(record) {
const previewServerUrl = 'http://127.0.0.1:8012/onlinePreview?url=';
const fileUrl = `${globalSetting.domainUrl}${getDownWork}?id=${record.id}`;
const extName = record.url.substring(record.url.lastIndexOf('.'));
const previewUrl = `${fileUrl}&fullfilename=${new Date().getTime()}${extName}`;
window.open(previewServerUrl + encodeURIComponent(Base64.encode(previewUrl)));
}
function handleDown(record) {
const extName = record.url.substring(record.url.lastIndexOf('.'));
message.info('开始下载...');
downloadFile(getDownWork, new Date().getTime() + extName, { ...record });
}
// 作品详情
async function handleWorkInfo(record) {
console.log(11111);
const dataSource = await works({ applyCode: record.applyCode });
workInfoModalRef.value.modalShow(true, dataSource);
}
/**
* 操作栏
*/
function getTableAction(record) {
const tableAction = [];
tableAction.unshift({
label: '详情',
onClick: handleDetail.bind(null, record),
});
if (isStu.value) {
// 学生独有的按钮
tableAction.unshift(
{
label: '提交',
popConfirm: {
title: '是否提交当前作品',
confirm: handleWorkSubmit.bind(null, record),
},
},
{
label: '下载',
onClick: handleDown.bind(null, record),
},
{
label: '预览',
onClick: handlePreview.bind(null, record),
},
{
label: '删除',
popConfirm: {
title: '是否删除当前作品',
confirm: handleDelete.bind(null, record),
},
}
);
} else if (isCommittee.value) {
tableAction.unshift(
{
label: '评分',
onClick: handleScore.bind(null, record),
},
{
label: '驳回',
popConfirm: {
title: '是否驳回当前作品?',
confirm: handleBack.bind(null, record),
},
}
);
} else if (isSuperAdmin.value) {
tableAction.unshift(
{
label: '下载',
onClick: handleDown.bind(null, record),
},
{
label: '预览',
onClick: handlePreview.bind(null, record),
}
);
}
return tableAction;
}
/**
* 下拉操作栏
*/
function getDropDownAction(record) {
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
},
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
];
}
/**
* 查询
*/
function searchQuery() {
reload();
}
/**
* 重置
*/
function searchReset() {
formRef.value.resetFields();
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>