2025-06-11 17:46:57 +08:00

568 lines
18 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

const app = new Vue({
el: '#app',
data() {
return {
jsString: '',
result: {
column: [],
filter: [],
data: [],
},
excelRawList: [],
activeName: '历年分数',
isIndeterminate1: false,
isIndeterminate2: false,
checkAll1: true,
checkAll2: false,
fileTemp: null,
form: {
column: [],
filter: [],
},
columns: [],
historyColumns: [
{ label: '年份', value: '年份' },
{ label: '省份', value: '省份' },
{ label: '层次', value: '层次' },
{ label: '招生类型', value: '招生类型' },
{ label: '科类', value: '科类' },
{ label: '批次', value: '批次' },
{ label: '专业名称', value: '专业名称' },
{ label: '最低分', value: '最低分' },
{ label: '最低分位次', value: '最低分位次' },
{ label: '最高分', value: '最高分' },
{ label: '最高分位次', value: '最高分位次' },
{ label: '平均分', value: '平均分' },
{ label: '省控线', value: '省控线' },
{ label: '人数', value: '人数' },
{ label: '专业组', value: '专业组' },
],
enrollmentColumns: [
{ label: '年份', value: '年份' },
{ label: '省份', value: '省份' },
{ label: '层次', value: '层次' },
{ label: '科类', value: '科类' },
{ label: '批次', value: '批次' },
{ label: '专业名称', value: '专业名称' },
{ label: '专业类别', value: '专业类别' },
{ label: '计划性质', value: '计划性质' },
{ label: '计划类别', value: '计划类别' },
{ label: '计划数', value: '计划数' },
{ label: '专业代码', value: '专业代码' },
{ label: '专业代号', value: '专业代号' },
{ label: '招考方向', value: '招考方向' },
{ label: '学制代码', value: '学制代码' },
{ label: '收费标准', value: '收费标准' },
{ label: '院系部门名称', value: '院系部门名称' },
{ label: '办学地点', value: '办学地点' },
{ label: '专业备注', value: '专业备注' },
{ label: '招考类型名称', value: '招考类型名称' },
{ label: '专业组', value: '专业组' },
{ label: '备注', value: '备注' },
],
filters: [],
historyFilters: [
{ label: '年份', value: '年份' },
{ label: '省份', value: '省份' },
{ label: '层次', value: '层次' },
{ label: '招生类型', value: '招生类型' },
{ label: '科类', value: '科类' },
{ label: '批次', value: '批次' },
],
enrollmentFilters: [
{ label: '年份', value: '年份' },
{ label: '省份', value: '省份' },
{ label: '层次', value: '层次' },
{ label: '科类', value: '科类' },
{ label: '批次', value: '批次' },
{ label: '专业类别', value: '专业类别' },
{ label: '计划性质', value: '计划性质' },
{ label: '计划类别', value: '计划类别' },
],
// 考生分数列
candidateScoreColumns: [
{ label: '年份', value: '年份' },
{ label: '姓名', value: '姓名' },
{ label: '考生号', value: '考生号' },
{ label: '录取批次', value: '录取批次' },
{ label: '录取专业', value: '录取专业' },
{ label: '快递单号', value: '快递单号' },
],
candidateScoreFilters: [],
}
},
computed: {
excelRawString() {
return JSON.stringify(this.excelRawList)
},
},
watch: {
'form.column': {
handler(newVal) {
if (this.activeName === '历年分数') {
if (!newVal.length) {
this.isIndeterminate1 = false
this.checkAll1 = false
} else if (newVal.length === this.historyColumns.length) {
this.isIndeterminate1 = false
this.checkAll1 = true
} else {
this.isIndeterminate1 = true
this.checkAll1 = false
}
} else if (this.activeName === '招生计划'){
// 招生计划
if (!newVal.length) {
this.isIndeterminate1 = false
this.checkAll1 = false
} else if (newVal.length === this.enrollmentColumns.length) {
this.isIndeterminate1 = false
this.checkAll1 = true
} else {
this.isIndeterminate1 = true
this.checkAll1 = false
}
}else{
if (!newVal.length) {
this.isIndeterminate1 = false
this.checkAll1 = false
} else if (newVal.length === this.candidateScoreColumns.length) {
this.isIndeterminate1 = false
this.checkAll1 = true
} else {
this.isIndeterminate1 = true
this.checkAll1 = false
}
}
this.updateAll()
},
deep: true,
immediate: true,
},
'form.filter': {
handler(newVal) {
if (this.activeName === '历年分数') {
if (!newVal.length) {
this.isIndeterminate2 = false
this.checkAll2 = false
} else if (newVal.length === this.historyFilters.length) {
this.isIndeterminate2 = false
this.checkAll2 = true
} else {
this.isIndeterminate2 = true
this.checkAll2 = false
}
} else if (this.activeName === '招生计划'){
// 招生计划
if (!newVal.length) {
this.isIndeterminate2 = false
this.checkAll2 = false
} else if (newVal.length === this.enrollmentFilters.length) {
this.isIndeterminate2 = false
this.checkAll2 = true
} else {
this.isIndeterminate2 = true
this.checkAll2 = false
}
}
this.updateAll()
},
deep: true,
immediate: true,
},
},
mounted() {
if (this.activeName === '历年分数') {
this.columns = [...this.historyColumns]
this.filters = [...this.historyFilters]
setTimeout(() => {
// this.handleCheckAllChange1(true)
this.handleTab({name:'历年分数'})
}, 300)
}
},
methods: {
clearAll() {
this.form.filter = []
this.checkAll1 = false
this.form.column = []
this.checkAll2 = false
},
updateAll() {
// form.column
console.log('this.form.column: ', this.form.column);
this.result.column = [...this.form.column]
this.form.filter.forEach((item) => {
if (!this.form.column.includes(item)) {
this.form.filter = this.form.filter.filter((i) => item !== i)
}
})
// form.filter
let data = [...this.result.data]
let data1 = this.form.filter.map((item) => {
const newItem = {}
newItem[item] = []
return newItem
})
for (const iterator of data1) {
let key = Object.keys(iterator)[0]
for (const dataItem of data) {
iterator[key].push(dataItem[key])
}
iterator[key] = [...new Set(iterator[key])]
iterator[key].sort((a, b) => a - b)
}
this.result.filter = data1
// updateData
this.updateData()
// createJsString()
this.createJsString()
},
createJsString() {
this.jsString = `var columnList = ${JSON.stringify(this.result.column)};
var filterList = ${JSON.stringify(this.result.filter)};
var dataList = ${JSON.stringify(this.result.data)};`
},
updateData() {
// console.log(this.form,'====', this.excelRawList);
let temp = this.excelRawList.map((item) => {
const newItem = {}
for (const iterator of this.form.column) {
newItem[iterator] = item[iterator]
}
return newItem
})
if (temp[0] && Object.keys(temp[0]).length) this.result.data = [...temp]
else this.result.data = []
},
download() {
console.log(this.activeName)
let blob = new Blob([this.jsString], { type: 'text/javascript' })
let objectURL = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = objectURL
if (this.activeName == '招生计划') {
link.download = 'shaixuanandcolumn-jihua.js'
} else if (this.activeName == '历年分数') {
link.download = 'shaixuanandcolumn-fenshu.js'
} else {
link.download = 'shaixuanandcolumn-luqu.js'
}
// link.click()
let fileName = '';
if (this.activeName === '招生计划') {
fileName = 'shaixuanandcolumn-jihua.js';
} else if (this.activeName === '历年分数') {
fileName = 'shaixuanandcolumn-fenshu.js';
} else {
fileName = 'shaixuanandcolumn-luqu.js';
}
const payload = {
fileName,
content: this.jsString,
};
// 使用 fetch 或 axios 发送请求
fetch('/api/files/save', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(payload),
})
.then((response) => response.text())
.then((result) => {
console.log(result); // 显示服务器返回的结果
this.$message({
type: 'success',
message: '保存成功!',
})
})
.catch((error) => {
this.$message({
type: 'error',
message: '保存失败!',
})
});
const payload2 = {
fileName:`json-${fileName}`,
content: JSON.stringify({
columnList:this.form.column,
filterList:this.form.filter,
dataList:this.result.data,
}),
};
// 使用 fetch 或 axios 发送请求
fetch('/api/files/save', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(payload2),
})
.then((response) => response.text())
.then((result) => {
console.log(result); // 显示服务器返回的结果
})
.catch((error) => {
});
},
downloadTemplate() {
const link = document.createElement('a')
if (this.activeName == '招生计划') {
link.href = '/resource/tools/file/enrollment-plan.xlsx'
link.download = '招生计划.xlsx'
} else if (this.activeName == '历年分数') {
link.href = '/resource/tools/file/score-history.xlsx'
link.download = '历年分数.xlsx'
}else{
link.href = '/resource/tools/file/candidate-score.xlsx'
link.download = '考生分数.xlsx'
}
link.click()
},
copy() {
navigator.clipboard.writeText(this.jsString)
this.$message({
type: 'success',
message: '复制成功!',
})
},
//上传文件时处理方法
handleChange(file, fileList) {
this.fileTemp = file.raw
if (this.fileTemp) {
if (this.fileTemp.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || this.fileTemp.type == 'application/vnd.ms-excel') {
this.importfxx(this.fileTemp)
} else {
this.$message({
type: 'warning',
message: '附件格式错误,请删除后重新上传!',
})
}
} else {
this.$message({
type: 'warning',
message: '请上传附件!',
})
}
},
//超出最大上传文件数量时的处理方法
handleExceed() {
this.$message({
type: 'warning',
message: '超出最大上传文件数量的限制!',
})
return
},
//移除文件的操作方法
handleRemove(file, fileList) {
this.fileTemp = null
},
handleTemplate() {
window.open('/documents/历年分数导入模板.xlsx')
},
importfxx(obj) {
let _this = this
let inputDOM = this.$refs.inputer
// 通过DOM取文件数据
this.file = event.currentTarget.files[0]
var rABS = false //是否将文件读取为二进制字符串
var f = this.file
var reader = new FileReader()
//if (!FileReader.prototype.readAsBinaryString) {
FileReader.prototype.readAsBinaryString = function (f) {
var binary = ''
var rABS = false //是否将文件读取为二进制字符串
var pt = this
var wb //读取完成的数据
var outdata
var reader = new FileReader()
reader.onload = function (e) {
var bytes = new Uint8Array(reader.result)
var length = bytes.byteLength
for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i])
}
//此处引入用于解析excel
// var XLSX = require("xlsx");
if (rABS) {
wb = XLSX.read(btoa(fixdata(binary)), {
//手动转化
type: 'base64',
})
} else {
wb = XLSX.read(binary, {
type: 'binary',
})
}
outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]])
console.log('outdata: ', outdata)
// let outdata1 = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[1]])
// let outdata2 = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[2]])
// console.log(outdata, outdata1, outdata2);
// console.log(outdata, JSON.stringify(outdata));
_this.excelRawList = JSON.parse(JSON.stringify(outdata))
_this.result.data = [...outdata]
console.log('_this.result.data: ', _this.result.data)
_this.updateAll()
_this.$message({
type: 'success',
message: '解析成功!',
})
}
reader.readAsArrayBuffer(f)
}
if (rABS) {
reader.readAsArrayBuffer(f)
} else {
reader.readAsBinaryString(f)
}
},
handleCheckAllChange1(value) {
console.log('value: ', value,this.activeName);
this.isIndeterminate1 = false
const result = []
if (value) {
if (this.activeName === '历年分数') {
this.historyColumns.forEach((item) => {
result.push(item.value)
})
} else if (this.activeName === '招生计划') {
this.enrollmentColumns.forEach((item) => {
result.push(item.value)
})
} else {
this.candidateScoreColumns.forEach((item) => {
result.push(item.value)
})
}
}
console.log('result: ', JSON.stringify(result));
this.form.column = result
},
handleCheckAllChange2(value) {
this.isIndeterminate1 = false
const result = []
if (value) {
if (this.activeName === '历年分数') {
this.historyFilters.forEach((item) => {
if (this.form.column.includes(item.value)) result.push(item.value)
})
} else if (this.activeName === '招生计划') {
this.enrollmentFilters.forEach((item) => {
if (this.form.column.includes(item.value)) result.push(item.value)
})
} else {
this.candidateScoreFilters.forEach((item) => {
if (this.form.column.includes(item.value)) result.push(item.value)
})
}
}
this.form.filter = result
},
change1(value) {
// console.log(this.form);
},
loadScript(src) {
return new Promise((resolve, reject) => {
fetch(src)
.then((response) => {
if (!response.ok) {
return reject(new Error(`Failed to load script: ${src}`));
}
return response.text(); // 获取脚本内容
})
.then((scriptContent) => resolve(scriptContent))
.catch((err) => reject(err));
});
},
exportExcel(){
const ws = XLSX.utils.json_to_sheet(this.result.data); // 将数据转换为工作表
const wb = XLSX.utils.book_new(); // 创建新的工作簿
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); // 将工作表添加到工作簿
XLSX.writeFile(wb, `${this.activeName}.xlsx`); // 导出为 Excel 文件
},
handleTab({ name }) {
this.clearAll()
window.columnList=[];
window.filterList=[]
if (name === '历年分数') {
this.columns = [...this.historyColumns]
this.filters = [...this.historyFilters]
//
} else if (name === '招生计划') {
this.columns = [...this.enrollmentColumns]
this.filters = [...this.enrollmentFilters]
} else {
this.columns = [...this.candidateScoreColumns]
this.filters = [...this.candidateScoreFilters]
}
let origin = location.origin
// 定义加载文件路径
let scriptPath = '';
if (name === '历年分数') {
scriptPath = origin+'/resources/templates/default_v2/web/json-shaixuanandcolumn-fenshu.js';
} else if (name === '招生计划') {
scriptPath = origin+'/resources/templates/default_v2/web/json-shaixuanandcolumn-jihua.js';
} else {
scriptPath = origin+'/resources/templates/default_v2/web/json-shaixuanandcolumn-luqu.js';
}
this.result.data = []
this.excelRawList= []
this.form.column = []
this.form.filter = []
// 动态加载新脚本
this.loadScript(scriptPath)
.then((scriptContent) => {
console.log(scriptContent)
try {
let res = JSON.parse(scriptContent)
// 使用动态加载的变量更新 columns 和 filters
this.result.data = [...(res.dataList || [])];
this.excelRawList= [...(res.dataList || [])];
this.form.column = [...(res.columnList || [])];
this.form.filter = [...(res.filterList || [])];
} catch (error) {
}
})
.catch((err) => {
console.error(`加载脚本失败: ${err}`);
setTimeout(() => {
this.handleCheckAllChange1(true);
}, 300);
});
// setTimeout(() => {
// this.handleCheckAllChange1(true)
// }, 300)
},
},
})