|
|
@ -42,7 +42,21 @@ |
|
|
|
</el-icon> |
|
|
|
<span>刷新</span> |
|
|
|
</el-button> |
|
|
|
<div class="inputClass"> |
|
|
|
<el-button type="primary" @click="clearSelection"> |
|
|
|
<el-icon> |
|
|
|
<Refresh /> |
|
|
|
</el-icon> |
|
|
|
<span>清空搜索</span> |
|
|
|
</el-button> |
|
|
|
<el-tooltip effect="dark" content="设置表头" placement="top"> |
|
|
|
<el-button type="primary" @click="setHeader"> |
|
|
|
<el-icon> |
|
|
|
<Setting /> |
|
|
|
</el-icon> |
|
|
|
<span>设置表头</span> |
|
|
|
</el-button> |
|
|
|
</el-tooltip> |
|
|
|
<!-- <div class="inputClass"> |
|
|
|
<el-input v-model.trim="searchParams.name" style="max-width: 600px" placeholder="请输入姓名" clearable |
|
|
|
@clear="searchData" @keyup.enter="searchData"> |
|
|
|
<template #append> |
|
|
@ -52,15 +66,19 @@ |
|
|
|
</el-icon> |
|
|
|
</el-button> |
|
|
|
</template> |
|
|
|
</el-input> |
|
|
|
</div> |
|
|
|
</el-input> |
|
|
|
</div> --> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
<tablecomponent :tableHeader="tableHeader" :tableData="tableData" :pageSizes="pageSizes" :total="total" |
|
|
|
@selectChange="selectChange" @handleCurrentChange="handleCurrentChange" @handleSizeChange="handleSizeChange" |
|
|
|
@edit="edit" @info="info" @del="del" ref="tableComponentRef"> |
|
|
|
<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" |
|
|
|
ref="tableComponentRef" @headerSort="headerSort"> |
|
|
|
</tablecomponent> |
|
|
|
</div> |
|
|
|
<div style="text-align: center;line-height: 60px;font-size: 1.2em"> |
|
|
|
<span>守望者网络科技有限公司 Copyright@{{ dayjs().format("YYYY") }} 版权所有:北京市房山区 资深教育工作者 李竞飞</span> |
|
|
|
</div> |
|
|
|
<el-dialog v-model="dialogFrom.visible" :title="dialogFrom.title" width="80%"> |
|
|
|
<formcomponent :formHeader="dialogFrom.formHeader" :formData="dialogFrom.formData" |
|
|
|
:disabled="dialogFrom.disabled"> |
|
|
@ -72,6 +90,14 @@ |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
</el-dialog> |
|
|
|
<el-dialog v-model="setHeaderVisible" title="设置表头" width="80%"> |
|
|
|
<el-row> |
|
|
|
<el-col v-for="(item, index) in setTableHeader" :key="index" :span="8"> |
|
|
|
<el-checkbox v-model="item.setTableShow" :label="item.label1 || item.label" size="large" /> |
|
|
|
<el-checkbox v-model="item.fixed" label="固定在左侧" size="large" /> |
|
|
|
</el-col> |
|
|
|
</el-row> |
|
|
|
</el-dialog> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
@ -88,22 +114,23 @@ import { ElMessage, ElMessageBox } from 'element-plus' |
|
|
|
export default { |
|
|
|
name: 'student', |
|
|
|
components: { tablecomponent, formcomponent }, |
|
|
|
watch: {}, |
|
|
|
computed: {}, |
|
|
|
data() { |
|
|
|
return { |
|
|
|
_: _, |
|
|
|
dayjs: dayjs, |
|
|
|
tableHeader: [], |
|
|
|
setTableHeader: [], |
|
|
|
formHeader: [], |
|
|
|
exportHeader: [], |
|
|
|
tableData: [], |
|
|
|
currentPage: 1, |
|
|
|
pageSize: 12, |
|
|
|
pageSizes: [12, 50, 100, 200], |
|
|
|
pageSize: 15, |
|
|
|
pageSizes: [15, 50, 75, 100], |
|
|
|
total: 0, |
|
|
|
fileOriData: null, |
|
|
|
searchParams: { |
|
|
|
name: "" |
|
|
|
}, |
|
|
|
searchParams: {}, |
|
|
|
selectionData: [], |
|
|
|
dialogFrom: { |
|
|
|
visible: false, |
|
|
@ -112,6 +139,8 @@ export default { |
|
|
|
formHeader: [], |
|
|
|
formData: {} |
|
|
|
}, |
|
|
|
setHeaderVisible: false, |
|
|
|
sortObj: {}, |
|
|
|
} |
|
|
|
}, |
|
|
|
methods: { |
|
|
@ -145,7 +174,9 @@ export default { |
|
|
|
let dealItem = {} |
|
|
|
for (let key in element) { |
|
|
|
let headerItem = _.find(tableHeaderLocal, o => o.label === key) |
|
|
|
dealItem[headerItem.prop] = element[key] |
|
|
|
if (headerItem) { |
|
|
|
dealItem[headerItem.prop] = element[key] |
|
|
|
} |
|
|
|
} |
|
|
|
try { |
|
|
|
await myDatabase.student.add({ |
|
|
@ -184,9 +215,9 @@ export default { |
|
|
|
for (let i = 0; i < value.list.length; i++) { |
|
|
|
let item = value.list[i]; |
|
|
|
let rowValue = this.transTime(row[value.prop]) |
|
|
|
let itemValue = this.transTime(item[row.nianjicode]) |
|
|
|
if (item.gender === row.gender && this.createComparator(value.fuhao)(rowValue, itemValue)) { |
|
|
|
scoreItem = { ...item } |
|
|
|
let itemValue = this.transTime(item[`${row.nianjicode}`]) |
|
|
|
if (`${item.gender}` === `${row.gender}` && this.createComparator(value.fuhao)(rowValue, itemValue)) { |
|
|
|
scoreItem = { ...item, [`${key.slice(0, key.length - 5)}_org`]: row[value.prop] } |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
@ -195,7 +226,43 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
// todo处理总分 |
|
|
|
|
|
|
|
// G2_性别、M2_BMI得分、o2_肺活量、q2_50米、s2_坐位体前屈、u2_一分钟跳绳、w2_一分钟仰卧起坐、y2_50米X8、AA2_立定跳远、Ac2_800米跑、AE2_1000米跑、Ag2_引体向上 |
|
|
|
// 小学一、二年级总分: |
|
|
|
// =M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.3 + U2 * 0.2 |
|
|
|
// 小学三、四年级总分: |
|
|
|
// =M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.2 + U2 * 0.2 + W2 * 0.1 |
|
|
|
// 小学五、六年级总分: |
|
|
|
// =M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.1 + U2 * 0.1 + W2 * 0.2 + Y2 * 0.1 |
|
|
|
// 初中总分: |
|
|
|
// =IF(G2 = 1, M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.1 + AA2 * 0.1 + AG2 * 0.1 + AE2 * 0.2, IF(G2 = 2, M2 * 0.15 + O2 * 0.15 + Q2 * 0.2 + S2 * 0.1 + AA2 * 0.1 + W2 * 0.1 + AC2 * 0.2)) |
|
|
|
if (["11", "12"].indexOf(`${row.nianjicode}`) !== -1) { |
|
|
|
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.3 + row.jumpscore * 0.2).toFixed(2)) |
|
|
|
} else if (["13", "14"].indexOf(`${row.nianjicode}`) !== -1) { |
|
|
|
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.2 + row.jumpscore * 0.2 + row.situpscore * 0.1).toFixed(2)) |
|
|
|
} else if (["15", "16"].indexOf(`${row.nianjicode}`) !== -1) { |
|
|
|
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.1 + row.jumpscore * 0.1 + row.situpscore * 0.2 + row.fiftyeightscore * 0.1).toFixed(2)) |
|
|
|
} else if (["21", "22", "23"].indexOf(`${row.nianjicode}`) !== -1) { |
|
|
|
if (`${row.gender}` === "1") { |
|
|
|
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.1 + row.standscore * 0.1 + row.pullupscore * 0.1 + row.thousandscore * 0.2).toFixed(2)) |
|
|
|
} else if (`${row.gender}` === "2") { |
|
|
|
row["totalScore"] = Number(Number(row.BMIscore * 0.15 + row.lungsscore * 0.15 + row.fiftyscore * 0.2 + row.sitforwardscore * 0.1 + row.standscore * 0.1 + row.situpscore * 0.1 + row.eightyscore * 0.2).toFixed(2)) |
|
|
|
} |
|
|
|
} |
|
|
|
row["totalScore"] = Number(Number(row["totalScore"] + row["addScore"]).toFixed(2)) |
|
|
|
// 等级: |
|
|
|
// = IF(AH2 >= 90, "优秀", IF(AH2 >= 80, "良好", IF(AH2 >= 60, "及格", "不及格"))) |
|
|
|
let totalScoreNumber = Number(row.totalScore) |
|
|
|
if (totalScoreNumber >= 90) { |
|
|
|
row["level"] = "优秀" |
|
|
|
} else if (totalScoreNumber >= 80) { |
|
|
|
row["level"] = "良好" |
|
|
|
} else if (totalScoreNumber >= 60) { |
|
|
|
row["level"] = "及格" |
|
|
|
} else if (totalScoreNumber >= 0) { |
|
|
|
row["level"] = "不及格" |
|
|
|
} else { |
|
|
|
row["level"] = "" |
|
|
|
} |
|
|
|
return row |
|
|
|
}, |
|
|
|
transTime(value) { |
|
|
@ -241,88 +308,57 @@ export default { |
|
|
|
} |
|
|
|
}, |
|
|
|
|
|
|
|
//表格增加数据 |
|
|
|
async successSubmit11(opts) { |
|
|
|
let that = this |
|
|
|
let file = opts.file |
|
|
|
this.fileDealData = [] |
|
|
|
let fileReader = new FileReader() |
|
|
|
fileReader.onload = async function () { |
|
|
|
let data = this.result |
|
|
|
let dataObj = {} |
|
|
|
let workbook = XLSX.read(data, { type: 'binary' }) |
|
|
|
for (let i = 0; i < workbook.SheetNames.length; i++) { |
|
|
|
let sheetName = workbook.SheetNames[i]; |
|
|
|
let sheetData = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]) |
|
|
|
let sheetDataList = [] |
|
|
|
let noKey = ["prop", "fuhao"] |
|
|
|
for (let i = 0; i < sheetData.length; i++) { |
|
|
|
let element = sheetData[i]; |
|
|
|
let item = {} |
|
|
|
for (let key in element) { |
|
|
|
if (element[key] === "-Infinity") { |
|
|
|
element[key] = -100000 |
|
|
|
} else if (element[key] === "Infinity") { |
|
|
|
element[key] = 999999 |
|
|
|
} |
|
|
|
if (element[key] !== "无") { |
|
|
|
if (noKey.indexOf(key) === -1) { |
|
|
|
item[key] = element[key] |
|
|
|
} |
|
|
|
if (key === "score") { |
|
|
|
if (element[key] > 100) { |
|
|
|
item[key] = 100 |
|
|
|
item[`add_${key}`] = element[key] - 100 |
|
|
|
} |
|
|
|
} |
|
|
|
//更新数据 |
|
|
|
async updateSeach(params = {}) { |
|
|
|
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) { |
|
|
|
paramsTemp[key] = [`${value}`, Number(value)] |
|
|
|
} |
|
|
|
} |
|
|
|
let dataTemp = [] |
|
|
|
if (!_.isEmpty(paramsTemp)) { |
|
|
|
for (let i = 0; i < allStudentList.length; i++) { |
|
|
|
let element = allStudentList[i]; |
|
|
|
for (let key in paramsTemp) { |
|
|
|
if (paramsTemp[key].includes(element[key])) { |
|
|
|
dataTemp.push({ ...element }) |
|
|
|
} |
|
|
|
} |
|
|
|
sheetDataList.push(item) |
|
|
|
} |
|
|
|
dataObj[sheetName] = { |
|
|
|
prop: sheetData[0].prop, |
|
|
|
fuhao: sheetData[0].fuhao, |
|
|
|
list: sheetDataList |
|
|
|
} |
|
|
|
allStudentList = _.cloneDeep(dataTemp) |
|
|
|
} |
|
|
|
console.log(774444, dataObj) |
|
|
|
// let sheetName = workbook.SheetNames[0] |
|
|
|
// let sheetData = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1, defval: '' }) |
|
|
|
// console.log(11174444, sheetData) |
|
|
|
|
|
|
|
// let list = [] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
fileReader.onerror = function (error) { |
|
|
|
ElMessage({ |
|
|
|
message: `Error reading file:, ${error}`, |
|
|
|
type: 'error', |
|
|
|
}) |
|
|
|
if (_.get(this.sortObj, ["sort"], "")) { |
|
|
|
// 带条件排序 |
|
|
|
allStudentList = _.cloneDeep(_.orderBy(allStudentList, [this.sortObj.prop], [_.get(this.sortObj, ["sort"], "") === 1 ? 'desc' : 'asc'])) |
|
|
|
} |
|
|
|
fileReader.readAsArrayBuffer(file) |
|
|
|
}, |
|
|
|
//更新数据 |
|
|
|
async updateSeach(params = {}) { |
|
|
|
let studentList = [] |
|
|
|
let totalList = 0 |
|
|
|
if (params.name) { |
|
|
|
studentList = await myDatabase.student.where('name').anyPass(studentItem => studentItem.includes(params.name)).offset((this.currentPage - 1) * this.pageSize).limit(this.pageSize).toArray() |
|
|
|
totalList = await myDatabase.student.where('name').anyPass(studentItem => studentItem.includes(params.name)).toArray() |
|
|
|
} else { |
|
|
|
studentList = await myDatabase.student.offset((this.currentPage - 1) * this.pageSize).limit(this.pageSize).toArray() |
|
|
|
totalList = await myDatabase.student.toArray() |
|
|
|
} |
|
|
|
this.total = totalList.length |
|
|
|
this.tableData = _.cloneDeep(studentList) |
|
|
|
this.total = allStudentList.length |
|
|
|
this.tableData = allStudentList.slice((this.currentPage - 1) * this.pageSize, this.currentPage * this.pageSize) |
|
|
|
}, |
|
|
|
//搜索数据 |
|
|
|
async searchData() { |
|
|
|
let params = {} |
|
|
|
if (this.searchParams.name) { |
|
|
|
params["name"] = { $regex: `${_.trim(this.searchParams.name)}`, $options: 'i' } |
|
|
|
await this.updateSeach(this.searchParams) |
|
|
|
}, |
|
|
|
// 排序 |
|
|
|
async headerSort(headerSort) { |
|
|
|
this.sortObj = headerSort |
|
|
|
await this.updateSeach(this.searchParams) |
|
|
|
}, |
|
|
|
// 清空搜索 |
|
|
|
async clearSelection() { |
|
|
|
for (let key in this.searchParams) { |
|
|
|
this.searchParams[key] = "" |
|
|
|
} |
|
|
|
for (let i = 0; i < this.tableHeader.length; i++) { |
|
|
|
let item = this.tableHeader; |
|
|
|
item.sort = "" |
|
|
|
} |
|
|
|
await this.updateSeach(params) |
|
|
|
this.sortObj = {} |
|
|
|
await this.searchData() |
|
|
|
}, |
|
|
|
//选中数据 |
|
|
|
selectChange(selection) { |
|
|
@ -358,13 +394,13 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
let params = { |
|
|
|
...this.dialogFrom.formData, create_at: dayjs().format('YYYY-MM-DD HH:mm:ss'), update_at: dayjs().format('YYYY-MM-DD HH:mm:ss') |
|
|
|
...this.dialogFrom.formData, ...this.dealRow(this.dialogFrom.formData), create_at: dayjs().format('YYYY-MM-DD HH:mm:ss'), update_at: dayjs().format('YYYY-MM-DD HH:mm:ss') |
|
|
|
} |
|
|
|
if (this.dialogFrom.type === "put") { |
|
|
|
delete params.create_at |
|
|
|
} |
|
|
|
try { |
|
|
|
await myDatabase.student[this.dialogFrom.type]({ ...this.dialogFrom.formData, update_at: dayjs().format('YYYY-MM-DD HH:mm:ss') }) |
|
|
|
await myDatabase.student[this.dialogFrom.type]({ ...params, update_at: dayjs().format('YYYY-MM-DD HH:mm:ss') }) |
|
|
|
await this.searchData() |
|
|
|
this.cancelDialog() |
|
|
|
} catch (e) { |
|
|
@ -383,6 +419,8 @@ export default { |
|
|
|
let element = this.formHeader[i]; |
|
|
|
if (element.type === "text") { |
|
|
|
formData[element.prop] = "" |
|
|
|
} else if (element.type === "select") { |
|
|
|
formData[element.prop] = "" |
|
|
|
} else if (element.type === "date") { |
|
|
|
formData[element.prop] = dayjs().subtract(element.default || 0, 'year').format("YYYY-MM-DD") |
|
|
|
} else if (element.type === "number") { |
|
|
@ -489,9 +527,9 @@ export default { |
|
|
|
for (let i = 0; i < listCopy.length; i++) { |
|
|
|
let item = listCopy[i]; |
|
|
|
let listItem = {} |
|
|
|
for (let j = 0; j < tableHeaderLocal.length; j++) { |
|
|
|
let headerItem = tableHeaderLocal[j]; |
|
|
|
listItem[headerItem.label] = item[headerItem.prop] |
|
|
|
for (let j = 0; j < this.exportHeader.length; j++) { |
|
|
|
let headerItem = this.exportHeader[j]; |
|
|
|
listItem[headerItem.label] = item[`${headerItem.prop}_org`] || item[`${headerItem.prop}`] |
|
|
|
} |
|
|
|
lilstLocal.push(listItem) |
|
|
|
} |
|
|
@ -510,16 +548,36 @@ export default { |
|
|
|
}) |
|
|
|
} |
|
|
|
}, |
|
|
|
// 表头设置 |
|
|
|
setHeader() { |
|
|
|
this.setHeaderVisible = true |
|
|
|
} |
|
|
|
}, |
|
|
|
async mounted() { |
|
|
|
this.tableHeader = _.filter(tableHeaderLocal, o => o.tableShow) |
|
|
|
this.setTableHeader = [] |
|
|
|
if (!localStorage.getItem('setTableHeader')) { |
|
|
|
for (let i = 0; i < tableHeaderLocal.length; i++) { |
|
|
|
let headerItem = tableHeaderLocal[i]; |
|
|
|
if (headerItem.isSearch) { |
|
|
|
this.searchParams[headerItem.prop] = "" |
|
|
|
} |
|
|
|
if (headerItem.setTableShow) { |
|
|
|
this.setTableHeader.push(headerItem) |
|
|
|
} |
|
|
|
} |
|
|
|
localStorage.setItem('setTableHeader', JSON.stringify(this.setTableHeader)) |
|
|
|
} else { |
|
|
|
this.setTableHeader = JSON.parse(localStorage.getItem('setTableHeader')) |
|
|
|
} |
|
|
|
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() |
|
|
|
this.$watch("setTableHeader", (val) => { |
|
|
|
this.tableHeader = _.filter(val, o => o.setTableShow) |
|
|
|
localStorage.setItem('setTableHeader', JSON.stringify(val)) |
|
|
|
}, { deep: true }) |
|
|
|
}, |
|
|
|
|
|
|
|
watch: {}, |
|
|
|
computed: {} |
|
|
|
} |
|
|
|
</script> |
|
|
|
<style scoped> |
|
|
|