启动器功能,模型管理

This commit is contained in:
chengdandan 2024-06-25 16:14:11 +08:00
parent 30e21b71fb
commit 6888028201
4 changed files with 475 additions and 891 deletions

View File

@ -16,7 +16,7 @@ export const GetModelList = (params) => {
export const GetModelDetails = (params) => {
return get('/api/GetModelDetails', params)
}
//
// 新增成绩管理列表
export const AddExam = (params) => {
return post('/api/AddExam', params)
@ -25,7 +25,18 @@ export const AddExam = (params) => {
export const EditExamList = (params) => {
return post('/api/EditExam', params)
}
// 编辑启动器
export const EditStarter = (params) => {
return post('/api/EditStarter', params)
}
// 上传文件接口
export const apiUploadList = (url, params) => {
return uploadFile('/api/Upload' + url, params)
}
// 删除文件
export const DeleteFile = (params) => {
return get('/api/DeleteFile', params)
}
// 编辑器树结构
export const GetFaultTree = (params) => {
return get('/api/GetFaultTree', params)
@ -92,9 +103,9 @@ export const GetPlatformArea = (params) => {
export const GetLine = (params) => {
return get('/api/GetLine', params)
}
export const EditExam = (params) => {
return post('/api/EditExam', params)
// 编辑模型
export const EditModel = (params) => {
return post('/api/EditModel', params)
}
export const GetExamDetails = (params) => {
return get('/api/GetExamDetails', params)

View File

@ -4,7 +4,7 @@ const routes = [
{
path: '/',
name: '',
redirect: '/home'
redirect: '/ExaminationManagement'
},
{
path: '/login',
@ -26,12 +26,12 @@ const routes = [
{
path: '/home',
component: () => import('@/views/home/index.vue'),
meta: { sort: 1, title: '测试', icon: '' }
meta: { sort: 1, title: '模型管理', icon: '' }
},
{
path: '/ExaminationManagement',
component: () => import('@/views/ExaminationManagement/index.vue'),
meta: { sort: 1, title: '考试管理', icon: '' }
meta: { sort: 1, title: '启动器管理', icon: '' }
}
// {

View File

@ -1,58 +1,8 @@
<template>
<div class="PageContent">
<!-- <div class="WebToolbar">
<div class="FormComponent">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="状态">
<el-select v-model="formInline.Status" placeholder="请选择状态" clearable>
<el-option label="未发布" value="未发布" />
<el-option label="已发布" value="已发布" />
<el-option label="已结束" value="已结束" />
</el-select>
</el-form-item>
<el-form-item label="软件名称">
<el-input
v-model="formInline.ExamName"
placeholder="请输入考试名称"
clearable
/>
</el-form-item>
</el-form>
</div>
<div class="ButtonAssembly">
<el-button style="color: #fff" @click="queryData()">
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
<el-button style="color: #1d2129" @click="resetFormInline">
<img src="../../assets/menu/reset.png" alt="" />
<span>重置</span>
</el-button>
</div>
</div> -->
<div class="Tabulation">
<div class="actionBar">
<h1>考试列表</h1>
<!-- <div class="Worktop">
<el-button @click="goToAboutPage">编辑器</el-button>
<el-button @click="handleReleaseExam">发布</el-button>
<el-button @click="handleRevokeReleaseExam">撤销发布</el-button>
<el-button @click="handleFinishedExam">考试结束</el-button>
<el-button @click="handleExamination">考试名单</el-button>
<el-button class="BlueBack" @click="handleCreate">
<img src="../../assets/menu/Increased.png" alt="" />
<span>新增</span>
</el-button>
<el-button class="BlueBack" @click="dialogToLead = true">
<img src="../../assets/menu/toLead.png" alt="" />
<span>导入</span>
</el-button>
<el-button class="Delete">
<img src="../../assets/menu/delete.png" alt="" />
<span>删除</span>
</el-button>
</div> -->
</div>
<div class="ExaminationForm">
<el-table
@ -93,12 +43,12 @@
<!--新增弹框-->
<el-dialog
v-model="dialogFormVisible"
:title="ExamId ? '编辑考试' : '新增考试'"
title="编辑启动器"
width="1050"
center
@close="closeDialog"
>
<el-form ref="formRef" :model="form" :rules="state.rules" :inline="true" :label-width="formLabelWidth">
<el-form ref="formRef" :model="form" :rules="state.rules" :inline="false" :label-width="formLabelWidth">
<el-form-item label="软件名称:" prop="SoftwareName">
<el-input v-model="form.SoftwareName" />
</el-form-item>
@ -108,8 +58,8 @@
>
<el-input v-model="form.VersionNumber" />
</el-form-item>
<el-form-item label="启动器资源包" style="margin-top: 20%;margin-left: 10px;">
<el-upload
<el-form-item label="启动器资源包" style="margin-top: 5%;margin-left: 10px;">
<el-upload
:action="action"
:before-remove="handleRemoveFile"
:file-list="fileListFile"
@ -131,6 +81,7 @@
<el-button size="mini" type="primary">上传文件</el-button>
</template>
</el-upload>
<!-- 文件列表 -->
<transition-group
class="upload-file-list el-upload-list el-upload-list--text"
@ -140,24 +91,74 @@
<li
:key="file.uid"
class="el-upload-list__item ele-upload-list__item-content"
v-for="(file, index) in list"
v-for="(file, index) in fileListFile"
>
<el-link :href="file.url" :underline="false" target="_blank">
<el-link :href="file.filePath" :underline="false" target="_blank">
<span class="el-icon-document">
{{ getFileName(file.name) }}
{{ file. fileName}}
</span>
</el-link>
<div class="ele-upload-list__item-content-action">
<!-- <div class="ele-upload-list__item-content-action">
<el-link
:underline="false"
@click="handleDelete(index)"
type="danger"
>删除</el-link
>
</div>
</div> -->
</li>
</transition-group>
</el-form-item>
<el-form-item label="更新包资源地址:" style="margin-top: 5%;margin-left: 10px;">
<el-upload
:action="action"
:before-remove="handleRemoveFile1"
:file-list="fileListFileM"
multiple
accept=".pdf,.doc,.docx,.excel,.ppt,.pptx,.word,.xlsx,.RTF, .xls"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:on-change="handChangeFile"
:on-preview="handleFormPreview"
:http-request="httpRequest"
:show-file-list="true"
:auto-upload="false"
class="upload-file-uploader horizontal-list"
ref="upload"
>
<!-- 上传按钮 -->
<template v-slot:trigger>
<el-button size="mini" type="primary">上传文件</el-button>
</template>
</el-upload>
<transition-group
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
>
<li
:key="file.uid"
class="el-upload-list__item ele-upload-list__item-content"
v-for="(file, index) in fileListFileM"
>
<el-link :href="file.filePath" :underline="false" target="_blank">
<span class="el-icon-document">
{{ file. fileName}}
</span>
</el-link>
<!-- <div class="ele-upload-list__item-content-action">
<el-link
:underline="false"
@click="handleDelete(index)"
type="danger"
>删除</el-link
>
</div> -->
</li>
</transition-group>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
@ -168,218 +169,7 @@
</div>
</template>
</el-dialog>
<!-- 编辑弹框-->
<!-- <el-dialog
v-model="EditFormVisible"
title="新增考试"
width="1050"
center
:data="EditExamtableData"
v-if="false"
>
<el-form :model="form" :inline="true" :label-width="formLabelWidth">
<el-form-item label="考试名称:" >
<el-input v-model="form.name" />
</el-form-item>
<el-form-item
label="场景:"
class="demo-form-scene"
>
<el-select v-model="form.region" placeholder="">
</el-select>
</el-form-item>
<el-form-item label="台区:" >
<el-select v-model="form.PlatformAreaName" placeholder="">
</el-select>
</el-form-item>
<el-form-item label="线路:" >
<el-select v-model="form.region" placeholder="">
</el-select>
</el-form-item>
<el-form-item
label="处理日期:"
class="el-form-end"
>
<el-date-picker v-model="value2" type="date" placeholder="请选择时间" />
</el-form-item>
<el-form-item label="巡线日期:" >
<el-date-picker v-model="value1" type="date" placeholder="请选择时间" />
</el-form-item>
<el-form-item
label="工单内容:"
class="backInformation"
>
<el-input
v-model="form.WorkOrderContent"
style="width: 240px"
:rows="12"
type="textarea"
placeholder="Please input"
/>
</el-form-item>
<el-form-item label="背景资料:" label-width="192px" >
<el-input
v-model="textarea"
style="width: 240px"
:rows="12"
type="textarea"
placeholder=""
/>
</el-form-item>
<el-form-item label="考试时长:" >
<el-input v-model="form.name" autocomplete="off" />
</el-form-item>
<el-form-item label="411电缆型号及长度">
<el-input v-model="form.name" autocomplete="off" />
<span class="example">示例YJV22-4*95/12</span>
</el-form-item>
<el-form-item label="411电缆型号及长度">
<el-input v-model="form.name" autocomplete="off" />
<span class="example">示例YJV22-4*95/12</span>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="submit">确认</el-button>
<el-button type="primary" @click="EditFormVisible = false">
取消
</el-button>
</div>
</template>
</el-dialog> -->
<!--考试名单 -->
<!-- <el-dialog v-model="dialogTabular" title="考试学员考试题目" width="1800">
<div class="functionalUnit">
<el-form :model="stateA.queryForm" :inline="true" width="800">
<el-form-item label="姓名:" width="200">
<el-input v-model="stateA.queryForm.Name" autocomplete="off" />
</el-form-item>
<el-form-item label="账号:" width="200">
<el-input v-model="stateA.queryForm.Account" autocomplete="off" />
</el-form-item>
</el-form>
<div class="functionalUnit">
<el-button @click="getExamination">
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
<el-button class="BlueBack" @click="dialogExamination = true" >
<img src="../../assets/menu/Increased.png" alt="" />
<span>新增</span>
</el-button>
</div>
</div>
<P class="TabularTitle">
<span style="margin-left: 20px">考试名单列表</span>
</P>
<div class="TabularList">
<el-table :data="stateA.examRosterList" style="width: 100%">
<el-table-column prop="OwnCity" abel="所在市" width="280"/>
<el-table-column prop="unit_name" label="单位" width="200"/>
<el-table-column prop="dep_name" label="部门" />
<el-table-column prop="login_name" label="账号" />
<el-table-column prop="real_name" label="姓名" />
<el-table-column prop="sex" label="性别"/>
<el-table-column prop="" label="操作" >
<template #default="{row}">
<span class="register" @click="handleCancel(row)">删除</span>
</template>
</el-table-column>
<template #empty>
<el-empty class="vab-data-empty" description="暂无数据" />
</template>
</el-table>
</div>
<div class="pagination">
<el-pagination
v-model:current-page="InlineForm.PageIndex"
:page-size="InlineForm.PageSize"
:small="small"
:disabled="disabled"
:background="background"
layout="total, prev, pager, next"
:total="stateA.total"
@current-change="handleCurrentChangeA"
/>
</div>
<el-dialog v-model="dialogExamination" title="备选考试人员" width="1600">
<div class="functionalUnit">
<el-form :model="stateB.queryForm" :inline="true" width="800
<el-form-item label="姓名:" width="200">
<el-input v-model="stateB.queryForm.Name" autocomplete="off" />
</el-form-item>
<el-form-item label="账号:" width="200">
<el-input v-model="stateB.queryForm.Account" autocomplete="off" />
</el-form-item>
</el-form>
<div class="functionalUnit">
<el-button >
<img src="../../assets/menu/search.png" alt="" />
<span>查询</span>
</el-button>
</div>
</div>
<div class="ExaminationList">
<P class="TabularTitle">
<span>考试[下发各地市测试01]</span>
<span style="margin-left: 20px">备选考试人员列表</span>
</P>
<div class="TabularList">
<el-table
:data="stateB.examRosterList"
style="width: 100%"
@selection-change="handleSelChange"
>
<el-table-column type="selection" />
<el-table-column prop="LoginName" label="账号" />
<el-table-column prop="RealName" label="姓名" />
<el-table-column prop="Sex" label="性别"/>
<template #empty>
<el-empty class="vab-data-empty" description="暂无数据" />
</template>
</el-table>
<div class="addSlip">
<el-button @click="addExamRoster">
<span>添加人员</span>
</el-button>
<el-pagination
v-model:current-page="InlineForm.PageIndex"
:page-size="InlineForm.PageSize"
:small="small"
:disabled="disabled"
:background="background"
layout="total, prev, pager, next"
:total="stateB.total"
@current-change="handleCurrentChangeB"
/>
</div>
</div>
</div>
</el-dialog>
</el-dialog> -->
<!-- 导入 -->
<!-- <el-dialog v-model="dialogToLead" title="导入" width="400">
<el-upload
ref="uploadRef"
action="#"
:http-request="toUpload"
:auto-upload="false"
:on-change="handleChange"
:limit="1"
:on-exceed="handleExceed"
>
<template #trigger>
<el-button type="primary">选择</el-button>
</template>
<el-button class="ml-3" type="success" @click="submitUpload">
上传
</el-button>
</el-upload>
</el-dialog> -->
</template>
<script setup>
@ -389,9 +179,10 @@ import { useRouter } from 'vue-router'
import {
GetStarterList,
AddExam,
EditExam,
GetExamDetails,
// EditExam,
apiUploadList,
EditExamList,
DeleteFile,
DeleteExam,
GetScene,
GetPlatformArea,
@ -465,16 +256,16 @@ const form = reactive({
onMounted(() => {
getTable()
// addTable()
GetScene().then(res => {
state.scenemList = res.data
console.log(res.data, 'res.data--')
})
GetPlatformArea({
SceneId: 'eab5920509b011ed844e7cd30a92bb1c'
}).then(res => state.platformAreaList = res.data)
GetLine({
PlatformAreaId: '28f0723409b111ed844e7cd30a92bb1c'
}).then(res => state.lineList = res.data)
// ().then(res => {
// state.scenemList = res.data
// console.log(res.data, 'res.data--')
// })
// GetPlatformArea({
// SceneId: 'eab5920509b011ed844e7cd30a92bb1c'
// }).then(res => state.platformAreaList = res.data)
// GetLine({
// PlatformAreaId: '28f0723409b111ed844e7cd30a92bb1c'
// }).then(res => state.lineList = res.data)
})
//
@ -533,51 +324,132 @@ const handleCurrentChange = (val) => {
getTable()
}
const ExamId = ref('')
const fileM = ref('')
const fileListN = ref([])
const fileListFile = ref([])
const fileListFileM = ref([])
const handleEdit = async (row) => {
const res = await GetExamDetails({ ExamId: row.ExamId })
console.log(res.data, 'res--')
for (const key in form) {
form[key] = res.data[key]
}
ExamId.value = res.data.ExamId
console.log('row', row)
const fileListFileM1 = ref([])
const fileListFile1 = ref([])
form.SoftwareName = row.SoftwareName
form.VersionNumber = row.VersionNumber
const parts = row.LauncherResources.split('/')
const parts2 = row.UpdateResources.split('/')
fileListFile1.value.push({
filePath: row.LauncherResources,
fileName: parts[parts.length - 1]
})
fileListFileM1.value.push({
filePath: row.UpdateResources,
fileName: parts2[parts2.length - 1]
})
fileListFile.value = fileListFile1.value
fileListFileM.value = fileListFileM1.value
dialogFormVisible.value = true
}
const handleCopy = (row) => {
ApiCopyExam({ ExamId: row.ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
const handChangeFile = (file, fileList) => {
console.log('fileList', fileList)
console.log('file', file)
// fileListN = fileList
fileM.value = file.raw
fileListN.value = fileList
loadSize('File')
}
//
const handleRemoveFile = (file, fileList) => {
console.log('file', file.filePath)
console.log('fileList', fileList)
const formData = new FormData() // newformData
formData.append('Path', file.filePath) // fileformData
// console.log(form.LauncherResources, 'data')
DeleteFile({ Path: file.filePath }).then((res) => {
console.log(res, 'res')
form.LauncherResources = ''
})
}
//
const handleDelete = (row) => {
console.log(row.ExamId, 'row--')
ElMessageBox.confirm('确定要删除吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
DeleteExam({ ExamId: row.ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
const handleRemoveFile1 = (file, fileList) => {
console.log('file', file.filePath)
console.log('fileList', fileList)
const formData = new FormData() // newformData
formData.append('Path', file.filePath) // fileformData
// console.log(form.LauncherResources, 'data')
DeleteFile({ Path: file.filePath }).then((res) => {
console.log(res, 'res')
form.UpdateResources = ''
})
}
const S4 = () => {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
}
const guid = () => {
return (
S4() +
S4() +
'-' +
S4() +
'-' +
S4() +
'-' +
S4() +
'-' +
S4() +
S4() +
S4()
)
}
const loadSize = (FolderName) => {
const size = fileM.value.size //
const maxZrea = 8 // MB
const bufferSize = maxZrea * (1024 * 1024)
let fileStart = 0
let fileEnd = bufferSize
const arrFile = []
while (fileStart < size) {
const fileInfo = {
File: fileM.value.slice(fileStart, fileEnd),
Start: fileStart,
End: fileEnd
}
arrFile.push(fileInfo)
fileStart = fileEnd
fileEnd = fileStart + bufferSize
}
const count = arrFile.length
const filename = fileM.value.name + '~' + guid()
const paramFilename = fileM.value.name// filename
// const filename = this.file.name; //
test2(count, filename, bufferSize, arrFile, size, FolderName, paramFilename)
}
const test2 = async (count, filename, bufferSize, arrFile, size, FolderName, paramFilename) => {
for (let i = 0; i < count; i++) {
const formData = new FormData() // newformData
formData.append('file', arrFile[i].File) // fileformData
const url =
'?Name=' +
filename +
'&Number=' +
i +
'&BufferSize=' +
bufferSize +
'&Count=' +
count +
'&Start=' +
arrFile[i].Start +
'&End=' +
arrFile[i].End +
'&Size=' +
size +
'&FolderName=' +
FolderName
console.log('url', url)
await apiUploadList(url, formData).then((res) => {
console.log(filename, 'filename')
form.LauncherResources = res.data
})
}
}
//
//
@ -652,223 +524,6 @@ const handleUpdate = async () => {
console.log(data.data, 'data')
}
//
const handleReleaseExam = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ElMessageBox.confirm('确定要发布吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ApiReleaseExam({ ExamId: multipleSelection.value[0].ExamId }).then(res => {
console.log(res, 'res--')
if (res.code == 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const handleRevokeReleaseExam = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ElMessageBox.confirm('确定要撤销发布吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ApiRevokeReleaseExam({ ExamId: multipleSelection.value[0].ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const handleFinishedExam = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ElMessageBox.confirm('确定要考试结束吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ApiFinishedExam({ ExamId: multipleSelection.value[0].ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const dialogTabular = ref(false)
const stateA = reactive({
total: 0,
examRosterList: [],
queryForm: {
Name: '',
Account: '',
PageIndex: 1,
PageSize: 10
}
})
const handleExamination = async () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
getExamination()
getAddExamRosterListt()
dialogTabular.value = true
}
const getExamination = async () => {
console.log(stateA.queryForm, ' stateA.queryForm--')
const res = await ApiGetExamRosterList({
ExamId: multipleSelection.value[0].ExamId,
// ExamId: '048dd77b0a734856a86153e2feaa1d1d',
...stateA.queryForm
})
dialogTabular.value = true
stateA.examRosterList = res.data?.list || []
stateA.total = res.data?.total
console.log(res, 'res--ApiGetExamRosterList')
}
//
const handleCancel = (row) => {
console.log(row.ExamUsersId, 'row--')
ElMessageBox.confirm('确定要删除吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
DeleteExamRoster({ ExamUsersId: row.ExamUsersId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
getExamination()
getAddExamRosterListt()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const dialogExamination = ref(false)
const rosterSelection = ref([])
const handleSelChange = (val) => {
console.log(val, 'val--')
rosterSelection.value = val
}
const stateB = reactive({
total: 0,
examRosterList: [],
queryForm: {
Name: '',
Account: '',
PageIndex: 1,
PageSize: 10
}
})
const handleCurrentChangeB = (val) => {
stateB.queryForm.PageIndex = val
getAddExamRosterListt()
}
const getAddExamRosterListt = async () => {
console.log(stateA.queryForm, ' stateA.queryForm--')
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
const res = await ApiGetAddExamRosterListt({
ExamId: multipleSelection.value[0].ExamId,
// ExamId: '048dd77b0a734856a86153e2feaa1d1d',
...stateB.queryForm
})
dialogTabular.value = true
stateB.examRosterList = res.data?.list || []
stateB.total = res.data?.total
console.log(res, 'res--ApiGetExamRosterList')
}
const addExamRoster = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ApiAddExamRoster({
ExamId: multipleSelection.value[0].ExamId,
UserIdList: rosterSelection.value.map(item => item.UserId)
}).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
getExamination()
getAddExamRosterListt()
dialogExamination.value = false
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
}
//
const dialogToLead = ref(false)
const uploadRef = ref()
const handleExceed = (files) => {
// submitUpload(files[0])
uploadRef.value.clearFiles()
nextTick(() => {
uploadRef.value.handleStart(files[0])
})
}
const handleChange = (uploadFile) => {
console.log(uploadFile, 'uploadFile')
// submitUpload(uploadFile.raw)
}
const submitUpload = () => {
uploadRef.value.submit()
}
const toUpload = (param) => {
if (!uploadRef.value) return ElMessage.error('请先上传文件')
const formData = new FormData()
formData.append('Files', param.file)
apiUpload('', formData).then((res) => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '上传成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
}
</script>
<style scoped lang="scss">
@ -1086,4 +741,20 @@ const toUpload = (param) => {
.ml-3{
margin-left: 20px;
}
.upload-file-uploader{
width: 50%;
}
.el-upload-list .el-upload-list__item{
width: 33% !important;
float: left;
margin-left: -385px;
margin-top: 25px;
:deep(.horizontal-list ul .el-upload-list__item) {
width: 33%;
float: left; margin-top: 25px;
}
}
</style>

View File

@ -39,8 +39,8 @@
</div>
<div class="Tabulation">
<div class="actionBar">
<h1>考试列表</h1>
<div class="Worktop">
<h1>模型列表</h1>
<!-- <div class="Worktop">
<el-button @click="goToAboutPage">编辑器</el-button>
<el-button @click="handleReleaseExam">发布</el-button>
<el-button @click="handleRevokeReleaseExam">撤销发布</el-button>
@ -59,7 +59,7 @@
<img src="../../assets/menu/delete.png" alt="" />
<span>删除</span>
</el-button>
</div>
</div> -->
</div>
<div class="ExaminationForm">
<el-table
@ -108,41 +108,97 @@
center
@close="closeDialog"
>
<el-form ref="formRef" :model="form" :rules="state.rules" :inline="true" :label-width="formLabelWidth">
<el-form-item label="企业编号:" prop="ExamName">
<el-input v-model="form.ExamName" />
<el-form ref="formRef" :model="form" :rules="state.rules" :inline="false" :label-width="formLabelWidth">
<!-- <el-form-item label="企业编号:" prop="EnterpriseCode" class="demo-form-scene">
<el-input v-model="form.EnterpriseCode" />
</el-form-item> -->
<el-form-item label="企业编号:" prop="EnterpriseCode" class="demo-form-scene">
<el-input v-model="form.EnterpriseCode" />
</el-form-item>
<el-form-item
label="企业名称:"
class="demo-form-scene"
>
<el-input v-model="form.ExamName" />
<el-input v-model="form.EnterpriseName" />
</el-form-item>
<el-form-item
label="关区编码:"
class="demo-form-scene"
>
<el-input v-model="form.DistrictCode" />
</el-form-item>
<el-form-item label="模型名称:" >
<el-input v-model="form.ExamName" />
<el-input v-model="form.ModelName" />
</el-form-item>
<el-form-item label="版本号:" >
<el-input v-model="form.ExamName" />
<el-input v-model="form.VersionNumber" />
</el-form-item>
<el-form-item label="地图经度:" >
<el-input v-model="form.ExaminationDuration" autocomplete="off" />
<el-input v-model.number="form.MapLongitude" type="number" step="0.01"/>
<span class="example">示例YJV22-4*95/12</span>
</el-form-item>
<el-form-item label="地图纬度:">
<el-input v-model="form.IncomingLineModelLength" autocomplete="off" />
<el-input v-model.number="form.MapLatitude" type="number" step="0.01" autocomplete="off" />
<span class="example">示例YJV22-4*95/12</span>
</el-form-item>
<el-form-item label="模型包大小:">
<el-input v-model="form.OutgoingLineModelLength" autocomplete="off" />
<span class="example">示例YJV22-4*95/12</span>
<el-input v-model="form.TrainingSize" autocomplete="off" />
</el-form-item>
<el-form-item label="模型包资源:">
<el-input v-model="form.OutgoingLineModelLength" autocomplete="off" />
<span class="example">示例YJV22-4*95/12</span>
</el-form-item>
<el-form-item label="更新时间:">
<el-input v-model="form.OutgoingLineModelLength" autocomplete="off" />
<span class="example">示例YJV22-4*95/12</span>
<!-- <el-input v-model="form.ModelResources" autocomplete="off" /> -->
<el-upload
:action="action"
:before-remove="handleRemoveFile"
:file-list="fileListFile"
multiple
accept=".pdf,.doc,.docx,.excel,.ppt,.pptx,.word,.xlsx,.RTF, .xls"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:on-change="handChangeFile"
:on-preview="handleFormPreview"
:http-request="httpRequest"
:show-file-list="true"
:auto-upload="false"
class="upload-file-uploader horizontal-list"
ref="upload"
>
<!-- 上传按钮 -->
<template v-slot:trigger>
<el-button size="mini" type="primary">上传文件</el-button>
</template>
</el-upload>
<!-- 文件列表 -->
<!-- 文件列表 -->
<transition-group
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
>
<li
:key="file.uid"
class="el-upload-list__item ele-upload-list__item-content"
v-for="(file, index) in fileListFile"
>
<el-link :href="file.filePath" :underline="false" target="_blank">
<span class="el-icon-document">
{{ file. fileName}}
</span>
</el-link>
<!-- <div class="ele-upload-list__item-content-action">
<el-link
:underline="false"
@click="handleDelete(index)"
type="danger"
>删除</el-link
>
</div> -->
</li>
</transition-group>
</el-form-item>
<!-- <el-form-item label="最新更新时间:">
<el-input v-model="form.UpdateTime" autocomplete="off" />
</el-form-item> -->
</el-form>
<template #footer>
<div class="dialog-footer">
@ -162,24 +218,10 @@ import { ElTable, ElMessageBox, ElMessage } from 'element-plus'
import { useRouter } from 'vue-router'
import {
GetModelList,
AddExam,
EditExam,
apiUploadList,
EditModel,
GetModelDetails,
EditExamList,
DeleteExam,
GetScene,
GetPlatformArea,
GetLine,
ApiReleaseExam,
ApiRevokeReleaseExam,
ApiFinishedExam,
ApiCopyExam,
ApiDownloadExamm,
ApiGetExamRosterList,
DeleteExamRoster,
ApiGetAddExamRosterListt,
ApiAddExamRoster,
apiUpload
DeleteFile
} from '@/api/index.js'
@ -222,11 +264,12 @@ const state = reactive({
const form = reactive({
EnterpriseName: '',
DistrictCode: '',
EnterpriseCode: '',
ModelName: '',
VersionNumber: '',
MapLongitude: '',
MapLatitude: '',
Trainingsize: '',
TrainingSize: '',
ModelResources: '',
UpdateTime: ''
// WorkOrderContent: '',
@ -239,17 +282,6 @@ const form = reactive({
//
onMounted(() => {
getTable()
// addTable()
GetScene().then(res => {
state.scenemList = res.data
console.log(res.data, 'res.data--')
})
GetPlatformArea({
SceneId: 'eab5920509b011ed844e7cd30a92bb1c'
}).then(res => state.platformAreaList = res.data)
GetLine({
PlatformAreaId: '28f0723409b111ed844e7cd30a92bb1c'
}).then(res => state.lineList = res.data)
})
//
@ -276,6 +308,120 @@ const getTable = async () => {
} catch (error) {}
}
//
const handleRemoveFile = (file, fileList) => {
console.log('file', file.filePath)
console.log('fileList', fileList)
const formData = new FormData() // newformData
formData.append('Path', file.filePath) // fileformData
// console.log(form.ModelResources, 'data')
DeleteFile({ Path: file.filePath }).then((res) => {
console.log(res, 'res')
form.ModelResources = ''
})
}
const fileM = ref('')
const fileListN = ref([])
const fileListFile = ref([])
/** 上传文件状态改变时调用 */
const handChangeFile = (file, fileList) => {
console.log('fileList', fileList)
console.log('file', file)
// fileListN = fileList
fileM.value = file.raw
fileListN.value = fileList
loadSize('File')
}
const S4 = () => {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
}
const guid = () => {
return (
S4() +
S4() +
'-' +
S4() +
'-' +
S4() +
'-' +
S4() +
'-' +
S4() +
S4() +
S4()
)
}
const loadSize = (FolderName) => {
const size = fileM.value.size //
const maxZrea = 8 // MB
const bufferSize = maxZrea * (1024 * 1024)
let fileStart = 0
let fileEnd = bufferSize
const arrFile = []
while (fileStart < size) {
const fileInfo = {
File: fileM.value.slice(fileStart, fileEnd),
Start: fileStart,
End: fileEnd
}
arrFile.push(fileInfo)
fileStart = fileEnd
fileEnd = fileStart + bufferSize
}
const count = arrFile.length
const filename = fileM.value.name + '~' + guid()
const paramFilename = fileM.value.name// filename
// const filename = this.file.name; //
test2(count, filename, bufferSize, arrFile, size, FolderName, paramFilename)
}
const test2 = async (count, filename, bufferSize, arrFile, size, FolderName, paramFilename) => {
for (let i = 0; i < count; i++) {
const formData = new FormData() // newformData
formData.append('file', arrFile[i].File) // fileformData
const url =
'?Name=' +
filename +
'&Number=' +
i +
'&BufferSize=' +
bufferSize +
'&Count=' +
count +
'&Start=' +
arrFile[i].Start +
'&End=' +
arrFile[i].End +
'&Size=' +
size +
'&FolderName=' +
FolderName
console.log('url', url)
await apiUploadList(url, formData).then((res) => {
console.log(filename, 'filename')
form.ModelResources = res.data
})
}
}
//
const handleFormPreview = (file) => {
// file.url = file.name;//
console.log('预览文件', file.name)
let fileUrl = ''
//
this.formData.FileData.forEach((item, index) => {
if (file.name == item.FileName) {
const href = window.location.href
const regex = /^https?:\/\/([^/:]+):?(\d+)?/i
const match = href.match(regex)
console.log('match', match)
fileUrl = match[0] + item.FilePath
}
})
const blob = new Blob([fileUrl], { type: 'application/msword' })
window.open(fileUrl, '_block')
console.log(fileUrl, '文件')
}
const multipleTableRef = ref()
const multipleSelection = ref([])
const handleSelectionChange = (val) => {
@ -307,100 +453,54 @@ const handleCurrentChange = (val) => {
formInline.PageIndex = val
getTable()
}
const ExamId = ref('')
const EnterpriseCode = ref('')
const handleEdit = async (row) => {
// fileListFile.value = ref([])
const fileListFile1 = ref([])
const res = await GetModelDetails({ EnterpriseCode: row.EnterpriseCode })
console.log(res.data, 'res--')
for (const key in form) {
form[key] = res.data[key]
}
// ExamId.value = res.data.ExamId
EnterpriseCode.value = res.data.EnterpriseCode
dialogFormVisible.value = true
}
const handleCopy = (row) => {
ApiCopyExam({ ExamId: row.ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
}
//
const handleDelete = (row) => {
console.log(row.ExamId, 'row--')
ElMessageBox.confirm('确定要删除吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
DeleteExam({ ExamId: row.ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
const parts = res.data.ModelResources.split('/')
fileListFile1.value.push({
filePath: res.data.ModelResources,
fileName: parts[parts.length - 1]
})
fileListFile.value = fileListFile1.value
}
//
//
const submit = () => {
formRef.value.validate(async (valid) => {
console.log(form, 'from--')
if (valid) {
const obj = state.platformAreaList.find(v => v.PlatformAreaId == form.PlatformAreaId)
console.log(obj, 'obj--')
// if (valid) {
EditModel({
EnterpriseCode: form.EnterpriseCode,
ModelName: form.ModelName,
VersionNumber: form.VersionNumber,
MapLongitude: form.MapLongitude,
MapLatitude: form.MapLatitude,
TrainingSize: form.TrainingSize,
ModelResources: form.ModelResources
if (ExamId.value) {
EditExam({
...form,
PlatformArea: obj?.PlatformAreaName || '',
ExamId: ExamId.value
}).then(res => {
console.log(res, 'res--')
if (res.code == 0) {
ElMessage({
message: '操作成功.',
type: 'success'
})
closeDialog()
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
}).then(res => {
console.log(res, 'res--')
if (res.code == 0) {
ElMessage({
message: '操作成功.',
type: 'success'
})
closeDialog()
queryData()
} else {
form.Type = '考试'
AddExam({
...form,
PlatformArea: obj?.PlatformAreaName || ''
}).then(res => {
console.log(res, 'res--')
if (res.code == 0) {
ElMessage({
message: '操作成功.',
type: 'success'
})
closeDialog()
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
ElMessage.error(res?.data || '操作失敗')
}
}
})
// }
})
}
//
@ -408,239 +508,21 @@ const closeDialog = () => {
for (const key in form) {
form[key] = ''
}
ExamId.value = ''
EnterpriseCode.value = ''
dialogFormVisible.value = false
}
//
const router = useRouter()
const goToAboutPage = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
router.push(`/EditorMacros?ExamId=${multipleSelection.value[0].ExamId}`) //
}
//
const EditFormVisible = ref(false)
const EditExamtableData = ref()
const handleUpdate = async () => {
EditFormVisible.value = true
const data = await EditExamList()
console.log(data.data, 'data')
}
//
const handleReleaseExam = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ElMessageBox.confirm('确定要发布吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ApiReleaseExam({ ExamId: multipleSelection.value[0].ExamId }).then(res => {
console.log(res, 'res--')
if (res.code == 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const handleRevokeReleaseExam = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ElMessageBox.confirm('确定要撤销发布吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ApiRevokeReleaseExam({ ExamId: multipleSelection.value[0].ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const handleFinishedExam = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ElMessageBox.confirm('确定要考试结束吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
ApiFinishedExam({ ExamId: multipleSelection.value[0].ExamId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const dialogTabular = ref(false)
const stateA = reactive({
total: 0,
examRosterList: [],
queryForm: {
Name: '',
Account: '',
PageIndex: 1,
PageSize: 10
}
})
const handleExamination = async () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
getExamination()
getAddExamRosterListt()
dialogTabular.value = true
}
const getExamination = async () => {
console.log(stateA.queryForm, ' stateA.queryForm--')
const res = await ApiGetExamRosterList({
ExamId: multipleSelection.value[0].ExamId,
// ExamId: '048dd77b0a734856a86153e2feaa1d1d',
...stateA.queryForm
})
dialogTabular.value = true
stateA.examRosterList = res.data?.list || []
stateA.total = res.data?.total
console.log(res, 'res--ApiGetExamRosterList')
}
//
const handleCancel = (row) => {
console.log(row.ExamUsersId, 'row--')
ElMessageBox.confirm('确定要删除吗?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
DeleteExamRoster({ ExamUsersId: row.ExamUsersId }).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
getExamination()
getAddExamRosterListt()
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
})
}
//
const dialogExamination = ref(false)
const rosterSelection = ref([])
const handleSelChange = (val) => {
console.log(val, 'val--')
rosterSelection.value = val
}
const stateB = reactive({
total: 0,
examRosterList: [],
queryForm: {
Name: '',
Account: '',
PageIndex: 1,
PageSize: 10
}
})
const handleCurrentChangeB = (val) => {
stateB.queryForm.PageIndex = val
getAddExamRosterListt()
}
const getAddExamRosterListt = async () => {
console.log(stateA.queryForm, ' stateA.queryForm--')
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
const res = await ApiGetAddExamRosterListt({
ExamId: multipleSelection.value[0].ExamId,
// ExamId: '048dd77b0a734856a86153e2feaa1d1d',
...stateB.queryForm
})
dialogTabular.value = true
stateB.examRosterList = res.data?.list || []
stateB.total = res.data?.total
console.log(res, 'res--ApiGetExamRosterList')
}
const addExamRoster = () => {
if (multipleSelection.value?.length === 0) return ElMessage.error('请先选择')
ApiAddExamRoster({
ExamId: multipleSelection.value[0].ExamId,
UserIdList: rosterSelection.value.map(item => item.UserId)
}).then(res => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '操作成功',
type: 'success'
})
getExamination()
getAddExamRosterListt()
dialogExamination.value = false
} else {
ElMessage.error(res?.data || '操作失敗')
}
})
}
//
const dialogToLead = ref(false)
const uploadRef = ref()
const handleExceed = (files) => {
// submitUpload(files[0])
uploadRef.value.clearFiles()
nextTick(() => {
uploadRef.value.handleStart(files[0])
})
}
const handleChange = (uploadFile) => {
console.log(uploadFile, 'uploadFile')
// submitUpload(uploadFile.raw)
}
const submitUpload = () => {
uploadRef.value.submit()
}
const toUpload = (param) => {
if (!uploadRef.value) return ElMessage.error('请先上传文件')
const formData = new FormData()
formData.append('Files', param.file)
apiUpload('', formData).then((res) => {
console.log(res, 'res--')
if (res.code === 0) {
ElMessage({
message: '上传成功',
type: 'success'
})
queryData()
} else {
ElMessage.error(res?.data || '操作失敗')
}
ElMessage({
message: '只允许上传1个文件.',
type: 'success'
})
}
@ -861,4 +743,24 @@ const toUpload = (param) => {
.ml-3{
margin-left: 20px;
}
.upload-file-uploader{
width: 50%;
}
.el-upload-list .el-upload-list__item{
width: 33% !important;
float: left;
margin-left: -385px;
margin-top: 25px;
:deep(.horizontal-list ul .el-upload-list__item) {
width: 33% !important;
float: left; margin-top: 25px;
}
:deep(.el-link__inner ) {
display: inline-flex;
justify-content: center;
align-items: center;
width: 200px;
}
}
</style>