|
|
@ -3,14 +3,22 @@ |
|
|
|
<div> |
|
|
|
<el-row> |
|
|
|
<el-col v-for="(headerItem, headerIndex) in _.filter(tableHeader, item => item.isSearch)" :key="headerIndex" |
|
|
|
:span="4"> |
|
|
|
:span="headerItem.searchType === 'select' ? 5 : 4"> |
|
|
|
<div> |
|
|
|
<span>{{ headerItem.label }}:</span> |
|
|
|
<template v-if="headerItem.type === 'text'"> |
|
|
|
<template v-if="headerItem.searchType === 'select'"> |
|
|
|
<el-select v-model="searchParams[headerItem.prop]" size="large" multiple |
|
|
|
style="width: 150px;padding-right: 8px;margin:8px 0" clearable collapse-tags collapse-tags-tooltip |
|
|
|
:max-collapse-tags="1" @change="searchData()"> |
|
|
|
<el-option v-for="item in headerItem.options" :key="item.value" :label="item.label" |
|
|
|
:value="item.value" /> |
|
|
|
</el-select> |
|
|
|
</template> |
|
|
|
<template v-else-if="headerItem.type === 'text'"> |
|
|
|
<el-input v-model="searchParams[headerItem.prop]" style="width: 150px;padding-right: 8px;margin:8px 0" |
|
|
|
clearable @keyup.enter="searchData()" /> |
|
|
|
</template> |
|
|
|
<template v-if="headerItem.type === 'select'"> |
|
|
|
<template v-else-if="headerItem.type === 'select'"> |
|
|
|
<el-select v-model="searchParams[headerItem.prop]" size="large" |
|
|
|
style="width: 150px;padding-right: 8px;margin:8px 0" clearable @change="searchData()"> |
|
|
|
<el-option v-for="item in headerItem.tableDisplay" :key="item.value" :label="item.label" |
|
|
@ -25,7 +33,7 @@ |
|
|
|
</template> |
|
|
|
</div> |
|
|
|
</el-col> |
|
|
|
<el-col :span="6"> |
|
|
|
<el-col :span="3"> |
|
|
|
<el-button type="primary" @click="searchData()" size="large"> |
|
|
|
<el-icon> |
|
|
|
<Search /> |
|
|
@ -34,7 +42,6 @@ |
|
|
|
</el-button> |
|
|
|
</el-col> |
|
|
|
</el-row> |
|
|
|
|
|
|
|
<el-button type="primary" @click="addData"> |
|
|
|
<el-icon> |
|
|
|
<Plus /> |
|
|
@ -118,7 +125,9 @@ |
|
|
|
</span> |
|
|
|
<span> |
|
|
|
<el-tag size="small" style="position: relative;top: -1px;"> |
|
|
|
{{ Number(((_.filter(allData, { level: "优秀" })) / (allData.length || 1)).toFixed(2)) * 100 }}% |
|
|
|
{{ |
|
|
|
parseInt(Number(((_.filter(allData, { level: "优秀" }).length) / (allData.length || 1)).toFixed(2)) * 100) |
|
|
|
}}% |
|
|
|
</el-tag> |
|
|
|
</span> |
|
|
|
</el-descriptions-item> |
|
|
@ -128,7 +137,9 @@ |
|
|
|
</span> |
|
|
|
<span> |
|
|
|
<el-tag size="small" style="position: relative;top: -1px;"> |
|
|
|
{{ Number(((_.filter(allData, { level: "良好" })).length / (allData.length || 1)).toFixed(2)) * 100 }}% |
|
|
|
{{ |
|
|
|
parseInt(Number(((_.filter(allData, { level: "良好" })).length / (allData.length || 1)).toFixed(2)) * 100) |
|
|
|
}}% |
|
|
|
</el-tag> |
|
|
|
</span> |
|
|
|
</el-descriptions-item> |
|
|
@ -138,7 +149,9 @@ |
|
|
|
</span> |
|
|
|
<span> |
|
|
|
<el-tag size="small" style="position: relative;top: -1px;"> |
|
|
|
{{ Number(((_.filter(allData, { level: "及格" })).length / (allData.length || 1)).toFixed(2)) * 100 }}% |
|
|
|
{{ |
|
|
|
parseInt(Number(((_.filter(allData, { level: "及格" })).length / (allData.length || 1)).toFixed(2)) * 100) |
|
|
|
}}% |
|
|
|
</el-tag> |
|
|
|
</span> |
|
|
|
</el-descriptions-item> |
|
|
@ -148,13 +161,15 @@ |
|
|
|
</span> |
|
|
|
<span> |
|
|
|
<el-tag size="small" style="position: relative;top: -1px;"> |
|
|
|
{{ Number(((_.filter(allData, { level: "不及格" })).length / (allData.length || 1)).toFixed(2)) * 100 }}% |
|
|
|
{{ |
|
|
|
parseInt(Number(((_.filter(allData, { level: "不及格" })).length / (allData.length || 1)).toFixed(2)) * 100) |
|
|
|
}}% |
|
|
|
</el-tag> |
|
|
|
</span> |
|
|
|
</el-descriptions-item> |
|
|
|
</el-descriptions> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
<div v-loading="loading"> |
|
|
|
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :searchParams="searchParams" |
|
|
|
:pageSizes="pageSizes" :total="total" @selectChange="selectChange" @handleCurrentChange="handleCurrentChange" |
|
|
|
@handleSizeChange="handleSizeChange" @edit="edit" @info="info" @del="del" @searchValue="searchData" |
|
|
@ -227,6 +242,7 @@ export default { |
|
|
|
}, |
|
|
|
setHeaderVisible: false, |
|
|
|
sortObj: {}, |
|
|
|
loading: false, |
|
|
|
} |
|
|
|
}, |
|
|
|
methods: { |
|
|
@ -277,8 +293,8 @@ export default { |
|
|
|
type: 'error', |
|
|
|
}) |
|
|
|
} |
|
|
|
await that.searchData() |
|
|
|
} |
|
|
|
await that.searchData(true) |
|
|
|
} |
|
|
|
fileReader.onerror = function (error) { |
|
|
|
ElMessage({ |
|
|
@ -398,25 +414,36 @@ export default { |
|
|
|
}, |
|
|
|
|
|
|
|
//更新数据 |
|
|
|
async updateSeach(params = {}) { |
|
|
|
async updateSeach(params = {}, isAll = false) { |
|
|
|
this.loading = true |
|
|
|
let allStudentList = _.cloneDeep(await myDatabase.student.toArray()) |
|
|
|
if (!_.isEmpty(params)) { |
|
|
|
let paramsTemp = {} |
|
|
|
for (let key in params) { |
|
|
|
let value = params[key] |
|
|
|
if (["undefined", "", "null"].indexOf(`${value}`) === -1) { |
|
|
|
if (value.indexOf(",")) { |
|
|
|
paramsTemp[key] = [..._.split(value, ","), ..._.split(value, ",").map(item => Number(item))] |
|
|
|
} else { |
|
|
|
paramsTemp[key] = [`${value}`, Number(value)] |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
let dataTemp = [] |
|
|
|
if (!_.isEmpty(paramsTemp)) { |
|
|
|
for (let i = 0; i < allStudentList.length; i++) { |
|
|
|
let element = allStudentList[i]; |
|
|
|
let istrue = true |
|
|
|
for (let key in paramsTemp) { |
|
|
|
if (paramsTemp[key].includes(element[key])) { |
|
|
|
dataTemp.push({ ...element }) |
|
|
|
} else { |
|
|
|
istrue = false |
|
|
|
} |
|
|
|
} |
|
|
|
if (istrue) { |
|
|
|
dataTemp.push({ ...element }) |
|
|
|
} |
|
|
|
} |
|
|
|
allStudentList = _.cloneDeep(dataTemp) |
|
|
|
} |
|
|
@ -425,13 +452,43 @@ export default { |
|
|
|
// 带条件排序 |
|
|
|
allStudentList = _.cloneDeep(_.orderBy(allStudentList, [this.sortObj.prop], [_.get(this.sortObj, ["sort"], "") === 1 ? 'desc' : 'asc'])) |
|
|
|
} |
|
|
|
this.allData = _.cloneDeep(allStudentList) |
|
|
|
this.total = allStudentList.length |
|
|
|
this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize) |
|
|
|
let allData = _.uniqBy(allStudentList, "id") |
|
|
|
this.allData = _.cloneDeep(allData) |
|
|
|
this.total = allData.length |
|
|
|
this.tableData = allData |
|
|
|
if (isAll) { |
|
|
|
let groupObj = { |
|
|
|
nianjicodeGroupyData: _.groupBy(allStudentList, "nianjicode"), |
|
|
|
banjicodeGroupyData: _.groupBy(allStudentList, "banjicode"), |
|
|
|
levelGroupyData: _.groupBy(allStudentList, "level"), |
|
|
|
} |
|
|
|
for (let key in groupObj) { |
|
|
|
let value = groupObj[key] |
|
|
|
let findIndex = _.findIndex(this.tableHeader, { prop: `${key.slice(0, key.length - 10)}` }) |
|
|
|
let headerItem = this.tableHeader[findIndex] |
|
|
|
let keys = _.keys(value) |
|
|
|
let options = [] |
|
|
|
for (let j = 0; j < keys.length; j++) { |
|
|
|
let element = keys[j]; |
|
|
|
if ((!_.find(options, { label: element })) && element) { |
|
|
|
options.push( |
|
|
|
{ |
|
|
|
label: `${element}`, |
|
|
|
value: `${element}` |
|
|
|
} |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
headerItem["options"] = options |
|
|
|
} |
|
|
|
} |
|
|
|
this.loading = false |
|
|
|
// this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize) |
|
|
|
}, |
|
|
|
//搜索数据 |
|
|
|
async searchData() { |
|
|
|
await this.updateSeach(this.searchParams) |
|
|
|
async searchData(isAll = false) { |
|
|
|
await this.updateSeach(this.searchParams, isAll) |
|
|
|
}, |
|
|
|
// 排序 |
|
|
|
async headerSort(headerSort) { |
|
|
@ -671,7 +728,7 @@ export default { |
|
|
|
this.tableHeader = _.filter(this.setTableHeader, o => o.setTableShow) |
|
|
|
this.formHeader = _.filter(tableHeaderLocal, o => o.formShow) |
|
|
|
this.exportHeader = _.filter(tableHeaderLocal, o => o.export) |
|
|
|
await this.updateSeach() |
|
|
|
await this.updateSeach({}, true) |
|
|
|
this.$watch("setTableHeader", (val) => { |
|
|
|
this.tableHeader = _.filter(val, o => o.setTableShow) |
|
|
|
localStorage.setItem('setTableHeader', JSON.stringify(val)) |
|
|
|