From ab72ffdff7ca370bb1a5bf0b34402f8e9a6d07f0 Mon Sep 17 00:00:00 2001
From: Your Name <123456>
Date: 星期一, 28 三月 2022 09:14:11 +0800
Subject: [PATCH] 'lct'

---
 src/views/contractor/troubleStatistics/components/troubleDetail/index.vue |  151 +++
 src/api/user.js                                                           |   10 
 src/api/blackList.js                                                      |   56 
 src/api/troubleStatistics.js                                              |   48 
 src/views/contractor/userManage/components/workLicense/index.vue          |  260 +++++
 src/views/contractor/troubleStatistics/index.vue                          |  156 +++
 src/views/contractor/workStatistics/workDetail/index.vue                  |  197 +++
 src/assets/example/contractoruser.xlsx                                    |    0 
 src/views/contractor/workStatistics/index.vue                             |  206 ++++
 src/views/contractor/unitManage/index.vue                                 |  443 ++++++++
 src/views/contractor/blackList/index.vue                                  |  271 +++++
 src/views/contractor/userManage/index.vue                                 | 1157 +++++++++++++++++++++++
 12 files changed, 2,922 insertions(+), 33 deletions(-)

diff --git a/src/api/blackList.js b/src/api/blackList.js
index 22dbc92..d7dc74c 100644
--- a/src/api/blackList.js
+++ b/src/api/blackList.js
@@ -1,47 +1,37 @@
+import {getToken} from "../utils/auth";
 import request from '@/utils/request'
-import { getToken } from '@/utils/auth'
 
 
-export function getBlackList(data){
+
+export function getBlackList(params) {
     return request({
-        headers:{
-            'Authorization':getToken()
+        headers: {
+            'Authorization': getToken()
         },
-        url:process.env.BASE_API+ '/blackList/list',
-        method:'post',
+        url: process.env.BASE_API + '/blackList',
+        method: 'get',
+        params:params?params:{}
+    })
+}
+
+export function addBlack(data) {
+    return request({
+        headers: {
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API + '/banCompany',
+        method: 'post',
         data
     })
 }
 
-export function addBlackList(data){
+export function deleteBlack(data) {
     return request({
-        headers:{
-            'Authorization':getToken()
+        headers: {
+            'Authorization': getToken()
         },
-        url:process.env.BASE_API+ '/blackList/add',
-        method:'post',
-        data
-    })
-}
-
-export function updateBlackList(data){
-    return request({
-        headers:{
-            'Authorization':getToken()
-        },
-        url:process.env.BASE_API+ '/blackList/mod',
-        method:'post',
-        data
-    })
-}
-
-export function deleteBlackList(data){
-    return request({
-        headers:{
-            'Authorization':getToken()
-        },
-        url:process.env.BASE_API+ '/blackList/del?id=' + data,
-        method:'post',
+        url: process.env.BASE_API + '/cancelBan',
+        method: 'post',
         data
     })
 }
diff --git a/src/api/troubleStatistics.js b/src/api/troubleStatistics.js
new file mode 100644
index 0000000..efe2260
--- /dev/null
+++ b/src/api/troubleStatistics.js
@@ -0,0 +1,48 @@
+import {getToken} from "../utils/auth";
+import request from '@/utils/request'
+
+
+
+export function getTroubleList(params) {
+    return request({
+        headers: {
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API + '/hiddenDanger/statistics',
+        method: 'get',
+        params:params?params:{}
+    })
+}
+
+export function getTroubleDetailList(params) {
+    return request({
+        headers: {
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API + '/hiddenDanger/info',
+        method: 'get',
+        params:params?params:{}
+    })
+}
+
+export function getWorkList(params) {
+    return request({
+        headers: {
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API + '/task/statistics',
+        method: 'get',
+        params:params?params:{}
+    })
+}
+
+export function getWorkDetailList(params) {
+    return request({
+        headers: {
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API + '/task/info',
+        method: 'get',
+        params:params?params:{}
+    })
+}
diff --git a/src/api/user.js b/src/api/user.js
index bb163b2..da92fd9 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -234,3 +234,13 @@
     })
 }
 
+export function importSupplierUser(data) {
+    return request({
+        headers: {
+            'Authorization': getToken()
+        },
+        url: process.env.BASE_API + '/importSupplierUser',
+        method: 'post',
+        data
+    })
+}
diff --git a/src/assets/example/contractoruser.xlsx b/src/assets/example/contractoruser.xlsx
new file mode 100644
index 0000000..65f80ca
--- /dev/null
+++ b/src/assets/example/contractoruser.xlsx
Binary files differ
diff --git a/src/views/contractor/blackList/index.vue b/src/views/contractor/blackList/index.vue
new file mode 100644
index 0000000..ceec0ad
--- /dev/null
+++ b/src/views/contractor/blackList/index.vue
@@ -0,0 +1,271 @@
+<template>
+    <div class="app-container">
+        <div class="filter-container">
+            <div class="basic_search">
+                <span>单位名称:</span>
+                <el-input v-model="company" style="width:200px">
+                </el-input>
+            </div>
+            <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-refresh" @click="refreshHandle">搜索</el-button>
+            <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-plus" @click="showUnitForm('','新增')">新增</el-button>
+        </div>
+        <div class="table_content">
+            <el-table
+                v-loading="listLoading"
+                :key="tableKey"
+                :data="blackData"
+                border
+                fit
+                highlight-current-row
+                style="width: 100%;"
+            >
+                <el-table-column type="index" label="序号" align="center" width="60"/>
+                <el-table-column label="单位名称" prop="company" align="center">
+                </el-table-column>
+                <el-table-column label="创建人" prop="code" align="center">
+                </el-table-column>
+                <el-table-column label="创建时间" prop="contactname" align="center">
+                </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" style="color: red" @click="deleteById(scope.row)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <el-pagination
+                v-show="recordTotal>0"
+                :current-page="currentPage"
+                :page-sizes="[10, 20, 30, 50]"
+                :page-size="pageSize"
+                :total="recordTotal"
+                layout="total, sizes, prev, pager, next, jumper"
+                background
+                style="float:right;"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+            <br>
+        </div>
+        <el-dialog :title="title" :visible.sync="blackFormVisible" :modal-append-to-body="false" :close-on-click-modal="false" width="40%">
+            <el-form ref="blackForm" :rules="blackFormRules" :model="blackForm" label-position="right" label-width="100px" style="margin-left:50px;width:500px;">
+                <el-form-item label="单位名称" prop="company">
+                    <el-input v-model="blackForm.company"></el-input>
+                </el-form-item>
+            </el-form>
+            <div  align="right">
+                <el-button @click="unitFormVisible = false">取消</el-button>
+                <el-button type="primary" @click="submitUnit()">确认</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+    import { mapGetters } from 'vuex'
+    import { computePageCount } from '../../../utils'
+    import { addBlack, deleteBlack, getBlackList } from '../../../api/blackList'
+    import { getDistrict } from '../../../api/user'
+    import { parseError } from '../../../utils/messageDialog'
+    import { getCityListData } from '../../../api/area'
+
+    export default {
+        name: 'index',
+        filters: {
+            parseMain(type){
+                if(type === 1){
+                    return "是"
+                }else if(type === 0){
+                    return "否"
+                }
+            },
+        },
+        computed: {
+            ...mapGetters([
+                'userType'
+            ])
+        },
+        data() {
+            return {
+                tableKey: 0,
+                blackData: [],
+                listLoading: false,
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                title:'',
+                company:'',
+                code:'',
+                blackFormVisible:false,
+                blackFormRules:{company: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }],},
+                blackForm:{
+                    id:'',
+                    company:'',
+
+                },
+            }
+        },
+        created() {
+            this.getBlackData()
+            this.getProvince()
+        },
+        methods: {
+            async getBlackData(){
+                this.listLoading = true
+                let params = {}
+                params['pageIndex'] = this.currentPage
+                params['pageSize'] = this.pageSize
+                params['company'] = this.company
+                let res = await getBlackList(params)
+                if(res.data.code === '200'){
+                    this.recordTotal = res.data.result.totalCount
+                    this.pageSize = res.data.result.pageSize
+                    this.pageTotal = computePageCount(res.data.result.totalCount, res.data.result.pageSize)
+                    this.currentPage = res.data.result.pageIndex
+                    this.blackData = res.data.result.result
+                }else{
+                    this.$message({
+                        message:res.data.message,
+                        type:'warning'
+                    })
+                }
+                this.listLoading = false
+            },
+            showUnitForm(value,type){
+                this.blackFormVisible = true
+                if(type === '新增'){
+                    this.title = '新增'
+                    this.blackForm = {
+                        id:'',
+                        company:'',
+                    }
+                }else{
+                    this.title = '修改'
+                    this.blackForm = value
+                }
+            },
+            submitUnit(){
+                addBlack(this.blackForm).then((res)=>{
+                    if(res.data.code === '200'){
+                        this.blackFormVisible = false
+                        this.getBlackData()
+                        this.$notify({
+                            type:'success',
+                            duration:2000,
+                            message:'新增成功',
+                            title:'成功'
+                        })
+                    }else{
+                        this.$message({
+                            type:'warning',
+                            message:res.data.message
+                        })
+                    }
+                })
+            },
+            deleteById(val){
+                this.$confirm('取消拉黑,是否继续','提示',{
+                    confirmButtonText:'确定',
+                    cancelButtonText:'取消',
+                    type:'warning',
+                }).then(()=> {
+                    deleteBlack({company:val.company}).then( ()=>{
+                        this.getBlackData()
+                        this.$notify({
+                            title:'成功',
+                            message:'删除成功',
+                            type:'success',
+                            duration:2000,
+                        })
+                    })
+                })
+            },
+            refreshHandle(){
+                this.getBlackData()
+            },
+            handleSizeChange(val){
+                this.pageSize = val
+                this.getBlackData()
+            },
+            handleCurrentChange(val){
+                this.currentPage = val
+                this.getBlackData()
+            },
+
+            getProvince(){
+                const params = {}
+                params['parenttype'] = 0
+                params['type'] = 1
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.provinceList = res.result;
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            async changeArea(value){
+                if(value === 'province'){
+                    this.unitForm.city = ''
+                    this.unitForm.area = ''
+                    this.unitForm.town = ''
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 2,
+                        parenttype: 1,
+                        parentname: this.unitForm.province,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.cityList = res.data.result
+                    }
+                }else if(value === 'city'){
+                    this.unitForm.area = ''
+                    this.unitForm.town = ''
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 3,
+                        parenttype: 2,
+                        parentname: this.unitForm.city,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.districtList = res.data.result
+                    }
+                }else if(value === 'area'){
+                    this.unitForm.town = ''
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 4,
+                        parenttype: 3,
+                        parentname: this.unitForm.area,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.streetList = res.data.result
+                    }
+                }else if(value === 'town'){
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 5,
+                        parenttype: 4,
+                        parentname: this.unitForm.town,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.committeeList = res.data.result
+                    }
+                }
+            },//市、镇、街道、委员会
+        }
+    }
+</script>
+<style scoped>
+    .basic_search{
+        display:inline-block;
+        padding-bottom: 10px;
+    }
+</style>
diff --git a/src/views/contractor/troubleStatistics/components/troubleDetail/index.vue b/src/views/contractor/troubleStatistics/components/troubleDetail/index.vue
new file mode 100644
index 0000000..daead62
--- /dev/null
+++ b/src/views/contractor/troubleStatistics/components/troubleDetail/index.vue
@@ -0,0 +1,151 @@
+<template>
+    <el-dialog :title="title" :visible.sync="troubleDetailVisible" :modal-append-to-body="false" :close-on-click-modal="false" width="70%">
+        <div class="app-container">
+            <div class="table_content">
+                <el-table
+                    v-loading="listLoading"
+                    :key="tableKey"
+                    :data="troubleDetailData"
+                    border
+                    fit
+                    highlight-current-row
+                    style="width: 100%;"
+                >
+                    <el-table-column type="index" label="序号" align="center" width="80"/>
+                    <el-table-column label="状态" prop="status" align="center" />
+                    <el-table-column label="作业编号" prop="taskcode" align="center" />
+                    <el-table-column label="隐患等级" prop="level" align="center" >
+                        <template slot-scope="scope">
+                            <el-tag :type="scope.row.level == '紧急'?'danger':'warning'">{{scope.row.level}}</el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="上报人" prop="requestor" align="center" />
+                    <el-table-column label="负责人" prop="principal" align="center" />
+                    <el-table-column label="整改人" prop="supervisor" align="center" />
+                    <el-table-column label="创建时间" prop="createtime" align="center" />
+                    <el-table-column label="图片" align="center" >
+                        <template slot-scope="scope">
+                            <el-popover placement="top-start" trigger="click">
+                                <img slot="reference" v-for="(item,index) in scope.row.reportResources" :src="item.url" :key="index" style="width:40px;height:40px;margin-left:10px;cursor:pointer" @click="reportResources(item)"></img>
+                            </el-popover>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <br>
+                <el-pagination
+                    v-show="recordTotal>0"
+                    :current-page="currentPage"
+                    :page-sizes="[10, 20, 30, 50]"
+                    :page-size="pageSize"
+                    :total="recordTotal"
+                    layout="total, sizes, prev, pager, next, jumper"
+                    background
+                    style="float:right;"
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                />
+                <br>
+            </div>
+            <el-dialog :visible.sync="dialogVisible" :append-to-body="true">
+                <img width="100%" :src="dialogImageUrl" alt="">
+            </el-dialog>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import { mapGetters } from 'vuex'
+    import { getTroubleDetailList } from '../../../../../api/troubleStatistics'
+    import { computePageCount } from '../../../../../utils'
+
+    export default {
+        name: 'index',
+        filters: {
+            parseMain(type){
+                if(type === 1){
+                    return "是"
+                }else if(type === 0){
+                    return "否"
+                }
+            },
+        },
+        computed: {
+            ...mapGetters([
+                'userType'
+            ])
+        },
+        data() {
+            return {
+                tableKey: 0,
+                troubleDetailData: [],
+                listLoading: false,
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                title:'',
+                company:'',
+                starttime:'',
+                endtime:'',
+                troubleDetailVisible:false,
+                dialogImageUrl:'',
+                dialogVisible:false,
+            }
+        },
+        created() {
+        },
+        methods: {
+            showTroubleDetail(company,starttime,endtime){
+                this.troubleDetailVisible = true
+                this.starttime = starttime
+                this.endtime = endtime
+                this.company = company
+                this.getTroubleData()
+            },
+            async getTroubleData(){
+                this.listLoading = true
+                let params = {}
+                params['pageIndex'] = this.currentPage
+                params['pageSize'] = this.pageSize
+                params['company'] = this.company
+                params['starttime'] = this.starttime
+                params['endtime'] = this.endtime
+                let res = await getTroubleDetailList(params)
+                if(res.data.code === '200'){
+                    this.recordTotal = res.data.result.totalCount
+                    this.pageSize = res.data.result.pageSize
+                    this.pageTotal = computePageCount(res.data.result.totalCount, res.data.result.pageSize)
+                    this.currentPage = res.data.result.pageIndex
+                    this.troubleDetailData = res.data.result.result
+                    for(let i=0;i<this.troubleDetailData.length;i++){
+                        if(this.troubleDetailData[i].reportResources.length != 0) {
+                            for (let j = 0; j < this.troubleDetailData[i].reportResources.length; j++) {
+                                this.troubleDetailData[i].reportResources[j].url = process.env.IMG_API + this.troubleDetailData[i].reportResources[j].url
+                            }
+                        }
+                    }
+                }else{
+                }
+                this.listLoading = false
+            },
+            reportResources(file){
+                this.dialogImageUrl = file.url;
+                this.dialogVisible = true;
+            },
+            handleSizeChange(val){
+                this.pageSize = val
+                this.getTroubleData()
+            },
+            handleCurrentChange(val){
+                this.currentPage = val
+                this.getTroubleData()
+            },
+        }
+    }
+</script>
+<style scoped>
+    .basic_search{
+        display:inline-block;
+        padding-bottom: 10px;
+    }
+</style>
diff --git a/src/views/contractor/troubleStatistics/index.vue b/src/views/contractor/troubleStatistics/index.vue
new file mode 100644
index 0000000..815c6d0
--- /dev/null
+++ b/src/views/contractor/troubleStatistics/index.vue
@@ -0,0 +1,156 @@
+<template>
+    <div class="app-container">
+        <div class="filter-container">
+            <div class="basic_search">
+                <span>单位名称:</span>
+                <el-input v-model="company" style="width:200px">
+                </el-input>
+            </div>
+            <div class="basic_search">
+                <span>开始时间:</span>
+                <el-date-picker
+                    v-model="starttime"
+                    align="right"
+                    value-format="yyyy-MM-dd"
+                    placeholder="开始时间">
+                </el-date-picker>
+            </div>
+            <div class="basic_search">
+                <span>结束时间:</span>
+                <el-date-picker
+                    v-model="endtime"
+                    align="right"
+                    value-format="yyyy-MM-dd"
+                    placeholder="开始时间">
+                </el-date-picker>
+            </div>
+            <el-button style="margin-left: 10px;" type="primary" icon="el-icon-refresh" @click="refreshHandle">搜索</el-button>
+        </div>
+        <div class="table_content">
+            <el-table
+                v-loading="listLoading"
+                :key="tableKey"
+                :data="troubleData"
+                border
+                fit
+                highlight-current-row
+                style="width: 100%;"
+            >
+                <el-table-column label="单位名称" prop="constructionunit" align="center">
+                </el-table-column>
+                <el-table-column label="隐患数量" prop="countNum" align="center">
+                </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="showTroubleDetail(scope.row)">详情</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <el-pagination
+                v-show="recordTotal>0"
+                :current-page="currentPage"
+                :page-sizes="[10, 20, 30, 50]"
+                :page-size="pageSize"
+                :total="recordTotal"
+                layout="total, sizes, prev, pager, next, jumper"
+                background
+                style="float:right;"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+            <br>
+            <trouble-detail ref="troubleDetail"></trouble-detail>
+        </div>
+    </div>
+</template>
+
+<script>
+    import troubleDetail from './components/troubleDetail/index'
+    import { mapGetters } from 'vuex'
+    import { computePageCount } from '../../../utils'
+    import {  getTroubleList, } from '../../../api/troubleStatistics'
+
+    export default {
+        name: 'index',
+        filters: {
+            parseMain(type){
+                if(type === 1){
+                    return "是"
+                }else if(type === 0){
+                    return "否"
+                }
+            },
+        },
+        components:{
+            troubleDetail
+        },
+        computed: {
+            ...mapGetters([
+                'userType'
+            ])
+        },
+        data() {
+            return {
+                tableKey: 0,
+                troubleData: [],
+                listLoading: false,
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                company:'',
+                starttime:'',
+                endtime:'',
+            }
+        },
+        created() {
+            this.getTroubleData()
+        },
+        methods: {
+            async getTroubleData(){
+                this.listLoading = true
+                let params = {}
+                params['pageIndex'] = this.currentPage
+                params['pageSize'] = this.pageSize
+                params['company'] = this.company
+                params['starttime'] = this.starttime
+                params['endtime'] = this.endtime
+                let res = await getTroubleList(params)
+                if(res.data.code === '200'){
+                    this.recordTotal = res.data.result.totalCount
+                    this.pageSize = res.data.result.pageSize
+                    this.pageTotal = computePageCount(res.data.result.totalCount, res.data.result.pageSize)
+                    this.currentPage = res.data.result.pageIndex
+                    this.troubleData = res.data.result.result
+                }else{
+                    this.$message({
+                        message:res.data.message,
+                        type:'warning'
+                    })
+                }
+                this.listLoading = false
+            },
+            showTroubleDetail(val){
+                this.$refs.troubleDetail.showTroubleDetail(val.constructionunit,this.starttime,this.endtime)
+            },
+            refreshHandle(){
+                this.getTroubleData()
+            },
+            handleSizeChange(val){
+                this.pageSize = val
+                this.getTroubleData()
+            },
+            handleCurrentChange(val){
+                this.currentPage = val
+                this.getTroubleData()
+            },
+        }
+    }
+</script>
+<style scoped>
+    .basic_search{
+        display:inline-block;
+        padding-bottom: 10px;
+    }
+</style>
diff --git a/src/views/contractor/unitManage/index.vue b/src/views/contractor/unitManage/index.vue
new file mode 100644
index 0000000..28654bb
--- /dev/null
+++ b/src/views/contractor/unitManage/index.vue
@@ -0,0 +1,443 @@
+<template>
+    <div class="app-container">
+        <div class="filter-container">
+            <div class="basic_search">
+                <span>单位名称:</span>
+                <el-input v-model="company" style="width:200px">
+                </el-input>
+            </div>
+            <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-refresh" @click="refreshHandle">搜索</el-button>
+            <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-plus" @click="showUnitForm('','新增')">新增</el-button>
+        </div>
+        <div class="table_content">
+            <el-table
+                v-loading="listLoading"
+                :key="tableKey"
+                :data="unitData"
+                border
+                fit
+                highlight-current-row
+                style="width: 100%;"
+            >
+                <el-table-column label="单位名称" prop="company" align="center">
+                </el-table-column>
+                <el-table-column label="单位代码" prop="code" align="center">
+                </el-table-column>
+                <el-table-column label="是否为主体单位" prop="ismain" align="center">
+                    <template slot-scope="scope">
+                        {{ scope.row.ismain | parseMain}}
+                    </template>
+                </el-table-column>
+                <el-table-column label="联系人" prop="contactname" align="center">
+                </el-table-column>
+                <el-table-column label="联系电话" prop="contactphone" align="center">
+                </el-table-column>
+                <el-table-column label="地址" prop="address" align="center">
+                    <template slot-scope="scope">
+                        <div>
+                            <span>{{scope.row.province}}</span>
+                            <span v-if="scope.row.city !== null && scope.row.city !== '' && scope.row.province !== undefined">{{"-" + scope.row.city}}</span>
+                            <span v-if="scope.row.area !== null && scope.row.area !== '' && scope.row.city !== undefined">{{"-" + scope.row.area}}</span>
+                            <span v-if="scope.row.town !== null && scope.row.town !== '' && scope.row.town !== undefined">{{"-" + scope.row.town}}</span>
+                            <span v-if="scope.row.committee !== null && scope.row.committee !== '' && scope.row.committee !== undefined">{{"-" + scope.row.committee}}</span>
+                        </div>
+                        <div></div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="创建者" prop="createdby" align="center">
+                </el-table-column>
+                <el-table-column label="创建时间" prop="createddate" align="center">
+                </el-table-column>
+                <el-table-column label="是否黑名单" prop="isbanned" align="center">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.isbanned | parseIsBanned }}</span>
+                    </template>
+                </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="showUnitForm(scope.row,'编辑')">编辑</el-button>
+                        <el-button type="text" style="color: red" @click="deleteById(scope.row)">删除</el-button>
+                        <el-button type="text" style="color: red" @click="addBlack(scope.row)">黑名单</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <el-pagination
+                v-show="recordTotal>0"
+                :current-page="currentPage"
+                :page-sizes="[10, 20, 30, 50]"
+                :page-size="pageSize"
+                :total="recordTotal"
+                layout="total, sizes, prev, pager, next, jumper"
+                background
+                style="float:right;"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+            <br>
+        </div>
+        <el-dialog :title="title" :visible.sync="unitFormVisible" :modal-append-to-body="false" :close-on-click-modal="false" width="40%">
+            <el-form ref="dataForm" :rules="unitFormRules" :model="unitForm" label-position="right" label-width="100px" style="margin-left:50px;width:500px;">
+                <el-form-item label="单位名称">
+                    <el-input v-model="unitForm.company"></el-input>
+                </el-form-item>
+                <el-form-item label="单位代码">
+                    <el-input v-model="unitForm.code"></el-input>
+                </el-form-item>
+                <el-form-item label="是否为主体单位:" prop="ismain">
+                    <el-select v-model.trim="unitForm.ismain"  auto-complete="on" style="width:100%;">
+                        <el-option
+                            v-for="item in isMainList"
+                            :key="item.id"
+                            :value="item.id"
+                            :label="item.name"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="联系人">
+                    <el-input v-model="unitForm.contactname"></el-input>
+                </el-form-item>
+                <el-form-item label="联系电话">
+                    <el-input v-model="unitForm.contactphone"></el-input>
+                </el-form-item>
+                <el-form-item label="省">
+                    <el-select v-model="unitForm.province" clearable filterable @change="changeArea('province')" style="width:100%;">
+                        <el-option
+                            v-for="item in provinceList"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.name"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="市">
+                    <el-select v-model="unitForm.city" prop="city" clearable filterable @change="changeArea('city')" style="width:100%;">
+                        <el-option
+                            v-for="item in cityList"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.name"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="区">
+                    <el-select v-model="unitForm.area" clearable filterable @change="changeArea('area')" style="width:100%;">
+                        <el-option
+                            v-for="item in districtList"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.name"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="街道">
+                    <el-select v-model="unitForm.town" clearable filterable @change="changeArea('town')" style="width:100%;">
+                        <el-option
+                            v-for="item in streetList"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.name"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="居委会">
+                    <el-select v-model="unitForm.community" clearable filterable style="width:100%;">
+                        <el-option
+                            v-for="item in committeeList"
+                            :key="item.id"
+                            :label="item.name"
+                            :value="item.name"
+                        >
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <div  align="right">
+                <el-button @click="unitFormVisible = false">取消</el-button>
+                <el-button type="primary" @click="submitUnit()">确认</el-button>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+    import { mapGetters } from 'vuex'
+    import { computePageCount } from '../../../utils'
+    import { addUnit, deleteUnit, getUnitList, updateUnit } from '../../../api/unitManage'
+    import { getDistrict } from '../../../api/user'
+    import { parseError } from '../../../utils/messageDialog'
+    import { getCityListData } from '../../../api/area'
+    import { addBlack } from '../../../api/blackList'
+
+    export default {
+        name: 'index',
+        filters: {
+            parseMain(type){
+                if(type === 1){
+                    return "是"
+                }else if(type === 0){
+                    return "否"
+                }
+            },
+            parseIsBanned(value){
+                if(value === 1){
+                    return "是"
+                }else if(value === 0){
+                    return "否"
+                }
+            },
+        },
+        computed: {
+            ...mapGetters([
+                'userType'
+            ])
+        },
+        data() {
+            return {
+                tableKey: 0,
+                unitData: [],
+                listLoading: false,
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                title:'',
+                company:'',
+                code:'',
+                unitFormVisible:false,
+                unitFormRules:{},
+                unitForm:{
+                    id:'',
+                    company:'',
+                    code:'',
+                    contactname:'',
+                    contactphone:'',
+                    province:'',
+                    city:'',
+                    area:'',
+                    town:'',
+                    committee:'',
+                    isbanned:'',
+                },
+                provinceList:[],
+                cityList:[],
+                districtList:[],
+                committeeList:[],
+                streetList:[],
+                isMainList:[{id:1,name:'是'},{id:0,name:'否'}],
+            }
+        },
+        created() {
+            this.getUnitData()
+            this.getProvince()
+        },
+        methods: {
+            async getUnitData(){
+                this.listLoading = true
+                let params = {}
+                params['pageIndex'] = this.currentPage
+                params['pageSize'] = this.pageSize
+                params['company'] = this.company
+                let res = await getUnitList(params)
+                if(res.data.code === '200'){
+                    this.recordTotal = res.data.result.totalCount
+                    this.pageSize = res.data.result.pageSize
+                    this.pageTotal = computePageCount(res.data.result.totalCount, res.data.result.pageSize)
+                    this.currentPage = res.data.result.pageIndex
+                    this.unitData = res.data.result.result
+                }else{
+                    this.$message({
+                        message:res.data.message,
+                        type:'warning'
+                    })
+                }
+                this.listLoading = false
+            },
+            showUnitForm(value,type){
+                this.unitFormVisible = true
+                if(type === '新增'){
+                    this.title = '新增'
+                    this.unitForm = {
+                        id:'',
+                        company:'',
+                        code:'',
+                        contactname:'',
+                        contactphone:'',
+                        province:'',
+                        city:'',
+                        area:'',
+                        town:'',
+                        committee:'',
+                        isbanned:'',
+                    }
+                }else{
+                    this.title = '修改'
+                    this.unitForm = value
+                }
+            },
+            submitUnit(){
+                if(this.title === '新增'){
+                    addUnit(this.unitForm).then((res)=>{
+                        if(res.data.code === '200'){
+                            this.unitFormVisible = false
+                            this.getUnitData()
+                            this.$notify({
+                                type:'success',
+                                duration:2000,
+                                message:'新增成功',
+                                title:'成功'
+                            })
+                        }else{
+                            this.$message({
+                                type:'warning',
+                                message:res.data.message
+                            })
+                        }
+                    })
+                }else{
+                    updateUnit(this.unitForm).then((res)=>{
+                        if(res.data.code === '200'){
+                            this.unitFormVisible = false
+                            this.getUnitData()
+                            this.$notify({
+                                type:'success',
+                                duration:2000,
+                                title:'成功',
+                                message:'编辑成功'
+                            })
+                        }else{
+                            this.$message({
+                                type:'warning',
+                                message:res.data.message
+                            })
+                        }
+                    })
+                }
+            },
+            deleteById(val){
+                this.$confirm('删除此条信息,是否继续','提示',{
+                    confirmButtonText:'确定',
+                    cancelButtonText:'取消',
+                    type:'warning',
+                }).then(()=> {
+                    deleteUnit({id:val.id}).then( ()=>{
+                        this.getUnitData()
+                        this.$notify({
+                            title:'成功',
+                            message:'删除成功',
+                            type:'success',
+                            duration:2000,
+                        })
+                    })
+                })
+            },
+            addBlack(val){
+                this.$confirm('将此单位添加黑名单,是否继续','提示',{
+                    confirmButtonText:'确定',
+                    cancelButtonText:'取消',
+                    type:'warning',
+                }).then(()=> {
+                    addBlack({company:val.company}).then( ()=>{
+                        this.getUnitData()
+                        this.$notify({
+                            title:'成功',
+                            message:'删除成功',
+                            type:'success',
+                            duration:2000,
+                        })
+                    })
+                })
+            },
+            refreshHandle(){
+                this.getUnitData()
+            },
+            handleSizeChange(val){
+                this.pageSize = val
+                this.getUnitData()
+            },
+            handleCurrentChange(val){
+                this.currentPage = val
+                this.getUnitData()
+            },
+
+            getProvince(){
+                const params = {}
+                params['parenttype'] = 0
+                params['type'] = 1
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.provinceList = res.result;
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            async changeArea(value){
+                if(value === 'province'){
+                    this.unitForm.city = ''
+                    this.unitForm.area = ''
+                    this.unitForm.town = ''
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 2,
+                        parenttype: 1,
+                        parentname: this.unitForm.province,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.cityList = res.data.result
+                    }
+                }else if(value === 'city'){
+                    this.unitForm.area = ''
+                    this.unitForm.town = ''
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 3,
+                        parenttype: 2,
+                        parentname: this.unitForm.city,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.districtList = res.data.result
+                    }
+                }else if(value === 'area'){
+                    this.unitForm.town = ''
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 4,
+                        parenttype: 3,
+                        parentname: this.unitForm.area,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.streetList = res.data.result
+                    }
+                }else if(value === 'town'){
+                    this.unitForm.community = ''
+                    this.areaListQuery = {
+                        type: 5,
+                        parenttype: 4,
+                        parentname: this.unitForm.town,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.committeeList = res.data.result
+                    }
+                }
+            },//市、镇、街道、委员会
+        }
+    }
+</script>
+<style scoped>
+    .basic_search{
+        display:inline-block;
+        padding-bottom: 10px;
+    }
+</style>
diff --git a/src/views/contractor/userManage/components/workLicense/index.vue b/src/views/contractor/userManage/components/workLicense/index.vue
new file mode 100644
index 0000000..2a8acb9
--- /dev/null
+++ b/src/views/contractor/userManage/components/workLicense/index.vue
@@ -0,0 +1,260 @@
+<template>
+    <el-dialog
+    :visible.sync="workLicenseDialog"
+    :close-on-click-modal="false"
+    title="工作证"
+    width="60%"
+    >
+        <div class="app-container">
+            <div class="filter-container">
+                <div class="basic_search">
+                    <el-button type="primary" @click="showLicenseForm('','新增')">新增</el-button>
+                    <el-button type="primary" icon="el-icon-search">查询</el-button>
+                </div>
+            </div>
+            <div class="table_content">
+                <el-table :data="workLicenseData" v-loading="listLoading" :key="tableKey" fit border highlight-current-row style="width: 100%;">
+                    <el-table-column type="index" label="" align="center" width="60"/>
+                    <el-table-column label="姓名" prop="realname" align="center" sortable="custom">
+                    </el-table-column>
+                    <el-table-column label="手机号" prop="mobile" align="center" sortable="custom">
+                    </el-table-column>
+                    <el-table-column label="身份证" prop="idcard" align="center" sortable="custom">
+                    </el-table-column>
+                    <el-table-column label="特殊作业工种" prop="branch" align="center" sortable="custom">
+                    </el-table-column>
+                    <el-table-column label="特殊作业证件号" prop="certname" align="center" sortable="custom">
+                    </el-table-column>
+                    <el-table-column label="文件路径" prop="certpath" align="center" sortable="custom">
+                        <template slot-scope="scope">
+                            <a :href="baseUrl+scope.row.certpath" target="_blank">{{baseUrl+scope.row.url}}</a>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="有效期开始时间" prop="starttime" align="center" >
+                    </el-table-column>
+                    <el-table-column label="有效期结束时间" prop="endtime" align="center" >
+                    </el-table-column>
+                    <el-table-column label="操作" align="center" width="250" class-name="small-padding fixed-width">
+                        <template slot-scope="scope">
+                            <el-button type="text" @click="showLicenseForm(scope.row,'编辑')">编辑</el-button>
+                            <el-button type="text" style="color: red" @click="deleteById(scope.row)">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+        </div>
+        <el-dialog
+            :visible.sync="LicenseFormDialog"
+            :close-on-click-modal="false"
+            :append-to-body="true"
+            :title="title"
+            width="30%"
+        >
+            <el-form ref="licenseForm" :rules="licenseRules" :model="licenseForm" label-position="right" label-width="150px" style="padding-right: 50px" element-loading-text="保存中...">
+                <el-form-item label="真实姓名:" prop="realname">
+                    <el-input v-model.trim="licenseForm.realname" :disabled="true"/>
+                </el-form-item>
+                <el-form-item label="联系方式:" prop="mobile">
+                    <el-input v-model.trim="licenseForm.mobile" :disabled="true"/>
+                </el-form-item>
+                <el-form-item label="身份证:" prop="idcard">
+                    <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-option
+                    v-for="item in branchList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.name"
+                    >
+                    </el-option>
+                </el-form-item>
+                <el-form-item label="特种作业证件号:" prop="certname">
+                    <el-input v-model.trim="licenseForm.certname"/>
+                </el-form-item>
+                <el-form-item label="有效期开始时间:" prop="starttime">
+                    <el-date-picker
+                        value-format="yyyy-MM-dd"
+                        v-model="licenseForm.starttime"
+                        type="date"
+                        placeholder="选择日期时间">
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item label="有效期结束时间:" prop="endtime">
+                    <el-date-picker
+                        value-format="yyyy-MM-dd"
+                        v-model="licenseForm.endtime"
+                        type="date"
+                        placeholder="选择日期时间">
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item label="文件:" prop="upload">
+                    <input id="upload" ref="upload"  type="file"/>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="LicenseFormDialog = false">取消</el-button>
+                <el-button  type="primary" @click="submit()">确定</el-button>
+            </div>
+        </el-dialog>
+    </el-dialog>
+</template>
+
+<script>
+import { addWorkLicense, deleteWorkLicense, getWorkLicenseList, updateWorkLicense } from '../../../../../api/user'
+import { parseError } from '../../../../../utils/messageDialog'
+import { deleteUnit } from '../../../../../api/unitManage'
+
+export default {
+    name: 'index',
+    data(){
+        return{
+            baseUrl: process.env.IMG_API,
+            title:'',
+            tableKey:'',
+            mobile:'',
+            listLoading:false,
+            workLicenseData:[],
+            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,
+            licenseForm:{
+                id:'',
+                realname:'',
+                mobile:'',
+                idcard:'',
+                certname:'',
+                starttime:'',
+                endtime:'',
+                branch:'',
+            },
+            licenseRules:{
+
+            }
+        }
+    },
+    methods:{
+        openWorkLicense(row){
+            this.workLicenseDialog = true
+            this.licenseForm.realname = row.realname
+            this.licenseForm.mobile = row.username
+            this.licenseForm.idcard = row.idcard
+            this.licenseForm.branch = row.branch
+            this.getWorkLicenseData()
+        },
+        async getWorkLicenseData(){
+            let res = await getWorkLicenseList(this.licenseForm.mobile)
+            if(res.data.code === '200'){
+                this.workLicenseData  = res.data.result
+            }else{
+                this.$message({
+                    type:'warning',
+                    message:res.data.message
+                })
+            }
+        },
+        showLicenseForm(value,type){
+            this.LicenseFormDialog = true
+            if(type === '新增'){
+                this.licenseForm.certname = ''
+                this.licenseForm.starttime = ''
+                this.licenseForm.endtime = ''
+                this.licenseForm.branch = ''
+                this.title = '新增'
+            }else{
+                this.title = '编辑'
+                this.licenseForm = value
+            }
+        },
+        submit(){
+            if(this.title === '新增'){
+                const formData = new FormData();
+                for (const i in this.licenseForm) {
+                    if (
+                        this.licenseForm[i] != undefined &&
+                        this.licenseForm[i].toString() != ""
+                    ) {
+                        formData.append(i, this.licenseForm[i]);
+                    }
+                }
+                if(this.$refs["upload"].files.length !== 0){
+                    formData.append('file', this.$refs["upload"].files[0])
+                }
+                addWorkLicense(formData).then(res =>{
+                    if(res.data.code === '200'){
+                        this.LicenseFormDialog = false
+                        this.getWorkLicenseData()
+                        this.$notify({
+                            title:'成功',
+                            message:'新增成功',
+                            duration:2000,
+                            type:'success'
+                        })
+                    }else{
+                        this.$message({
+                            type:'warning',
+                            message:res.data.message
+                        })
+                    }
+                }).catch(error => {
+                    parseError({ error: error, vm: this })
+                })
+            }else{
+                const formData = new FormData();
+                for (const i in this.licenseForm) {
+                    if (
+                        this.licenseForm[i] != undefined &&
+                        this.licenseForm[i].toString() != ""
+                    ) {
+                        formData.append(i, this.licenseForm[i]);
+                    }
+                }
+                if(this.$refs["upload"].files.length !== 0){
+                    formData.append('file', this.$refs["upload"].files[0])
+                }
+                updateWorkLicense(formData).then(res =>{
+                    if(res.data.code === '200'){
+                        this.LicenseFormDialog = false
+                        this.getWorkLicenseData()
+                        this.$notify({
+                            type:'success',
+                            message:'新增成功',
+                            duration:2000,
+                            title:'成功'
+                        })
+                    }else{
+                        this.$message({
+                            message:res.data.message,
+                            type:'warning'
+                        })
+                    }
+                }).catch(error =>{
+                    parseError({error:error,vm:this})
+                })
+            }
+        },
+        deleteById(row){
+            this.$confirm('删除此条工作证,是否继续','提示',{
+                confirmButtonText:'确定',
+                cancelButtonText:'取消',
+                type:'warning',
+            }).then(()=> {
+                deleteWorkLicense({id:row.id}).then( ()=>{
+                    this.getWorkLicenseData()
+                    this.$notify({
+                        title:'成功',
+                        message:'删除成功',
+                        type:'success',
+                        duration:2000,
+                    })
+                })
+            }).catch(error => parseError({error:error, vm:this}))
+        }
+    }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/src/views/contractor/userManage/index.vue b/src/views/contractor/userManage/index.vue
new file mode 100644
index 0000000..e949659
--- /dev/null
+++ b/src/views/contractor/userManage/index.vue
@@ -0,0 +1,1157 @@
+<template>
+    <div class="app-container">
+        <div>
+            <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.company"
+                        class="filter-item"
+                        placeholder=""
+                        style="width: 200px;"
+                        @keyup.enter.native="queryHandle"
+                    />
+                </el-form-item>
+                <el-form-item label="部门">
+                    <el-input
+                        v-model="queryForm.department"
+                        class="filter-item"
+                        placeholder=""
+                        style="width: 150px;"
+                        @keyup.enter.native="queryHandle"
+                    />
+                </el-form-item>
+                <el-form-item label="职务">
+                    <el-input
+                        v-model="queryForm.job"
+                        class="filter-item"
+                        placeholder=""
+                        style="width: 150px;"
+                        @keyup.enter.native="queryHandle"
+                    />
+                </el-form-item>
+                <el-form-item>
+                    <el-button
+                        class="filter-item"
+                        type="primary"
+                        icon="el-icon-search"
+                        @click="queryHandle"
+                    />
+                </el-form-item>
+                <el-form-item>
+                    <el-button
+                        v-if="getBtnPermission('add')"
+                        v-show="userType != 3"
+                        class="filter-item"
+                        style="margin-left: 10px;"
+                        type="primary"
+                        icon="el-icon-plus"
+                        @click="showCreateHandle"
+                    >新增</el-button>
+                </el-form-item>
+                <el-form-item>
+                    <el-button
+                        v-if="getBtnPermission('import')"
+                        v-show="userType != 3"
+                        class="filter-item"
+                        style="margin-left: 10px;"
+                        type="primary"
+                        icon="el-icon-upload2"
+                        @click="showImportHandle"
+                    >导入</el-button>
+                </el-form-item>
+            </el-form>
+        </div>
+        <!--        <div style="display: block;margin-top: -10px;margin-bottom: 10px">-->
+        <!--            <div class="basic_search">-->
+        <!--                <span>区域:</span>-->
+        <!--                <el-select v-model="queryForm.province" clearable filterable @change="changeArea('province')">-->
+        <!--                    <el-option-->
+        <!--                        v-for="item in provinceList"-->
+        <!--                        :key="item.id"-->
+        <!--                        :label="item.name"-->
+        <!--                        :value="item.name"-->
+        <!--                    >-->
+        <!--                    </el-option>-->
+        <!--                </el-select>-->
+        <!--            </div>-->
+        <!--            <div class="basic_search">-->
+        <!--                <el-select v-model="queryForm.city" prop="city" clearable filterable @change="changeArea('city')">-->
+        <!--                    <el-option-->
+        <!--                        v-for="item in cityList"-->
+        <!--                        :key="item.id"-->
+        <!--                        :label="item.name"-->
+        <!--                        :value="item.name"-->
+        <!--                    >-->
+        <!--                    </el-option>-->
+        <!--                </el-select>-->
+        <!--            </div>-->
+        <!--            <div class="basic_search">-->
+        <!--                <el-select v-model="queryForm.area" clearable filterable @change="changeArea('area')">-->
+        <!--                    <el-option-->
+        <!--                        v-for="item in districtList"-->
+        <!--                        :key="item.id"-->
+        <!--                        :label="item.name"-->
+        <!--                        :value="item.name"-->
+        <!--                    >-->
+        <!--                    </el-option>-->
+        <!--                </el-select>-->
+        <!--            </div>-->
+        <!--            <div class="basic_search">-->
+        <!--                <el-select v-model="queryForm.town" clearable filterable @change="changeArea('town')" >-->
+        <!--                    <el-option-->
+        <!--                        v-for="item in streetList"-->
+        <!--                        :key="item.id"-->
+        <!--                        :label="item.name"-->
+        <!--                        :value="item.name"-->
+        <!--                    >-->
+        <!--                    </el-option>-->
+        <!--                </el-select>-->
+        <!--            </div>-->
+        <!--            <div class="basic_search">-->
+        <!--                <el-select v-model="queryForm.community" clearable filterable>-->
+        <!--                    <el-option-->
+        <!--                        v-for="item in committeeList"-->
+        <!--                        :key="item.id"-->
+        <!--                        :label="item.name"-->
+        <!--                        :value="item.name"-->
+        <!--                    >-->
+        <!--                    </el-option>-->
+        <!--                </el-select>-->
+        <!--            </div>-->
+        <!--        </div>-->
+        <div class="table_content">
+            <el-table
+                v-loading="listLoading"
+                :key="tableKey"
+                :data="userData"
+                border
+                fit
+                highlight-current-row
+                style="width: 100%;"
+                @sort-change="sortUserChange"
+            >
+                <el-table-column type="index" label="" align="center" width="60"/>
+                <el-table-column label="用户名" prop="username" align="center" sortable="custom" width="100px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.username }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="真实姓名" prop="realname" align="center" sortable="custom" width="100px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.realname }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="身份证号" prop="idcard" align="center" sortable="custom" width="100px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.idcard }}</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>
+                    </template>
+                </el-table-column>
+                <el-table-column label="职位" prop="job" align="center" sortable="custom" width="100px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.job }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="用户类型" prop="type" align="center" width="100px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.type | parseType}}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="角色" prop="role" align="center" width="100px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.roles | parseRoles }}</span>
+                    </template>
+                </el-table-column>
+
+                <el-table-column label="人脸数据" prop="code" 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">
+                    <template slot-scope="scope">
+                        <div v-for="item in isList">
+                            <div v-if="item.id === scope.row.ispass">
+                                <span>{{item.name}}</span>
+                            </div>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="考试合格有效期" prop="starttime" align="center" width="300px">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.starttime}}</span>
+                        <span>-</span>
+                        <span>{{ scope.row.endtime}}</span>
+                    </template>
+
+                </el-table-column>
+                <el-table-column label="是否单位负责人" prop="iscompany" align="center" width="100px">
+                    <template slot-scope="scope">
+                        <div v-for="item in isList">
+                            <div v-if="item.id === scope.row.iscompany">
+                                <span>{{item.name}}</span>
+                            </div>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="是否部门负责人" prop="isdepartment" align="center" width="100px">
+                    <template slot-scope="scope">
+                        <div v-for="item in isList">
+                            <div v-if="item.id === scope.row.isdepartment">
+                                <span>{{item.name}}</span>
+                            </div>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="状态" prop="status" align="center" width="100px">
+                    <template slot-scope="scope">
+                        <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>-->
+                <!--                    </template>-->
+                <!--                </el-table-column>-->
+                <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 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>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <br>
+            <el-pagination
+                v-show="recordTotal>0"
+                :current-page="currentPage"
+                :page-sizes="[10, 20, 30, 50]"
+                :page-size="pageSize"
+                :total="recordTotal"
+                layout="total, sizes, prev, pager, next, jumper"
+                background
+                style="float:right;"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+        <el-dialog :title="dialogStatus==='create'?'新增':'编辑'" :visible.sync="dialogFormVisible" :modal-append-to-body="false" :close-on-click-modal="false" width="50%">
+            <el-form ref="dataForm" :rules="dialogStatus==='create'?dataFormRules:rules" :model="dataForm" label-position="right" label-width="150px" style="padding-right: 50px" element-loading-text="保存中...">
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="用户名(手机号):" prop="username">
+                            <el-input v-model.trim="dataForm.username"/>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="真实姓名:" prop="realname">
+                            <el-input v-model.trim="dataForm.realname"/>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <div v-if="dialogStatus=='create'">
+                    <el-row>
+                        <el-col :span="12">
+                            <el-form-item label="密码:" prop="password">
+                                <el-input v-model.trim="dataForm.password" :type="passwordType" placeholder="请输入密码">
+                                    <el-button slot="append" icon="el-icon-view" @click="showPwd"/>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="确认密码:" prop="confirmPassword">
+                                <el-input v-model.trim="dataForm.confirmPassword" :type="confirmPasswordType" placeholder="请输入确认密码" @change="passwordChangeEvent">
+                                    <el-button slot="append" icon="el-icon-view" @click="showConfirmPwd"/>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+
+                </div>
+                <div v-else>
+                    <el-row>
+                        <el-col :span="12">
+                            <el-form-item label="密码:" prop="password">
+                                <el-input v-model.trim="dataForm.password" :type="passwordType" placeholder="请输入密码">
+                                    <el-button slot="append" icon="el-icon-view" @click="showPwd"/>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="确认密码:" prop="confirmPassword">
+                                <el-input v-model.trim="dataForm.confirmPassword" :type="confirmPasswordType" placeholder="请输入确认密码" @change="passwordChangeEvent">
+                                    <el-button slot="append" icon="el-icon-view" @click="showConfirmPwd"/>
+                                </el-input>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </div>
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="身份证号:" prop="idcard">
+                            <el-input v-model.trim="dataForm.idcard"/>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="邮箱:" prop="email">
+                            <el-input v-model.trim="dataForm.email"/>
+                        </el-form-item>
+                    </el-col>
+
+                </el-row>
+                <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-option
+                                    v-for="item in companyList"
+                                    :key="item.id"
+                                    :value="item.company"
+                                    :label="item.company"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="部门:" prop="department">
+                            <el-select v-model.trim="dataForm.department"  auto-complete="on" style="width:100%;">
+                                <el-option
+                                    v-for="item in departmentList"
+                                    :key="item.id"
+                                    :value="item.department"
+                                    :label="item.department"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                </el-row>
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="职务:" prop="job">
+                            <el-input v-model.trim="dataForm.job"/>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="用户类型:" prop="type">
+                            <el-select v-model.trim="dataForm.type" placeholder="请选择用户类型" auto-complete="on" style="width:100%;">
+                                <el-option
+                                    v-for="item in typeList"
+                                    :key="item.id"
+                                    :value="item.id"
+                                    :label="item.name"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                </el-row>
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="是否单位负责人:" prop="iscompany">
+                            <el-select v-model.trim="dataForm.iscompany"   style="width:100%;">
+                                <el-option
+                                    v-for="item in isList"
+                                    :key="item.id"
+                                    :value="item.id"
+                                    :label="item.name"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="是否部门负责人:" prop="isdepartment">
+                            <el-select v-model.trim="dataForm.isdepartment" style="width:100%;">
+                                <el-option
+                                    v-for="item in isList"
+                                    :key="item.id"
+                                    :value="item.id"
+                                    :label="item.name"
+                                >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="状态:" prop="status">
+                            <el-select v-model.trim="dataForm.status"  auto-complete="on" style="width:100%;">
+                                <el-option
+                                    v-for="item in statusList"
+                                    :key="item.id"
+                                    :value="item.id"
+                                    :label="item.name"
+                                >
+                                </el-option>
+                            </el-select>
+                        </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="importDialogFormVisible"
+            :modal-append-to-body="false"
+            :close-on-click-modal="false"
+            title="用户导入"
+            width="700px"
+        >
+            <el-form
+                ref="importForm"
+                label-position="right"
+                label-width="120px"
+                style="margin-left:50px;width:500px;"
+                element-loading-text="导入中..."
+            >
+                <el-form-item label="导入文件:">
+                    <input ref="importLabInput" type="file" accept=".xls, .xlsx" >
+                </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="importDialogFormVisible = false">取消</el-button>
+                <el-button :disabled="importDisabled" type="primary" @click="importHandle()">导入</el-button>
+            </div>
+        </el-dialog>
+        <div style="clear: both;"/>
+        <workLicense ref="workLicense"></workLicense>
+    </div>
+</template>
+
+<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 { checkBtnPermission } from '@/utils/permission'
+    import { roleList } from '@/api/role'
+    import { parseTime, computePageCount, parseUserType } from '@/utils'
+    import { parseError } from '@/utils/messageDialog'
+    import Cookies from 'js-cookie'
+    import { Message, MessageBox } from 'element-ui'
+    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')
+    export default {
+        name: 'UserTable',
+        filters: {
+            parseRoles(roles) {
+                if (!roles) {
+                    return
+                }
+                let message = ''
+                for (const role of roles) {
+                    message += role.name + ','
+                }
+                if (message) {
+                    message = message.substring(0, message.lastIndexOf(','))
+                }
+                return message
+            },
+            parseType(type){
+                let typeList = [{id:1,name:'超级管理员'},{id:2,name:'管理员'},{id:3,name:'普通用户'}]
+                if(type){
+                    let a = typeList.find(item => item.id === type)
+                    return a.name
+                }
+            },
+            parseStatus(status){
+                if(status === 1){
+                    return "正常"
+                }else if(status === 0){
+                    return "正常"
+                }
+            },
+            filterSafety(value) {
+                if (value) {
+                    return '是'
+                } else {
+                    return '否'
+                }
+            },
+            filterUserType(value) {
+                return parseUserType(value)
+            },
+            parseGX(value){
+                let arr = value.split('-');
+                let guanxia='';
+                for (let i = 0; i < arr.length; i++){
+                    if (arr[i] == null || arr[i] == '' || arr[i] == 'null'){
+                        if (i == 0){
+                            guanxia = '全部省份';
+                        }
+                        if (i == 1){
+                            guanxia += '-全部城市';
+                        }
+                        if (i == 2){
+                            guanxia += '-全部区县';
+                        }
+                        if (i == 3){
+                            guanxia += '-全部街道';
+                        }
+                        if (i == 4){
+                            guanxia += '-全部居委会';
+                        }
+                    }else {
+                        if (i == 0){
+                            guanxia = arr[i];
+                        }else {
+                            guanxia += '-'+arr[i];
+                        }
+                    }
+                }
+                return guanxia;
+            }
+        },
+        computed: {
+            ...mapGetters([
+                'userType',
+                'username'
+            ])
+        },
+        components:{
+            workLicense
+        },
+        data() {
+            let _ref = this;
+            const validateEmail = (rule, value, callback) => {
+
+                if (value == null || value == '') {
+                    callback()
+                } else {
+                    // 对电子邮件的验证
+                    const myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\-|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
+                    if (!myreg.test(value)) {
+                        return callback(new Error('请输入有效的邮箱格式'))
+                    }
+                    callback()
+                }
+            }
+
+            return {
+                sort:'username',
+                order:'asc',
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                tableKey: 0,
+                userData: null,
+                listLoading: true,
+                iscompanyList:[{id:1,name:'否'},{id:0,name:'是'}],
+                queryForm: {
+                    username: '',
+                    company:'',
+                    department:'',
+                    job:'',
+                    province:'',
+                    city:'',
+                    area:'',
+                    town:'',
+                    community:'',
+                },
+                dataForm: {
+                    id: '',
+                    username: '',
+                    password: '',
+                    realname:'',
+                    idcard:'',
+                    email:'',
+                    company:'',
+                    department:'',
+                    job:'',
+                    type:'',
+                    iscompany:'',
+                    isdepartment:'',
+                    ispass:'',
+                    starttime:'',
+                    endtime:'',
+                    status:'',
+                    createdby:'',
+                    createddate:'',
+                    lastmodifiedby:'',
+                    lastmodifieddate:'',
+                },
+                importDialogFormVisible: false,
+                importDisabled: false,
+                dialogFormVisible: false,
+                dialogStatus: '',
+                dataFormRules: {
+                    username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
+                    realname: [{ required: true, message: '真实姓名不能为空', trigger: 'blur' }],
+                    // email: [{ validator: validateEmail, trigger: 'blur' }],
+                    password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
+                    confirmPassword: [{ required: true, message: '确认密码不能为空', trigger: 'blur' }],
+                    type: [{ required: true, message: '用户类型不能为空', trigger: 'change' }],
+                    status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
+                },
+                rules: {
+                    username: [{ required: true, message: '用户名不能为空', trigger: 'blur' }],
+                    realname: [{ required: true, message: '真实姓名不能为空', trigger: 'blur' }],
+                    // email: [{ validator: validateEmail, trigger: 'blur' }],
+                    // password: [{ required: true, message: '密码不能为空', trigger: 'blur' }],
+                    // confirmPassword: [{ required: true, message: '确认密码不能为空', trigger: 'blur' }],
+                    type: [{ required: true, message: '用户类型不能为空', trigger: 'change' }],
+                    status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
+                },
+                isList:[{id:1,name:'是'},{id:0,name:'否'}],
+                typeList:[{id:1,name:'超级管理员'},{id:2,name:'管理员'},{id:3,name:'普通用户'}],
+                dialogUserRoleFormVisible: false,
+                userRoleDataForm: {
+                    userRoles: [],
+                    userId: ''
+                },
+                userRoleDataFormRules: {
+                    userRoles: [{ type: 'array', required: true, message: '角色不能为空', trigger: 'change' }]
+                },
+                roleList: [],
+                passwordType: 'password',
+                confirmPasswordType: 'password',
+                templateRadio: '',
+                instituteList: [],
+                departmentList: [],
+                companyList:[],
+                statusList:[{id:1,name:'正常'},{id:0,name:'停用'}],
+            }
+        },
+        created() {
+            console.log(this.userType)
+            this.getUserList()
+            this.getProvince()
+            this.getDepartmentData()
+            this.getCompanyData()
+        },
+        methods: {
+            refreshHandle: function() {
+                this.getUserList()
+            },
+            queryHandle: function() {
+                this.currentPage = 1
+                this.getUserList()
+            },
+            sortUserChange: function(param) {
+                this.sort = param.prop;
+                this.order = param.order;
+                this.getUserList()
+            },
+            getUserList() {
+                const _this = this
+                const params = {}
+                params['sort'] = _this.sort
+                params['order'] = _this.order
+                params['pageIndex'] = _this.currentPage
+                params['pageSize'] = _this.pageSize
+                params['type'] = _this.userType
+                for (const i in _this.queryForm) {
+                    if (_this.queryForm[i] != undefined && _this.queryForm[i].toString() != '') {
+                        params[i] = _this.queryForm[i]
+                    }
+                }
+                _this.listLoading = true
+                userList(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200) {
+                        const result = res.result
+                        _this.recordTotal = result.totalCount
+                        _this.pageSize = result.pageSize
+                        _this.pageTotal = computePageCount(result.totalCount, result.pageSize)
+                        _this.currentPage = result.pageIndex
+                        _this.userData = result.result
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                    _this.listLoading = false
+                }).catch(error => {
+                    _this.listLoading = false
+                    parseError({ error: error, vm: _this })
+                })
+            },
+
+            showWorkLicense(row){
+                this.$refs.workLicense.openWorkLicense(row)
+            },
+
+            createHandle: function() {
+                this.$refs['dataForm'].validate((valid) => {
+                    const _this = this
+                    if (valid) {
+                        if (_this.dataForm.password != _this.dataForm.confirmPassword) {
+                            parseError({ error: '密码输入不一致', vm: _this })
+                            return
+                        }
+                        const userName = Cookies.get('userName')
+                        _this.dataForm['operator'] = userName
+                        createUser(_this.dataForm).then(response => {
+                            const res = response.data
+                            if (res.code == 200) {
+                                _this.dialogFormVisible = false
+                                _this.$message({
+                                    message: '创建成功',
+                                    type: 'success'
+                                })
+                                _this.getUserList()
+                            } else {
+                                parseError({ error: res.data.message, vm: _this })
+                            }
+                        }).catch(error => {
+                            parseError({ error: error, vm: _this })
+                        })
+                    }
+                })
+            },
+            deleteHandle: function(row) {
+                const _this = this
+                MessageBox.confirm('确定删除用户' + row.username + '信息', '确定删除', {
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
+                }).then(() => {
+                    _this.deleteAction(row)
+                }).catch(() => {
+                    console.log('已取消删除')
+                })
+            },
+            deleteAction: function(row) {
+                const _this = this
+                const params = {}
+                params['id'] = row.id
+                const userName = Cookies.get('userName')
+                const name = Cookies.get('name')
+                params['operator'] = name + '(' + userName + ')'
+                deleteUser(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200) {
+                        _this.$message({
+                            message: '删除成功',
+                            type: 'success'
+                        })
+                        _this.getUserList()
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                    parseError({ error: error, vm: _this })
+                })
+            },
+            resetDataForm() {
+                this.dataForm = {
+                    id: '',
+                    username: '',
+                    password: '',
+                    realname:'',
+                    idcard:'',
+                    email:'',
+                    company:'',
+                    department:'',
+                    job:'',
+                    type:'',
+                    iscompany:'',
+                    isdepartment:'',
+                    ispass:'',
+                    starttime:'',
+                    endtime:'',
+                    status:'',
+                    createdby:'',
+                    createddate:'',
+                    lastmodifiedby:'',
+                    lastmodifieddate:'',
+                }
+            },
+            getDepartmentData(){
+                getAllDepartment().then(res=>{
+                    if(res.data.code === '200'){
+                        this.departmentList = res.data.result
+                    }else{
+                        this.$message({
+                            type:'warning',
+                            message:res.data.message
+                        })
+                    }
+                }).catch(error =>{
+                    parseError({error:error,vm:this})
+                })
+            },
+            getCompanyData(){
+                getAllCompany().then(res=>{
+                    if(res.data.code === '200'){
+                        this.companyList = res.data.result
+                    }else{
+                        this.$message({
+                            type:'warning',
+                            message:res.data.message
+                        })
+                    }
+                }).catch(error =>{
+                    parseError({error:error,vm:this})
+                })
+            },
+            showCreateHandle() {
+                this.resetDataForm()
+                this.dialogStatus = 'create'
+                this.dialogFormVisible = true
+                this.$nextTick(() => {
+                    this.$refs['dataForm'].clearValidate()
+                })
+            },
+            updateHandle() {
+                this.$refs['dataForm'].validate((valid) => {
+                    const _this = this
+                    if (valid) {
+                        if (_this.dataForm.password || _this.dataForm.confirmPassword) {
+                            if (_this.dataForm.password != _this.dataForm.confirmPassword) {
+                                parseError({ error: '密码输入不一致', vm: _this })
+                                return
+                            }
+                        }
+                        const userName = Cookies.get('userName')
+                        _this.dataForm['lastmodifiedby'] = userName
+                        updateUser(_this.dataForm).then(response => {
+                            const res = response.data
+                            if (res.code == 200) {
+                                _this.dialogFormVisible = false
+                                _this.$message({
+                                    message: '更新成功',
+                                    type: 'success'
+                                })
+                                _this.getUserList()
+                            } else {
+                                parseError({ error: res.data.message, vm: _this })
+                            }
+                        }).catch(error => {
+                            parseError({ error: error, vm: _this })
+                        })
+                    }
+                })
+            },
+            getRoleList: async function() {
+                const _this = this
+                const params = {}
+                roleList(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200) {
+                        const roleList = res.result
+                        _this.roleList = roleList
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                })
+            },
+            showAssignRole: async function(row) {
+                await this.getRoleList()
+
+                this.userRoleDataForm.userId = row.id
+
+                this.$nextTick(() => {
+                    const assigedRoles = []
+                    if (row.roles) {
+                        for (const role of row.roles) {
+                            assigedRoles.push(role.id)
+                        }
+                    }
+                    this.userRoleDataForm.userRoles = assigedRoles
+                })
+                this.dialogUserRoleFormVisible = true
+                this.$nextTick(() => {
+                    this.$refs['userRoleDataForm'].clearValidate()
+                })
+            },
+            assignUserRoleHandle: function() {
+                const _this = this
+                this.$refs['userRoleDataForm'].validate((valid) => {
+                    if (valid) {
+                        const userName = Cookies.get('userName')
+                        const params = {}
+                        params['id'] = _this.userRoleDataForm.userId
+                        params['roles'] = _this.userRoleDataForm.userRoles
+                        updateUserRole(params).then(response => {
+                            const res = response.data
+                            if (res.code == 200) {
+                                _this.dialogUserRoleFormVisible = false
+                                _this.$message({
+                                    message: '角色分配成功',
+                                    type: 'success'
+                                })
+                                _this.getUserList()
+                            } else {
+                                parseError({ error: res.data.message, vm: _this })
+                            }
+                        })
+                    }
+                })
+            },
+            showEditHandle: function(row) {
+                this.resetDataForm()
+                this.dataForm = row
+                this.dataForm.password = null
+                this.dialogStatus = 'update'
+                this.dialogFormVisible = true
+                this.$nextTick(() => {
+                    this.$refs['dataForm'].clearValidate()
+                })
+
+            },
+            passwordChangeEvent: function(value) {
+                if (this.dataForm.password != value) {
+                    parseError({ error: '密码输入不一致', vm: this })
+                }
+            },
+            showPwd() {
+                if (this.passwordType === 'password') {
+                    this.passwordType = ''
+                } else {
+                    this.passwordType = 'password'
+                }
+            },
+            showConfirmPwd() {
+                if (this.confirmPasswordType === 'password') {
+                    this.confirmPasswordType = ''
+                } else {
+                    this.confirmPasswordType = 'password'
+                }
+            },
+            handleSizeChange: function(val) {
+                this.pageSize = val
+                this.currentPage = 1
+                this.getUserList()
+            },
+            handleCurrentChange: function(val) {
+                this.currentPage = val
+                this.getUserList()
+            },
+            getTemplateRow(row) {
+                console.log(row, '22222')
+            },
+            handleInstituteChange(value) {
+                if (value) {
+                    this.dataForm.departmentId = ''
+                }
+            },
+            disableRole(row) {
+                if (row.type == 1) {
+                    return true
+                } else {
+                    return false
+                }
+            },
+            getRoleInfo(role) {
+                return role.name
+            },
+            getBtnPermission(btnType) {
+                return checkBtnPermission(this.userType, btnType)
+            },
+            showImportHandle() {
+                this.importDisabled = false
+                this.importDialogFormVisible = true
+            },
+            viewHandle() {
+                window.open(exampleFile, '_blank')
+            },
+            importHandle() {
+                const _this = this
+                const formData = new FormData()
+                const userName = Cookies.get('userName')
+                formData.append('operator', userName)
+                const files = this.$refs['importLabInput'].files
+                if (files && files.length > 0) {
+                    formData.append('file', files[0])
+                }
+                formData.append('action', 'import')
+                importSupplierUser(formData)
+                    .then((response) => {
+                        const res = response.data
+                        if (res.code == 200) {
+                            _this.importDialogFormVisible = false
+                            _this.$message({
+                                message: '导入成功',
+                                type: 'success'
+                            })
+                            _this.getUserList()
+                        } else {
+                            parseError({ error: res.data.message, vm: _this })
+                        }
+                    })
+                    .catch((error) => {
+                        parseError({ error: error, vm: _this })
+                    })
+            },
+            getProvince(){
+                const _this = this
+                const params = {}
+                params['parenttype'] = 0
+                params['type'] = 1
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.provinceList = res.result;
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            resetCity(name){
+                const _this = this
+                const params = {}
+                params['parentname'] = name
+                params['parenttype'] = 1
+                params['type'] = 2
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.cityList = res.result;
+                        this.areaList = [];
+                        this.townList = [];
+                        this.communityList = [];
+                        this.dataForm.city = '';
+                        this.dataForm.area = '';
+                        this.dataForm.town = '';
+                        this.dataForm.community = '';
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            resetArea(name){
+                const _this = this
+                const params = {}
+                params['parentname'] = name
+                params['parenttype'] = 2
+                params['type'] = 3
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.areaList = res.result;
+                        this.townList = [];
+                        this.communityList = [];
+                        this.dataForm.area = '';
+                        this.dataForm.town = '';
+                        this.dataForm.community = '';
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            resetTown(name){
+                const _this = this
+                const params = {}
+                params['parentname'] = name
+                params['parenttype'] = 3
+                params['type'] = 4
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.townList = res.result;
+                        this.communityList = [];
+                        this.dataForm.town = '';
+                        this.dataForm.community = '';
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            resetCommunity(name){
+                const _this = this
+                const params = {}
+                params['parentname'] = name
+                params['parenttype'] = 4
+                params['type'] = 5
+                getDistrict(params).then(response => {
+                    const res = response.data
+                    if (res.code == 200){
+                        this.communityList = res.result;
+                        this.dataForm.community = '';
+                    } else {
+                        parseError({ error: res.data.message, vm: _this })
+                    }
+                }).catch(error => {
+                })
+            },
+            async changeArea(value){
+                if(value === 'province'){
+                    this.queryForm.city = ''
+                    this.queryForm.area = ''
+                    this.queryForm.town = ''
+                    this.queryForm.community = ''
+                    this.areaListQuery = {
+                        type: 2,
+                        parenttype: 1,
+                        parentname: this.queryForm.province,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.cityList = res.data.result
+                    }
+                }else if(value === 'city'){
+                    this.queryForm.area = ''
+                    this.queryForm.town = ''
+                    this.queryForm.community = ''
+                    this.areaListQuery = {
+                        type: 3,
+                        parenttype: 2,
+                        parentname: this.queryForm.city,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.districtList = res.data.result
+                    }
+                }else if(value === 'area'){
+                    this.queryForm.town = ''
+                    this.queryForm.community = ''
+                    this.areaListQuery = {
+                        type: 4,
+                        parenttype: 3,
+                        parentname: this.queryForm.area,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.streetList = res.data.result
+                    }
+                }else if(value === 'town'){
+                    this.queryForm.community = ''
+                    this.areaListQuery = {
+                        type: 5,
+                        parenttype: 4,
+                        parentname: this.queryForm.town,
+                    }
+                    let res = await getCityListData(this.areaListQuery)
+                    if(res.data.code === "200"){
+                        this.committeeList = res.data.result
+                    }
+                }
+            },//市、镇、街道、委员会
+        }
+    }
+</script>
+<style lang="scss" scoped>
+    .basic_search{
+        display:inline-block;
+    }
+</style>
diff --git a/src/views/contractor/workStatistics/index.vue b/src/views/contractor/workStatistics/index.vue
new file mode 100644
index 0000000..9680eed
--- /dev/null
+++ b/src/views/contractor/workStatistics/index.vue
@@ -0,0 +1,206 @@
+<template>
+    <div class="app-container">
+        <div class="filter-container">
+            <div class="basic_search">
+                <span>单位名称:</span>
+                <el-input v-model="company" style="width:150px" @change="getTroubleData">
+                </el-input>
+            </div>
+            <div class="basic_search">
+                <span>作业状态:</span>
+                <el-select v-model="status" style="width:150px" clearable @change="getTroubleData">
+                    <el-option
+                    v-for="item in statusList"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                    >
+                    </el-option>
+                </el-select>
+            </div>
+            <div class="basic_search">
+                <span>审批状态:</span>
+                <el-select v-model="flag" style="width:150px" clearable @change="getTroubleData">
+                    <el-option
+                        v-for="item in flagList"
+                        :key="item.id"
+                        :label="item.name"
+                        :value="item.id"
+                    >
+                    </el-option>
+                </el-select>
+            </div>
+            <div class="basic_search">
+                <span>开始时间:</span>
+                <el-date-picker
+                    @change="getTroubleData"
+                    v-model="starttime"
+                    align="right"
+                    value-format="yyyy-MM-dd"
+                    placeholder="开始时间">
+                </el-date-picker>
+            </div>
+            <div class="basic_search">
+                <span>结束时间:</span>
+                <el-date-picker
+                    @change="getTroubleData"
+                    v-model="endtime"
+                    align="right"
+                    value-format="yyyy-MM-dd"
+                    placeholder="开始时间">
+                </el-date-picker>
+            </div>
+            <el-button style="margin-left: 10px;" type="primary" icon="el-icon-refresh" @click="refreshHandle">搜索</el-button>
+        </div>
+        <div class="table_content">
+            <el-table
+                v-loading="listLoading"
+                :key="tableKey"
+                :data="troubleData"
+                border
+                fit
+                highlight-current-row
+                style="width: 100%;"
+            >
+                <el-table-column label="单位名称" prop="constructionunit" align="center">
+                </el-table-column>
+                <el-table-column label="作业类型" prop="type" align="center">
+                </el-table-column>
+                <el-table-column label="作业数量" prop="countNum" align="center">
+                </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="showTroubleDetail(scope.row)">详情</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <br>
+            <el-pagination
+                v-show="recordTotal>0"
+                :current-page="currentPage"
+                :page-sizes="[10, 20, 30, 50]"
+                :page-size="pageSize"
+                :total="recordTotal"
+                layout="total, sizes, prev, pager, next, jumper"
+                background
+                style="float:right;"
+                @size-change="handleSizeChange"
+                @current-change="handleCurrentChange"
+            />
+            <br>
+            <work-detail ref="workDetail"></work-detail>
+        </div>
+    </div>
+</template>
+
+<script>
+    import workDetail from './workDetail/index'
+    import { mapGetters } from 'vuex'
+    import { computePageCount } from '../../../utils'
+    import { getWorkList } from '../../../api/troubleStatistics'
+
+    export default {
+        name: 'index',
+        filters: {
+            parseMain(type){
+                if(type === 1){
+                    return "是"
+                }else if(type === 0){
+                    return "否"
+                }
+            },
+        },
+        components:{
+            workDetail
+        },
+        computed: {
+            ...mapGetters([
+                'userType'
+            ])
+        },
+        data() {
+            return {
+                tableKey: 0,
+                troubleData: [],
+                statusList:[
+                    {id:0,name:'已驳回'},
+                    {id:1,name:'未提交'},
+                    {id:2,name:'已提交'},
+                    {id:3,name:'施工单位已确认'},
+                    {id:4,name:'动火部位负责人审批通过'},
+                    {id:5,name:'相关部门审批通过'},
+                    {id:6,name:'安全部门审批通过'},
+                    {id:7,name:'审批通过'},
+                ],
+                flagList:[
+                    {id:0,name:'待提交'},
+                    {id:1,name:'作业中止'},
+                    {id:2,name:'等待检查'},
+                    {id:3,name:'等待开始'},
+                    {id:4,name:'作业中'},
+                    {id:5,name:'作业完成'},
+                ],
+                listLoading: false,
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                company:'',
+                starttime:'',
+                endtime:'',
+                status:'',
+                flag:'',
+            }
+        },
+        created() {
+            this.getTroubleData()
+        },
+        methods: {
+            async getTroubleData(){
+                this.listLoading = true
+                let params = {}
+                params['pageIndex'] = this.currentPage
+                params['pageSize'] = this.pageSize
+                params['company'] = this.company
+                params['starttime'] = this.starttime
+                params['endtime'] = this.endtime
+                params['status'] = this.status
+                params['flag'] = this.flag
+                let res = await getWorkList(params)
+                if(res.data.code === '200'){
+                    this.recordTotal = res.data.result.totalCount
+                    this.pageSize = res.data.result.pageSize
+                    this.pageTotal = computePageCount(res.data.result.totalCount, res.data.result.pageSize)
+                    this.currentPage = res.data.result.pageIndex
+                    this.troubleData = res.data.result.result
+                }else{
+                    this.$message({
+                        message:res.data.message,
+                        type:'warning'
+                    })
+                }
+                this.listLoading = false
+            },
+            showTroubleDetail(val){
+                this.$refs.workDetail.showTroubleDetail(val.constructionunit,this.status,this.flag,this.starttime,this.endtime,val.type)
+            },
+            refreshHandle(){
+                this.getTroubleData()
+            },
+            handleSizeChange(val){
+                this.pageSize = val
+                this.getTroubleData()
+            },
+            handleCurrentChange(val){
+                this.currentPage = val
+                this.getTroubleData()
+            },
+        }
+    }
+</script>
+<style scoped>
+    .basic_search{
+        display:inline-block;
+        padding-bottom: 10px;
+    }
+</style>
diff --git a/src/views/contractor/workStatistics/workDetail/index.vue b/src/views/contractor/workStatistics/workDetail/index.vue
new file mode 100644
index 0000000..3f75392
--- /dev/null
+++ b/src/views/contractor/workStatistics/workDetail/index.vue
@@ -0,0 +1,197 @@
+<template>
+    <el-dialog :title="title" :visible.sync="troubleDetailVisible" :modal-append-to-body="false" :close-on-click-modal="false" width="70%">
+        <div class="app-container">
+            <div class="table_content">
+                <el-table
+                    v-loading="listLoading"
+                    :key="tableKey"
+                    :data="troubleDetailData"
+                    border
+                    fit
+                    highlight-current-row
+                    style="width: 100%;"
+                >
+                    <el-table-column type="index" label="序号" align="center" width="80"/>
+                    <el-table-column label="单位名称" prop="unit" align="center">
+                    </el-table-column>
+                    <el-table-column label="单位代码" prop="code" align="center">
+                    </el-table-column>
+                    <el-table-column label="申请人" prop="applicant" align="center">
+                    </el-table-column>
+                    <el-table-column label="施工单位" prop="constructionunit" align="center">
+                    </el-table-column>
+                    <el-table-column label="作业内容" prop="area" align="center">
+                    </el-table-column>
+                    <el-table-column label="开始时间" prop="starttime" align="center">
+                    </el-table-column>
+                    <el-table-column label="结束时间" prop="endtime" align="center">
+                    </el-table-column>
+                    <el-table-column label="作业级别" prop="level" align="center">
+                        <template slot-scope="scope">
+                            <div v-for="item in levelList">
+                                <div v-if="scope.row.level === item.id">
+                                    <span>{{item.name}}</span>
+                                    <!--                                <el-tag v-if="scope.row.level ===0" type="success">{{item.name}}</el-tag>-->
+                                    <!--                                <el-tag v-if="scope.row.level ===1" type="warning">{{item.name}}</el-tag>-->
+                                    <!--                                <el-tag v-if="scope.row.level ===2" type="danger">{{item.name}}</el-tag>-->
+                                </div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="任务审批状态" prop="status" align="center">
+                        <template slot-scope="scope">
+                            <div v-for="item in statusList">
+                                <div v-if="scope.row.status === item.id">
+                                    <span>{{item.name}}</span>
+                                </div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="作业状态" prop="flag" align="center">
+                        <template slot-scope="scope">
+                            <div v-for="item in flagList">
+                                <div v-if="scope.row.flag === item.id">
+                                    <span>{{item.name}}</span>
+                                </div>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <br>
+                <el-pagination
+                    v-show="recordTotal>0"
+                    :current-page="currentPage"
+                    :page-sizes="[10, 20, 30, 50]"
+                    :page-size="pageSize"
+                    :total="recordTotal"
+                    layout="total, sizes, prev, pager, next, jumper"
+                    background
+                    style="float:right;"
+                    @size-change="handleSizeChange"
+                    @current-change="handleCurrentChange"
+                />
+                <br>
+            </div>
+            <el-dialog :visible.sync="dialogVisible" :append-to-body="true">
+                <img width="100%" :src="dialogImageUrl" alt="">
+            </el-dialog>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+    import { mapGetters } from 'vuex'
+    import { getWorkDetailList } from '../../../../api/troubleStatistics'
+    import { computePageCount } from '../../../../utils'
+
+    export default {
+        name: 'index',
+        filters: {
+            parseMain(type){
+                if(type === 1){
+                    return "是"
+                }else if(type === 0){
+                    return "否"
+                }
+            },
+        },
+        computed: {
+            ...mapGetters([
+                'userType'
+            ])
+        },
+        data() {
+            return {
+                tableKey: 0,
+                troubleDetailData: [],
+                levelList:[{id:2,name:'特级'},{id:1,name:'一级'},{id:0,name:'二级'},],
+                statusList:[
+                    {id:0,name:'已驳回'},
+                    {id:1,name:'未提交'},
+                    {id:2,name:'已提交'},
+                    {id:3,name:'施工单位已确认'},
+                    {id:4,name:'动火部位负责人审批通过'},
+                    {id:5,name:'相关部门审批通过'},
+                    {id:6,name:'安全部门审批通过'},
+                    {id:7,name:'审批通过'},
+                ],
+                flagList:[
+                    {id:0,name:'待提交'},
+                    {id:1,name:'作业中止'},
+                    {id:2,name:'等待检查'},
+                    {id:3,name:'等待开始'},
+                    {id:4,name:'作业中'},
+                    {id:5,name:'作业完成'},
+                ],
+                listLoading: false,
+                pageSize: 10,
+                recordTotal: 0,
+                currentPage: 1,
+                pageTotal: 0,
+                title:'',
+                company:'',
+                starttime:'',
+                endtime:'',
+                status:'',
+                flag:'',
+                troubleDetailVisible:false,
+                dialogImageUrl:'',
+                dialogVisible:false,
+            }
+        },
+        created() {
+        },
+        methods: {
+            showTroubleDetail(company,status,flag,starttime,endtime,type){
+                this.troubleDetailVisible = true
+                this.starttime = starttime
+                this.status = status
+                this.flag = flag
+                this.endtime = endtime
+                this.company = company
+                this.type = type
+                this.getTroubleData()
+            },
+            async getTroubleData(){
+                this.listLoading = true
+                let params = {}
+                params['pageIndex'] = this.currentPage
+                params['pageSize'] = this.pageSize
+                params['company'] = this.company
+                params['starttime'] = this.starttime
+                params['endtime'] = this.endtime
+                params['status'] = this.status
+                params['flag'] = this.flag
+                params['type'] = this.type
+                let res = await getWorkDetailList(params)
+                if(res.data.code === '200'){
+                    this.recordTotal = res.data.result.totalCount
+                    this.pageSize = res.data.result.pageSize
+                    this.pageTotal = computePageCount(res.data.result.totalCount, res.data.result.pageSize)
+                    this.currentPage = res.data.result.pageIndex
+                    this.troubleDetailData = res.data.result.result
+                }else{
+                }
+                this.listLoading = false
+            },
+            reportResources(file){
+                this.dialogImageUrl = file.url;
+                this.dialogVisible = true;
+            },
+            handleSizeChange(val){
+                this.pageSize = val
+                this.getTroubleData()
+            },
+            handleCurrentChange(val){
+                this.currentPage = val
+                this.getTroubleData()
+            },
+        }
+    }
+</script>
+<style scoped>
+    .basic_search{
+        display:inline-block;
+        padding-bottom: 10px;
+    }
+</style>

--
Gitblit v1.9.2