From e7dd0a57b345c2a9b1d988a4bfe68eee8e5e48b7 Mon Sep 17 00:00:00 2001 From: Your Name <123456> Date: 星期三, 11 五月 2022 13:38:32 +0800 Subject: [PATCH] excel --- config/dev.env.js | 9 src/views/specialWorkManage/specialWork/taskCreate/components/taskBasic/index.vue | 40 +++++- src/views/contractor/userManage/components/workLicense/index.vue | 30 +++- src/views/specialWorkManage/specialWork/taskCreate/index.vue | 2 src/views/contractor/userManage/index.vue | 262 ++++++++++++++++++++++++++++++++++++++++--- src/assets/example/user.xlsx | 0 6 files changed, 303 insertions(+), 40 deletions(-) diff --git a/config/dev.env.js b/config/dev.env.js index d475b72..567caf5 100644 --- a/config/dev.env.js +++ b/config/dev.env.js @@ -17,12 +17,13 @@ // BASE_API: '"http://220.171.99.118:4100"', // IMG_API: '"http://220.171.99.118:4100/upload/"', // BASE_API: '"http://192.168.0.35:8006"', - // IMG_API: '"http://192.168.0.35:8006/upload/"', + // // IMG_API: '"http://192.168.0.35:8006/upload/"', BASE_API: '"http://192.168.0.35:8006"', IMG_API: '"http://192.168.0.35:8006/upload/"', - - // BASE_API: '"http://222.92.213.21:8006/zhongtai"', - // IMG_API: '"http://222.92.213.21:8006/zhongtai/upload/"', + // BASE_API: '"http://192.168.0.62:8006"', + // IMG_API: '"http://192.168.0.62:8006/upload/"', + // BASE_API: '"http://222.92.213.22:8006/zhongtai"', + // IMG_API: '"http://222.92.213.22:8006/zhongtai/upload/"', NANO_API: '"http://127.0.0.1:8081/zhongtaiexam"', // BASE_API: '"http://220.171.99.118:4101/api"', // IMG_API: '"http://220.171.99.118:4101/api/upload/"', diff --git a/src/assets/example/user.xlsx b/src/assets/example/user.xlsx index 7d377ba..1690bfe 100644 --- a/src/assets/example/user.xlsx +++ b/src/assets/example/user.xlsx Binary files differ diff --git a/src/views/contractor/userManage/components/workLicense/index.vue b/src/views/contractor/userManage/components/workLicense/index.vue index 2a8acb9..3da573b 100644 --- a/src/views/contractor/userManage/components/workLicense/index.vue +++ b/src/views/contractor/userManage/components/workLicense/index.vue @@ -61,17 +61,29 @@ <el-input v-model.trim="licenseForm.idcard" :disabled="true"/> </el-form-item> <el-form-item label="特种作业工种:" prop="branch"> - <el-select v-model.trim="licenseForm.branch"/> + <el-select v-model.trim="licenseForm.branch"> <el-option - v-for="item in branchList" - :key="item.id" - :label="item.name" - :value="item.name" + v-for="item in branchList" + :key="item.id" + :label="item.name" + :value="item.name" > </el-option> + </el-select> </el-form-item> <el-form-item label="特种作业证件号:" prop="certname"> <el-input v-model.trim="licenseForm.certname"/> + </el-form-item> + <el-form-item label="受否人员安全健康证:" prop="ishealth"> + <el-select v-model.trim="licenseForm.ishealth"> + <el-option + v-for="item in isHealthList" + :key="item.id" + :value="item.id" + :label="item.name" + > + </el-option> + </el-select> </el-form-item> <el-form-item label="有效期开始时间:" prop="starttime"> <el-date-picker @@ -102,9 +114,8 @@ </template> <script> -import { addWorkLicense, deleteWorkLicense, getWorkLicenseList, updateWorkLicense } from '../../../../../api/user' -import { parseError } from '../../../../../utils/messageDialog' -import { deleteUnit } from '../../../../../api/unitManage' +import { addWorkLicense, deleteWorkLicense, getWorkLicenseList, updateWorkLicense } from '@/api/user' +import { parseError } from '@/utils/messageDialog' export default { name: 'index', @@ -116,6 +127,7 @@ mobile:'', listLoading:false, workLicenseData:[], + isHealthList:[{id:1,name:'是'},{id:0,name:'否'},], branchList:[{id:1,name:'电工作业'},{id:2,name:'焊接与热切割作业'},{id:3,name:'高处作业'},{id:4,name:'制冷与空调作业'},{id:5,name:'煤矿安全作业'},{id:6,name:'压力容器作业'},{id:7,name:'采掘(剥)作业'},{id:8,name:'矿山提升运输作业'},{id:9,name:'矿山安全检查作业'},{id:10,name:'矿山通风作业'},{id:11,name:'矿山排水作业'},], workLicenseDialog:false, LicenseFormDialog:false, @@ -128,6 +140,7 @@ starttime:'', endtime:'', branch:'', + ishealth:0, }, licenseRules:{ @@ -161,6 +174,7 @@ this.licenseForm.starttime = '' this.licenseForm.endtime = '' this.licenseForm.branch = '' + this.licenseForm.ishealth = 0 this.title = '新增' }else{ this.title = '编辑' diff --git a/src/views/contractor/userManage/index.vue b/src/views/contractor/userManage/index.vue index e13e152..a919a0b 100644 --- a/src/views/contractor/userManage/index.vue +++ b/src/views/contractor/userManage/index.vue @@ -1,10 +1,19 @@ <template> <div class="app-container"> - <div> + <div class="filter-container"> <el-form :inline="true" :model="queryForm"> <el-form-item label="用户名"> <el-input v-model="queryForm.username" + class="filter-item" + placeholder="" + style="width: 150px;" + @keyup.enter.native="queryHandle" + /> + </el-form-item> + <el-form-item label="真实姓名"> + <el-input + v-model="queryForm.realname" class="filter-item" placeholder="" style="width: 150px;" @@ -67,6 +76,17 @@ icon="el-icon-upload2" @click="showImportHandle" >导入</el-button> + </el-form-item> + <el-form-item> + <el-button + v-if="getBtnPermission('export')" + v-show="userType != 3" + class="filter-item" + style="margin-left: 10px;" + type="primary" + icon="el-icon-upload2" + @click="showExportHandle" + >导出</el-button> </el-form-item> </el-form> </div> @@ -155,6 +175,11 @@ <span>{{ scope.row.idcard }}</span> </template> </el-table-column> + <el-table-column label="单位" prop="company" align="center" sortable="custom" width="100px"> + <template slot-scope="scope"> + <span>{{ scope.row.company }}</span> + </template> + </el-table-column> <el-table-column label="部门" prop="department" align="center" sortable="custom" width="100px"> <template slot-scope="scope"> <span>{{ scope.row.department }}</span> @@ -175,10 +200,14 @@ <span>{{ scope.row.roles | parseRoles }}</span> </template> </el-table-column> - - <el-table-column label="人脸数据" prop="code" align="center" width="100px"> + <!-- <el-table-column label="人员MAC地址" prop="deviceNo" align="center" width="100px"> <template slot-scope="scope"> - <span>{{ scope.row.code == null || scope.row.code === '' ?"":"已采集" }}</span> + <span>{{ scope.row.deviceNo}}</span> + </template> + </el-table-column> + <el-table-column label="人脸数据" prop="role" align="center" width="100px"> + <template slot-scope="scope"> + <span>{{ scope.row.code == null || scope.row.code === '' ?"":"已采集" }}</span> </template> </el-table-column> <el-table-column label="是否通过考试" prop="ispass" align="center" width="100px"> @@ -197,7 +226,7 @@ <span>{{ scope.row.endtime}}</span> </template> - </el-table-column> + </el-table-column> --> <el-table-column label="是否单位负责人" prop="iscompany" align="center" width="100px"> <template slot-scope="scope"> <div v-for="item in isList"> @@ -221,6 +250,7 @@ <span>{{ scope.row.status | parseStatus }}</span> </template> </el-table-column> + <!-- <el-table-column label="更新时间" prop="lastmodifieddate" align="center" sortable="custom">--> <!-- <template slot-scope="scope">--> <!-- <span>{{ scope.row.lastmodifieddate | parseTime('{y}-{m}-{d}') }}</span>--> @@ -229,8 +259,11 @@ <el-table-column label="操作" align="center" width="250" class-name="small-padding fixed-width" fixed="right"> <template slot-scope="scope"> <el-button type="text" @click="showEditHandle(scope.row)">编辑</el-button> + <el-button v-show="userType != 3" :disabled="disableRole(scope.row)" type="text" align="center" @click="showAssignRole(scope.row)">分配角色</el-button> <el-button type="text" @click="showWorkLicense(scope.row)">查看工作证</el-button> <el-button v-show="userType != 3" :disabled="scope.row.type==1" type="text" style="color:red;" @click="deleteHandle(scope.row)">删除</el-button> + <el-button v-if="scope.row.cardId === ''" v-show="userType !== 3" :disabled="scope.row.type===1" type="text" @click="bindCardHandle(scope.row)">绑定人员卡</el-button> + <el-button v-else v-show="userType !== 3" :disabled="scope.row.type===1" type="text" style="color:red;" @click="setInvalidDel(scope.row)">删除人员卡</el-button> </template> </el-table-column> </el-table> @@ -315,11 +348,11 @@ <el-row> <el-col :span="12"> <el-form-item label="单位:" prop="company"> - <el-select v-model.trim="dataForm.company" auto-complete="on" style="width:100%;"> + <el-select v-model.trim="dataForm.company" value-key="item" auto-complete="on" style="width:100%;" @change="companyChange"> <el-option v-for="item in companyList" :key="item.id" - :value="item.company" + :value="item" :label="item.company" > </el-option> @@ -327,7 +360,7 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="部门:" prop="department"> + <el-form-item label="部门:" prop="department" v-if="isMain"> <el-select v-model.trim="dataForm.department" auto-complete="on" style="width:100%;"> <el-option v-for="item in departmentList" @@ -404,11 +437,36 @@ </el-select> </el-form-item> </el-col> + <el-col :span="12"> + <el-form-item label="定位卡编号:" prop="empNo"> + <el-input v-model.trim="dataForm.empNo"></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="定位卡MAC地址:" prop="deviceNo"> + <el-input v-model.trim="dataForm.deviceNo"></el-input> + </el-form-item> + </el-col> </el-row> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="dialogFormVisible = false">取消</el-button> <el-button type="primary" @click="dialogStatus==='create'?createHandle():updateHandle()">确认</el-button> + </div> + </el-dialog> + <el-dialog :visible.sync="dialogUserRoleFormVisible" :modal-append-to-body="false" :close-on-click-modal="false" title="分配角色"> + <el-form ref="userRoleDataForm" :rules="userRoleDataFormRules" :model="userRoleDataForm" label-position="left" label-width="100px" style="margin-left:30px;"> + <el-form-item label="角色:" prop="userRoles"> + <el-select v-model="userRoleDataForm.userRoles" placeholder="请选择用户角色" style="width:100%;" multiple> + <el-option v-for="(item,index) in roleList" :value="item.id" :key="index" :label="getRoleInfo(item)"/> + </el-select> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button @click="dialogUserRoleFormVisible = false">取消</el-button> + <el-button type="primary" @click="assignUserRoleHandle">确认</el-button> </div> </el-dialog> <el-dialog @@ -437,6 +495,39 @@ <el-button :disabled="importDisabled" type="primary" @click="importHandle()">导入</el-button> </div> </el-dialog> + <el-dialog + :visible.sync="bindDialogFormVisible" + :modal-append-to-body="false" + :close-on-click-modal="false" + title="绑定人员卡" + width="550px" + > + <el-form + ref="importForm" + label-position="right" + label-width="120px" + style="margin-left:30px;width:400px;"> + <el-row> + <el-col :span="24"> + <el-form-item label="定位卡编号:" prop="empNo"> + <el-input v-model.trim="cardDataForm.empNo"></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="定位卡MAC地址:" prop="deviceNo"> + <el-input v-model.trim="cardDataForm.deviceNo"></el-input> + </el-form-item> + </el-col> + </el-row> + + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button @click="bindDialogFormVisible = false">取消</el-button> + <el-button type="primary" @click="bindCard()">确认</el-button> + </div> + </el-dialog> <div style="clear: both;"/> <workLicense ref="workLicense"></workLicense> </div> @@ -445,7 +536,8 @@ <script> import workLicense from './components/workLicense/index' import { mapGetters } from 'vuex' - import { userList, createUser, deleteUser, updateUser, importUser, importDistrict,getDistrict,getDistrictByName,updateUserRole} from '@/api/user' + import { userList, createUser, deleteUser, updateUser, importUser, + importDistrict,getDistrict,getDistrictByName,updateUserRole,setInvalidDel,bindCard} from '@/api/user' import { checkBtnPermission } from '@/utils/permission' import { roleList } from '@/api/role' import { parseTime, computePageCount, parseUserType } from '@/utils' @@ -455,8 +547,7 @@ import {getCityListData, getProvinceListData} from "@/api/area"; import { getAllCompany } from '../../../api/unitManage' import { getAllDepartment } from '../../../api/departmentManage' - import { importSupplierUser } from '../../../api/user' - const exampleFile = require('@/assets/example/contractoruser.xlsx') + const exampleFile = require('@/assets/example/user.xlsx') export default { name: 'UserTable', filters: { @@ -484,7 +575,7 @@ if(status === 1){ return "正常" }else if(status === 0){ - return "正常" + return "停用" } }, filterSafety(value) { @@ -563,8 +654,10 @@ tableKey: 0, userData: null, listLoading: true, + isMain:false, iscompanyList:[{id:1,name:'否'},{id:0,name:'是'}], queryForm: { + realname:'', username: '', company:'', department:'', @@ -596,10 +689,18 @@ createddate:'', lastmodifiedby:'', lastmodifieddate:'', + empNo:'', + deviceNo:'', + }, + cardDataForm:{ + username:'', + empNo:'', + deviceNo:'' }, importDialogFormVisible: false, importDisabled: false, dialogFormVisible: false, + bindDialogFormVisible: false, dialogStatus: '', dataFormRules: { username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }], @@ -608,7 +709,8 @@ password: [{ required: true, message: '密码不能为空', trigger: 'blur' }], confirmPassword: [{ required: true, message: '确认密码不能为空', trigger: 'blur' }], type: [{ required: true, message: '用户类型不能为空', trigger: 'change' }], - status: [{ required: true, message: '状态不能为空', trigger: 'change' }] + status: [{ required: true, message: '状态不能为空', trigger: 'change' }], + isanalysis: [{ required: true, message: '是否气体检测中心不能为空', trigger: 'change' }] }, rules: { username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }], @@ -617,7 +719,8 @@ // password: [{ required: true, message: '密码不能为空', trigger: 'blur' }], // confirmPassword: [{ required: true, message: '确认密码不能为空', trigger: 'blur' }], type: [{ required: true, message: '用户类型不能为空', trigger: 'change' }], - status: [{ required: true, message: '状态不能为空', trigger: 'change' }] + status: [{ required: true, message: '状态不能为空', trigger: 'change' }], + isanalysis: [{ required: true, message: '是否气体检测中心不能为空', trigger: 'change' }] }, isList:[{id:1,name:'是'},{id:0,name:'否'}], typeList:[{id:1,name:'超级管理员'},{id:2,name:'管理员'},{id:3,name:'普通用户'}], @@ -629,6 +732,7 @@ userRoleDataFormRules: { userRoles: [{ type: 'array', required: true, message: '角色不能为空', trigger: 'change' }] }, + typeList:[{id:1,name:'超级管理员'},{id:2,name:'管理员'},{id:3,name:'普通用户'}], roleList: [], passwordType: 'password', confirmPasswordType: 'password', @@ -640,7 +744,6 @@ } }, created() { - console.log(this.userType) this.getUserList() this.getProvince() this.getDepartmentData() @@ -659,6 +762,15 @@ this.order = param.order; this.getUserList() }, + companyChange(val){ + this.dataForm.company = val.company + if (val.ismain === 1) { + this.isMain = true; + }else{ + this.isMain = false; + this.dataForm.department = '' + } + }, getUserList() { const _this = this const params = {} @@ -667,7 +779,8 @@ params['pageIndex'] = _this.currentPage params['pageSize'] = _this.pageSize params['type'] = _this.userType - params['isMain'] = false + params['realname'] = _this.realname + params['isMain'] = true for (const i in _this.queryForm) { if (_this.queryForm[i] != undefined && _this.queryForm[i].toString() != '') { params[i] = _this.queryForm[i] @@ -911,6 +1024,8 @@ this.dataForm.password = null this.dialogStatus = 'update' this.dialogFormVisible = true + let ismain = this.companyList.find(item=>item.company === row.company).ismain + this.isMain = ismain === 1; this.$nextTick(() => { this.$refs['dataForm'].clearValidate() }) @@ -969,6 +1084,70 @@ this.importDisabled = false this.importDialogFormVisible = true }, + + + showExportHandle() { + const _this = this + const params = {} + params['sort'] = _this.sort + params['order'] = _this.order + params['pageIndex'] = 0 + params['pageSize'] = 99999 + params['type'] = _this.userType + params['realname'] = _this.realname + params['isMain'] = false + for (const i in _this.queryForm) { + if (_this.queryForm[i] != undefined && _this.queryForm[i].toString() != '') { + params[i] = _this.queryForm[i] + } + } + userList(params) + .then((response) => { + const res = response.data + if (res.code == 200) { + const allData = res.result.result + if (allData.length == 0) { + parseError({ error: '没有录入数据', vm: _this }) + return + } + import('@/vendor/Export2Excel').then((excel) => { + const tHeader = [ + '用户名', + '真实姓名', + '身份证号', + '单位', + '部门', + '职位', + '用户类型', + '角色', + ] + + const data = allData.map(v=>{ + return [ + v.username, + v.realname, + v.idcard, + v.company, + v.department, + v.job, + this.typeList.find(item=>item.id === v.type).name, + v.roles.map(item=>item.name).join(","), + ] + }) + excel.export_json_to_excel({ + header: tHeader, + data, + filename: '用户' + }) + }) + } else { + parseError({ error: res.message, vm: _this }) + } + }) + .catch((error) => { + parseError({ error: error, vm: _this }) + }) + }, viewHandle() { window.open(exampleFile, '_blank') }, @@ -982,7 +1161,7 @@ formData.append('file', files[0]) } formData.append('action', 'import') - importSupplierUser(formData) + importUser(formData) .then((response) => { const res = response.data if (res.code == 200) { @@ -993,7 +1172,7 @@ }) _this.getUserList() } else { - parseError({ error: res.data.message, vm: _this }) + parseError({ error: res.message, vm: _this }) } }) .catch((error) => { @@ -1148,6 +1327,53 @@ } } },//市、镇、街道、委员会 + + bindCardHandle(row){ + this.cardDataForm = { + username:'', + empNo:'', + deviceNo:'' + }; + + this.cardDataForm.username = row.username; + this.bindDialogFormVisible = true; + }, + + bindCard(){ + const _this = this; + bindCard(_this.cardDataForm).then(response => { + const res = response.data + if (res.code === '200'){ + _this.$message({ + message: '绑定成功', + type: 'success' + }) + this.bindDialogFormVisible = false; + _this.getUserList(); + } else { + parseError({ error: res.message, vm: _this }) + } + }).catch(error => { + + }) + }, + setInvalidDel(row){ + const _this = this; + setInvalidDel(row).then(response => { + const res = response.data + if (res.code === '200'){ + _this.$message({ + message: '删除成功', + type: 'success' + }) + _this.getUserList(); + } else { + parseError({ error: res.message, vm: _this }) + } + }).catch(error => { + }) + + }, } } </script> diff --git a/src/views/specialWorkManage/specialWork/taskCreate/components/taskBasic/index.vue b/src/views/specialWorkManage/specialWork/taskCreate/components/taskBasic/index.vue index cd582aa..6d3e3fa 100644 --- a/src/views/specialWorkManage/specialWork/taskCreate/components/taskBasic/index.vue +++ b/src/views/specialWorkManage/specialWork/taskCreate/components/taskBasic/index.vue @@ -17,7 +17,14 @@ </el-col> <el-col :span="8"> <el-form-item label="负责人:" prop="director"> - <el-input v-model="taskBasicForm.director"></el-input> + <el-select v-model="taskBasicForm.director" clearable filterable class="taskBasic_select"> + <el-option + v-for="item in userList" + :key="item.id" + :value="item.realname" + :label="item.realname" + ></el-option> + </el-select> </el-form-item> </el-col> </el-row> @@ -544,10 +551,11 @@ </template> <script> - import { getUnitList } from '@/api/unitManage' + import { getAllCompany } from '@/api/unitManage' import Cookies from 'js-cookie' import { addTask, updateTask } from '@/api/task' import { dictionaryAllItems } from '@/api/dictionary' + import {safetyInspectionItemName} from "@/api/safetySelfInspection"; export default { name: 'index', @@ -676,6 +684,7 @@ companyList:[], fireTypeList:[], hazardList:[], + userList:[], list:[{id:0,name:'否'},{id:1,name:'是'}], levelList:[{id:2,name:'特级'},{id:1,name:'一级'},{id:0,name:'二级'},], spaceCategoryList:[{id:0,name:'密闭设备:如船舱、贮罐、车载槽罐、反应塔(釜)、冷藏箱、压力容器、管道、烟道、锅炉等'},{id:1,name:'地下有限空间:如地下管道、地下室、地下仓库、地下工程、暗沟、隧道、涵洞、地坑、废井、地窖、污水池(井)、沼气池、化粪池、下水道等'},{id:2,name:'地上有限空间:如储藏室、酒糟池、发酵池、垃圾站、温室、冷库、粮仓、料仓等'},], @@ -770,6 +779,7 @@ this.getCompany() this.getFireTypeList() this.getHazardList() + this.getUser() }, methods:{ giveTaskBasic(){ @@ -1423,14 +1433,15 @@ }) }, async getCompany(){ - let params = {} - params['pageIndex'] = this.currentPage - params['pageSize'] = this.pageSize - params['company'] = this.company - params['code'] = this.code - let res = await getUnitList(params) + // let params = {} + // params['pageIndex'] = this.currentPage + // params['pageSize'] = this.pageSize + // params['company'] = this.company + // params['code'] = this.code + // params['isMain'] = true + let res = await getAllCompany() if(res.data.code === '200'){ - this.companyList = res.data.result.result + this.companyList = res.data.result }else{ this.$message({ message:res.data.message, @@ -1464,6 +1475,17 @@ }) } }, + async getUser(){ + let res = await safetyInspectionItemName() + if(res.data.code === '200'){ + this.userList = res.data.result + }else{ + this.$message({ + message:res.data.message, + type:'warning' + }) + } + }, handleChangeBuildingFile(file,fileList){ this.uploadForm.name = file.name this.header.Authorization = Cookies.get('token') diff --git a/src/views/specialWorkManage/specialWork/taskCreate/index.vue b/src/views/specialWorkManage/specialWork/taskCreate/index.vue index c6e3cd5..7160e8c 100644 --- a/src/views/specialWorkManage/specialWork/taskCreate/index.vue +++ b/src/views/specialWorkManage/specialWork/taskCreate/index.vue @@ -118,7 +118,7 @@ </el-table-column> <el-table-column label="操作" align="center" width="280" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button type="text" @click="showReviewInfo(scope.row)" v-if="scope.row.status !== 7 && scope.row.taskReviews.length !== 0">查看审批</el-button> + <!-- <el-button type="text" @click="showReviewInfo(scope.row)" v-if="scope.row.status !== 7 && scope.row.taskReviews.length !== 0">查看审批</el-button> --> <el-button type="text" @click="downloadFile(scope.row)" v-if="scope.row.status === 7">下载</el-button> <!-- <el-button type="text" @click="showTaskInfo(scope.row,'主管领导审批')" v-if="scope.row.status === 6 && scope.row.level === 2">主管领导审批</el-button>--> <!-- <el-button type="text" @click="showTaskInfo(scope.row,'安全部门审批')" v-if="scope.row.status === 5 && (scope.row.level === 1 || scope.row.level === 2)">安全部门审批</el-button>--> -- Gitblit v1.9.2