From db905ecd14f63dba9337b4f4715584ef2d7e8c7e Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期五, 07 三月 2025 14:45:00 +0800 Subject: [PATCH] 修改 --- src/views/specialOperationsPay/notCoalPay/components/studentDialog.vue | 459 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 401 insertions(+), 58 deletions(-) diff --git a/src/views/specialOperationsPay/notCoalPay/components/studentDialog.vue b/src/views/specialOperationsPay/notCoalPay/components/studentDialog.vue index be72ce4..7ecbe5c 100644 --- a/src/views/specialOperationsPay/notCoalPay/components/studentDialog.vue +++ b/src/views/specialOperationsPay/notCoalPay/components/studentDialog.vue @@ -2,143 +2,484 @@ <div> <el-dialog :visible.sync="dialogVisible" width="800px" append-to-body class="stu"> <div class="infoTitle"> - <div>批次名称:XXXXX</div> - <div style="margin-left: 35px">管辖行政区划:XXXxxxx</div> + <div>批次名称:<span>{{stuInfo.batchName}}</span></div> </div> <div class="infoTitle"> - <div>考试点名称:XXXXX</div> + <div>所属区划:<span>{{stuInfo.districtName}}</span></div> </div> - <el-form :model="form" ref="ruleForm" label-width="125px"> + <div class="infoTitle"> + <div>组织架构:<span>{{stuInfo.deptName}}</span></div> + </div> + <el-form :model="stuInfo" label-width="125px"> <el-row :gutter="24"> - <el-col :span="8"> - <el-form-item label="缴费周期:" prop="timeRange"> - <span>xxxx</span> + <el-col :span="12"> + <el-form-item label="缴费周期:"> + <span><span>{{stuInfo.year}}{{stuInfo.quarter==1?' 第一季度':stuInfo.quarter==2?' 第二季度':stuInfo.quarter==3?' 第三季度':' 第四季度'}}</span></span> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="缴费类型:" prop="timeRange"> - <span>xxxx</span> + <el-form-item label="缴费类型:"> + <span>{{stuInfo.payType == 1?'初训理论':stuInfo.payType == 2?'初训实操':stuInfo.payType == 3?'初训理论与实操':stuInfo.payType == 4?'复训理论':''}}</span> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> - <el-col :span="8"> - <el-form-item label="理论类别:" prop="timeRange"> - <span>xxxx</span> + <el-col :span="12" v-if="stuInfo.payType === 1 || stuInfo.payType === 3 || stuInfo.payType === 4"> + <el-form-item label="理论类别:"> + <span>{{stuInfo.nonCoalPayCategoryList.find(i => i.categoryType == 1) && stuInfo.nonCoalPayCategoryList.find(i => i.categoryType == 1).subjectName }}</span> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="实操类别:" prop="timeRange"> - <span>xxxx</span> + <el-col :span="12" v-if="stuInfo.payType === 2 || stuInfo.payType === 3"> + <el-form-item label="实操类别:"> + <span>{{stuInfo.nonCoalPayCategoryList.find(i => i.categoryType == 2) && stuInfo.nonCoalPayCategoryList.find(i => i.categoryType == 2).subjectName }}</span> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="单人应缴:" prop="timeRange"> - <span>xxxx</span> + <span>{{stuInfo.amount}}</span> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="总计应缴费:" prop="timeRange"> - <span>xxxx</span> + <span>{{ stuInfo.totalCountFee }}元</span> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="已完成缴费:" prop="timeRange"> - <span>xxxx</span> + <span>{{stuInfo.payCountFee}}元</span> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="剩余未缴费:" prop="timeRange"> - <span>xxxx</span> + <span>{{stuInfo.unPayCountFee}}元</span> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="6"> <el-form-item label="当前总计应缴:" prop="timeRange"> - <span>xxxx人</span> + <span>{{stuInfo.totalCount}}人</span> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="已完成缴费:" prop="timeRange"> - <span>xxxx人</span> + <span>{{stuInfo.payCount}}人</span> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="当前未完成缴费:" prop="timeRange"> - <span>xxxx人</span> + <span>{{stuInfo.unPayCount}}人</span> </el-form-item> </el-col> </el-row> </el-form> <!-- 表格--> - <div style="margin: 20px 15px;display: flex"> - <el-button size="small" type="primary" @click="handleAddStu('add',{})">添加学员</el-button> - <el-button size="small" type="primary" >批量导入</el-button> + <div style="margin: 20px 15px;display: flex;justify-content: space-between"> + <div> + <el-button size="small" type="primary" @click="handleAddStu('add',{})">添加学员</el-button> + <el-button size="small" type="primary" @click="importDialog = true">批量导入</el-button> + </div> + <el-button type="text" @click="exportExcel">导出清单</el-button> </div> - <el-table v-loading="loading" :data="stuList"> + <el-table v-loading="loading" :data="stuList" id="table_excel"> <el-table-column label="序号" align="center" type="index" /> - <el-table-column label="姓名" align="center" prop="createTime" /> - <el-table-column label="身份证号" align="center" prop="batchName" /> - <el-table-column label="手机号" align="center" prop="batchName" /> - <el-table-column label="性别" align="center" prop="batchName" /> - <el-table-column label="财政缴款码" align="center" prop="batchName" /> - <el-table-column label="是否已缴" align="center" prop="batchName" /> + <el-table-column label="姓名" align="center" prop="name" /> + <el-table-column label="身份证号" align="center" prop="idCard" /> + <el-table-column label="手机号" align="center" prop="phone" /> + <el-table-column label="性别" align="center" prop="sex"> + <template #default="scope"> + {{(parseInt(scope.row.idCard.substr(16, 1))) % 2 === 0 ? "女" : "男"}} + </template> + </el-table-column> + <el-table-column label="财政缴款码" align="center" prop="payCode"> + <template #default="scope"> + {{scope.row.payCode?scope.row.payCode:'--'}} + </template> + </el-table-column> + <el-table-column label="是否已缴" align="center" prop="payStatus"> + <template #default="scope"> + <span v-if="scope.row.payStatus == 1" style="color: green">已缴</span> + <span v-else style="color: red">未缴</span> + </template> + </el-table-column> + <el-table-column label="培训机构" align="center" prop="train" /> + <el-table-column label="类别" align="center" prop="payType"> + <template #default="scope"> + {{scope.row.payType == 1?'个人':scope.row.payType == 2?'集体':''}} + </template> + </el-table-column> + <el-table-column label="操作" align="center"> + <template #default="scope"> + <el-button size="mini" type="text" v-if="scope.row.payStatus == 1" style="color: #1890ff" @click="checkTicket">查看票据</el-button> + <el-button size="mini" type="text" v-if="scope.row.payStatus == 0" style="color: #1890ff" @click="goPay(scope.row)">去缴费</el-button> + <el-button size="mini" type="text" style="color: #1890ff" v-if="!(scope.row.payCode && scope.row.payCode!=='')" @click="handleAddStu('edit',scope.row)">修改</el-button> + <el-button size="mini" type="text" style="color:lightcoral" v-if="!(scope.row.payCode && scope.row.payCode!=='')" @click="handleDelete(scope.row)">删除</el-button> + </template> + </el-table-column> </el-table> - <pagination - v-show="total>0" - :total="total" - :page.sync="queryParams.pageNum" - :limit.sync="queryParams.pageSize" - @pagination="getStuList" - /> </el-dialog> - <add-stu-dialog ref="addStuDialogRef" @getList = "getStuList"></add-stu-dialog> + <el-dialog + :title="dialogStatus==='add'?'新增':'编辑'" + :visible.sync="addDialog" + :modal-append-to-body="false" + :close-on-click-modal="false" + width="450px" + :before-close="handleClose" + > + <el-form ref="dataForm" :model="dataForm" :rules="addRules" label-position="right" label-width="150px" style="padding-right: 50px" element-loading-text="保存中..."> + <el-form-item label="姓名:" prop="name"> + <el-input v-model.trim="dataForm.name"/> + </el-form-item> + <el-form-item label="性别:" prop="sex"> + <el-radio-group v-model="dataForm.sex"> + <el-radio :label="0">男</el-radio> + <el-radio :label="1">女</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="培训机构:"> + <el-input v-model.trim="dataForm.train"/> + </el-form-item> + <el-form-item label="身份证号:" prop="idCard"> + <el-input v-model.trim="dataForm.idCard"/> + </el-form-item> + <el-form-item label="手机号:" prop="phone"> + <el-input v-model.trim="dataForm.phone"/> + </el-form-item> + </el-form> + <el-alert + :closable="false" + title="提示:请务必填写准确,将用于个人缴费查询。" + type="warning"> + </el-alert> + <span slot="footer" class="dialog-footer"> + <el-button @click="handleClose">取 消</el-button> + <el-button type="primary" @click="onSubmit">确 定</el-button> + </span> + </el-dialog> + <el-dialog + :visible.sync="importDialog" + append-to-body + title="批量导入" + :close-on-click-modal="false" + > + <el-form + ref="importForm" + label-position="right" + label-width="120px" + style="margin-left:50px;width:500px;" + element-loading-text="导入中..." + > + <el-form-item label="导入文件:"> + <el-upload + :action="uploadUrl" + :on-error="onError" + :on-success="onSuccess" + :auto-upload="false" + accept=".xlsx,.xls" + :on-preview="handlePreview" + :on-remove="handleRemove" + :before-remove="beforeRemove" + :before-upload="picSize" + ref="upload" + :limit="1" + :data={nonCoalPayId:id} + :headers="header" + :on-exceed="handleExceed" + :file-list="fileList"> + <el-button size="small" type="primary">点击上传</el-button> + <div slot="tip" class="el-upload__tip">只能上传excel(.xlsx、.xls后缀)文件,且不超过2M</div> + </el-upload> + </el-form-item> + <el-form-item label="excel参考模板:"> + <el-button type="text" @click="viewHandle">下载模板</el-button> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button @click="importDialog = false">取消</el-button> + <el-button type="primary" @click="importHandle()">导入</el-button> + </div> + </el-dialog> </div> </template> <script> -import addStuDialog from './addStuDialog.vue' + +import {verifyIdCard, verifySimplePhone} from "@/utils/validate" +import * as XLSX from 'xlsx'; +import { saveAs } from 'file-saver'; +import { + addNonCoalStu, delNonCalStu, delNonCoalPay, + editNonCoalStu, + getNonCoalPayStudents, + getPayTypeInfo, nonCoalPersonPay +} from "@/api/specialOperationsPay/notCoalPay"; +import exampleFile from '@/assets/studentInfo.xlsx' +import {getToken} from "@/utils/auth"; +import {coalPersonPay} from "@/api/specialOperationsPay/coalPay"; export default { name: 'addStu', - components: { - addStuDialog - }, + components: {}, data() { + let validatePhone = (rule, value, callback)=>{ + if(value === ''){ + callback(new Error('请输入手机号')) + }else{ + if(!verifySimplePhone(value)){ + callback(new Error('手机号格式有误')) + }else{ + callback() + } + } + } + let verifyId = (rule, value, callback)=>{ + if(value === ''){ + callback(new Error('请输入身份证号')) + }else{ + if(!verifyIdCard(value)){ + callback(new Error('身份证号格式有误')) + }else{ + callback() + } + } + } return { open: false, id: null, dialogVisible: false, + importDialog: false, loading: false, + stuInfo: {}, stuList: [], - form: { - id: null, - staffId: null, - timeRange: [], - startTime: '', - endTime: '', - unit: '' + fileList: [], + uploadUrl: process.env.VUE_APP_BASE_API + '/pay/nonCoalPay/stuImportData', + header: { + Authorization: "Bearer " + getToken() }, total: 0, queryParams: { pageNum: 1, pageSize: 10, }, + addDialog: false, + dialogStatus: '', + dataForm: {}, + addRules: { + name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], + idCard: [{ required: true, validator: verifyId, trigger: 'blur' }], + phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], + sex: [{ required: true, message: '请选择性别', trigger: 'blur' }] + } }; }, methods: { - openDialog(val) { + exportExcel() { + var xlsxParam = { raw: true } + let tables = document.getElementById('table_excel') + let clonedTable = tables.cloneNode(true); // 深度克隆 + // 删除克隆表格中的最后一列 + const allRows = clonedTable.querySelectorAll('tr'); + allRows.forEach((row,index) => { + const cells = row.querySelectorAll('th,td'); + if (cells.length > 0) { + if(index == 0){ + row.removeChild(cells[cells.length - 2]); // 表头行要特殊处理 + }else{ + row.removeChild(cells[cells.length - 1]); // 移除最后一个单元格 + } + } + }) + let table_book = this.$XLSX.utils.table_to_book(clonedTable, xlsxParam); + const table_write = this.$XLSX.write(table_book, { + bookType: 'xlsx', + bookSST: true, + type: 'array' + }); + try { + this.$FileSaver.saveAs( + new Blob([table_write], { type: 'application/octet-stream' }), + `${this.stuInfo.batchName}批次学员缴费清单.xlsx` + ); + } catch (e) { + if (typeof console !== 'undefined') console.log(e, table_write); + } + return table_write + }, + openDialog(id) { + this.getStuList(id) + this.id = id this.dialogVisible = true; }, - getStuList () { - + getStuList(id) { + getNonCoalPayStudents(id).then(res=>{ + if(res.code == 200){ + this.stuInfo = res.data + this.stuList = res.data.nonCoalPayStudentList + } + }) }, handleAddStu(type,data){ - this.$refs.addStuDialogRef.openDialog(type, data); - } + this.addDialog = true + this.resetDataForm() + if(type == 'add'){ + this.dataForm.nonCoalPayId = this.id + }else{ + const {id,nonCoalPayId,name,idCard,sex,phone} = data + this.dataForm = {id,nonCoalPayId,name,idCard,sex,phone} + } + this.dialogStatus = type + }, + + viewHandle() { + const link = document.createElement('a') + link.href = exampleFile + link.target = '_blank' + link.download = '学员批量导入模版.xlsx' + link.click() + }, + + handleRemove(file, fileList) { + console.log(file, fileList); + }, + handlePreview(file) { + console.log(file); + }, + handleExceed(files, fileList) { + this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`); + }, + picSize(rawFile){ + if(rawFile.size / 1024 / 1024 > 2){ + this.$message({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } + }, + async importHandle(){ + const t = this + await t.$refs.upload.submit() + t.importDialog = false + setTimeout(()=>{ + t.getStuList(this.stuInfo.id) + t.fileList = [] + t.$refs.upload.clearFiles() + },800) + }, + + onError(){ + console.log("文件上传失败") + }, + + onSuccess(res, file, fileList){ + if(res.code == 200){ + this.$message({ + type:'success', + message: res.msg + }) + }else{ + this.$message({ + type:'warning', + message: res.msg + }) + } + }, + + beforeRemove(file, fileList) { + return this.$confirm(`确定移除 ${ file.name }?`); + }, + + handleClose() { + this.addDialog = false + }, + onSubmit() { + this.$refs["dataForm"].validate( async valid => { + if (valid) { + if(this.dialogStatus == 'add'){ + const res = await addNonCoalStu(this.dataForm) + if(res.code == 200) { + this.getStuList(this.id) + this.addDialog = false + this.$message({ + type:'success', + message: '新增成功' + }) + }else{ + this.$message({ + type:'warning', + message: res.msg + }) + } + }else { + const res = await editNonCoalStu(this.dataForm) + if(res.code == 200) { + this.getStuList(this.id) + this.addDialog = false + this.$message({ + type:'success', + message: '修改成功' + }) + }else{ + this.$message({ + type:'warning', + message: res.msg + }) + } + } + } + }) + }, + checkTicket(){ + window.open('http://finpt.xjcz.gov.cn/fs-public/index.do') + }, + async goPay(item){ + if(item.payCode && item.payCode !== ''){ + window.open(`http://finpt.xjcz.gov.cn/fs-public/billQuery/findByOrderId.do?orderId=${item.orderId}&deviceType=1`) + }else{ + const query = { + id: item.id, + payType: 1 + } + const res = await nonCoalPersonPay(query) + if(res.code == 200) { + window.open(`http://finpt.xjcz.gov.cn/fs-public/billQuery/findByOrderId.do?orderId=${res.msg}&deviceType=1`) + }else{ + this.$message({ + type:'warning', + message: res.msg + }) + } + } + }, + handleDelete(row){ + this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then(async () => { + const res = await delNonCalStu(row.id) + if(res.code == 200){ + this.$message({ + type: 'success', + message: '删除成功!' + }); + await this.getStuList(this.id) + }else{ + this.$message({ + type: 'warning', + message: res.msg + }); + } + }).catch(() => { + + }); + }, + resetDataForm() { + this.dataForm = { + } + }, } } @@ -153,8 +494,10 @@ margin-bottom:10px; margin-left: 40px; display: flex; - font-weight: 800; - font-size: 16px + font-size: 16px; + span{ + font-weight: bolder; + } } } -- Gitblit v1.9.2