This commit is contained in:
zhy
2025-09-30 09:55:34 +08:00
11 changed files with 1421 additions and 103 deletions

View File

@@ -129,7 +129,8 @@
<el-tab-pane label="预计离校" name="second">
数据更新时间:{{ new Date().toLocaleString() }}<el-button @click="exportWillLeave">导出</el-button>
<el-table id="willLeaveTable" v-if="lookLeaveV" :border="true" :data="willLeaveList"
:span-method="objectSpanMethod1">
:span-method="objectSpanMethod1" :show-summary="true" :summary-method="getSummaries"
sum-text="总计">
<el-table-column label="学院" align="center" prop="dept_name" width="180" />
<el-table-column label="学生数" align="center" prop="stu_num" />
<el-table-column label="详细学院" align="center" prop="more_dept_name" width="180" />
@@ -484,6 +485,43 @@ export default {
}
}
},
getSummaries(param) {
const { columns, data } = param;
const sums = [];
// 过滤掉已有的总计行(合计、里建、长堽)
const filteredData = data.filter(item =>
item.dept_name !== '合计' &&
item.dept_name !== '里建' &&
item.dept_name !== '长堽'
);
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计';
return;
}
if (index === 2) {
sums[index] = '';
return;
}
const values = filteredData.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
} else {
sums[index] = '';
}
});
return sums;
},
async listReturnRes1() {
this.returnFields = [];
this.returnLoading = true;

View File

@@ -29,6 +29,10 @@
<el-button type="success" icon="el-icon-edit" size="mini" :disabled="multiple" plain
@click="manyAudit">批量审核通过</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" icon="el-icon-close" size="mini" :disabled="multiple" plain
@click="manyReject">批量驳回</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-view" size="mini" plain @click="lookVClick">查看离校填写情况</el-button>
</el-col>
@@ -74,6 +78,7 @@
<el-option label="通过" value="2"></el-option>
<el-option label="打回" value="10"></el-option>
</el-select>
<el-button @click="saveEdit" type="primary">编辑保存</el-button>
<el-button @click="doAudit" type="success">审核</el-button>
</el-form-item>
<el-form-item label="主题">
@@ -97,42 +102,69 @@
readonly />
</el-form-item>
<el-form-item label="联系电话">
<el-input v-model="form.phone" readonly />
<el-input v-model="form.phone" />
</el-form-item>
<el-form-item label="紧急联系人">
<el-input v-model="form.emergencyContact" readonly />
<el-input v-model="form.emergencyContact" />
</el-form-item>
<el-form-item label="紧急联系人电话">
<el-input v-model="form.emergencyContactPhone" readonly />
<el-input v-model="form.emergencyContactPhone" />
</el-form-item>
<el-form-item label="家长姓名">
<el-input v-model="form.famName" readonly />
<el-input v-model="form.famName" />
</el-form-item>
<el-form-item label="家长电话">
<el-input v-model="form.famPhone" readonly />
<el-input v-model="form.famPhone" />
</el-form-item>
<el-form-item label="家长是否知晓">
<el-input v-model="form.famKnow" readonly />
<el-select v-model="form.famKnow" placeholder="请选择家长是否知晓">
<el-option label="是" value="是" />
<el-option label="否" value="否" />
</el-select>
</el-form-item>
<el-form-item label="是否离校">
<el-input :value="form.isLeave == '1' ? '是' : '否'" readonly />
</el-form-item>
<el-form-item label="预计离校时间" v-if="form.isLeave == '1'">
<el-input :value="form.willLeaveTime" readonly />
<el-date-picker
v-model="form.willLeaveTime"
type="datetime"
placeholder="选择预计离校时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="去向地" v-if="form.isLeave == '1' && !isEmpty(form.willAddr)">
<el-input :value="form.willAddr" readonly />
<el-form-item label="去向地" v-if="form.isLeave == '1'">
<el-input v-model="form.willAddr" placeholder="请输入去向地" />
</el-form-item>
<el-form-item label="预计返校时间" v-if="form.isLeave == '1'">
<el-date-picker
v-model="form.scheduledReturnTime"
type="datetime"
placeholder="选择预计返校时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="预计留校时间" v-if="form.isLeave == '0'">
<el-input :value="form.willStayTime" readonly />
<el-date-picker
v-model="form.willStayTime"
type="datetime"
placeholder="选择预计留校时间"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="留校事由" v-if="form.isLeave == '0'">
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" :value="form.stayReason"
readonly />
<el-input type="textarea" :autosize="{ minRows: 6, maxRows: 10 }" v-model="form.stayReason" />
</el-form-item>
</el-form>
@@ -155,7 +187,14 @@
<el-input v-model="lookParams.name" placeholder="请输入姓名" clearable />
</el-form-item>
<el-form-item label="班级" prop="className">
<el-input v-model="queryParams.className" placeholder="请输入班级" clearable />
<el-input v-model="lookParams.className" placeholder="请输入班级" clearable />
</el-form-item>
<el-form-item label="是否填写" prop="isFilled">
<el-select v-model="lookParams.isFilled" placeholder="请选择是否填写" clearable>
<el-option label="全部" :value="null" />
<el-option label="已填写" :value="1" />
<el-option label="未填写" :value="0" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="lookQuery">搜索</el-button>
@@ -192,7 +231,8 @@
</el-form-item>
</el-form>
数据更新时间:{{ new Date().toLocaleString() }}<el-button @click="exportWillLeave">导出</el-button>
<el-table id="willLeaveTable" v-if="willV" :border="true" :data="willList">
<el-table id="willLeaveTable" v-if="willV" :border="true" :data="willList"
:show-summary="true" :summary-method="getSummaries" sum-text="总计">
<el-table-column label="班级" align="center" prop="class_name" width="180" />
<el-table-column label="学生数" align="center" prop="stu_num" />
<el-table-column label="提交数" align="center" prop="submit_num" />
@@ -222,12 +262,14 @@
<FdyAll v-if="lookWillLeaveV" />
</el-dialog>
</div>
</template>
<script>
import { isEmpty, fullLoading } from "@/api/helpFunc";
import { listFdy as listView, leaveAudit, manyLeaveAudit, listFdyStuLeave, sendFdyStuLeaveMsg, countFdyClassWillLeave } from "@/api/survey/itinerary";
import { listFdy as listView, leaveAudit, manyLeaveAudit, manyLeaveReject, listFdyStuLeave, sendFdyStuLeaveMsg, countFdyClassWillLeave, updateItinerary } from "@/api/survey/itinerary";
import { listAllSurvey } from "@/api/survey/survey";
import XLSX from 'xlsx';
@@ -306,6 +348,8 @@ export default {
lookParams: {
pageNum: 1,
pageSize: 10,
className: null,
isFilled: null,
},
lookTotal: 0,
lookList: [],
@@ -404,6 +448,30 @@ export default {
this.willList = [...data];
}
},
getSummaries(param) {
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '总计';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
} else {
sums[index] = '';
}
});
return sums;
},
async sendMsg() {
let sdata = { ...this.lookParams };
@@ -423,6 +491,8 @@ export default {
this.$message.info("请选择去向调查");
return;
}
// 重置页码为1避免fromIndex > toIndex错误
this.lookParams.pageNum = 1;
let loading = fullLoading(this);
let res = await listFdyStuLeave(this.lookParams);
loading.close();
@@ -460,6 +530,34 @@ export default {
}
});
},
// 批量驳回
manyReject() {
let sdata = [...this.ids];
if (isEmpty(sdata)) {
this.$message.info("请选择要驳回的记录");
return;
}
this.$confirm('是否批量驳回选中的记录?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
let loading = fullLoading(this);
try {
let res = await manyLeaveReject(sdata);
loading.close();
if (res.code == 200) {
this.$message.success(res.msg);
this.getList();
} else {
this.$message.error(res.msg || '驳回失败');
}
} catch (error) {
loading.close();
this.$message.error('驳回失败:' + error.message);
}
});
},
async doAudit() {
let sdata = { ...this.auditForm };
console.log(sdata);
@@ -477,6 +575,42 @@ export default {
this.getList();
}
},
async saveEdit() {
try {
let loading = fullLoading(this);
// 准备要更新的数据
const updateData = {
returnSchoolId: this.form.returnSchoolId,
phone: this.form.phone,
emergencyContact: this.form.emergencyContact,
emergencyContactPhone: this.form.emergencyContactPhone,
famName: this.form.famName,
famPhone: this.form.famPhone,
famKnow: this.form.famKnow,
willLeaveTime: this.form.willLeaveTime,
willAddr: this.form.willAddr,
scheduledReturnTime: this.form.scheduledReturnTime,
willStayTime: this.form.willStayTime,
stayReason: this.form.stayReason
};
// 调用更新API
let res = await updateItinerary(updateData);
loading.close();
if (res.code == 200) {
this.$message.success('编辑保存成功!');
// 刷新列表数据
this.getList();
} else {
this.$message.error(res.msg || '编辑保存失败');
}
} catch (error) {
loading.close();
this.$message.error('编辑保存失败:' + error.message);
}
},
getList() {
this.loading = true;