MrShi
2024-01-26 58c2e3e1dd75513b90f878684e913d85db41cc41
Mr.Shi
已添加5个文件
已修改17个文件
1196 ■■■■ 文件已修改
company/.env 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/public/file/typeWork.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/company.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/companyPermission.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/insurance.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/smsEmail.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/solutions.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/business/worktype.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/api/system/user.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaCompanyWindow.vue 241 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaInsuranceDescWindow.vue 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaInsuranceWindow.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaSolutionsDescWindow.vue 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/business/OperaSolutionsWindow.vue 229 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/common/UploadAvatarImage.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/system/user/OperaUserWindow.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/components/system/user/allocationEnterprises.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/company.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/insurance.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/business/solutions.vue 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/src/views/system/user.vue 102 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company/.env
@@ -4,7 +4,7 @@
VUE_APP_ROUTER_MODE = 'hash'
# é¡¹ç›®ä¸Šä¸‹æ–‡è·¯å¾„
VUE_APP_CONTEXT_PATH = './'
VUE_APP_CONTEXT_PATH = '/'
# æŽ¥å£å‰ç¼€
VUE_APP_API_PREFIX = '/'
VUE_APP_API_PREFIX = '/api'
company/.env.development
@@ -1,6 +1,6 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
VUE_APP_API = 'http://192.168.0.104:10023/'
# VUE_APP_API = 'http://192.168.0.104:10023/'
# VUE_APP_API = 'http://192.168.0.134:10023/'
VUE_APP_API = 'http://192.168.0.134:10023/'
company/public/file/typeWork.xlsx
Binary files differ
company/src/api/business/company.js
@@ -16,3 +16,8 @@
export function updateById (data) {
    return request.post('/business/company/updateById', data)
}
// æŸ¥è¯¢å…¨éƒ¨æ•°æ®(账号分配企业使用)
export function pageAll (data) {
    return request.post('/business/company/pageAll', data)
}
company/src/api/business/companyPermission.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
import request from '../../utils/request'
// è´¦å·åˆ†é…ä¼ä¸š
export function create (data) {
    return request.post('/business/companyPermission/create', data)
}
company/src/api/business/insurance.js
@@ -20,7 +20,17 @@
    return request.post('/business/insurance/create', data)
}
// æŸ¥è¯¢å…¨éƒ¨
export function all (data) {
    return request.post('/business/insurance/list', data)
}
// ä¿®æ”¹
export function updateById (data) {
    return request.post('/business/insurance/updateById', data)
}
// ä¿®æ”¹çŠ¶æ€
export function updateStatus (data) {
    return request.post('/business/insurance/updateStatus', data)
}
company/src/api/business/smsEmail.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
import request from '../../utils/request'
// å‘送短信验证码
export function sendSms (data) {
    return request.post('/business/smsEmail/sendSms', data)
}
company/src/api/business/solutions.js
@@ -12,7 +12,22 @@
    return request.post('/business/solutions/create', data)
}
// æŸ¥è¯¢å…¨éƒ¨ä¿é™©æ–¹æ¡ˆ
export function all (data) {
    return request.post('/business/solutions/list', data)
}
// ç¦ç”¨å¯ç”¨
export function updateStatus (data) {
    return request.post('/business/solutions/updateStatus', data)
}
// ä¿®æ”¹
export function updateById (data) {
    return request.post('/business/solutions/updateById', data)
}
// æ ¹æ®ID查询
export function solutionsId (id) {
    return request.get(`/business/solutions/${id}`)
}
company/src/api/business/worktype.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
import request from '../../utils/request'
// å¯¼å…¥æ¨¡æ¿
export function importExcel (data) {
    return request.post(`/business/worktype/importExcel`, data)
}
// æŸ¥è¯¢å…¨éƒ¨å·¥ç§
export function all (data) {
    return request.post(`/business/worktype/list`, data)
}
company/src/api/system/user.js
@@ -42,3 +42,8 @@
export function resetPwd (data) {
  return request.post('/system/user/resetPwd', data)
}
// é‡ç½®å¯†ç 
export function updUserStatus (params) {
  return request.get('/system/user/updUserStatus', {params})
}
company/src/components/business/OperaCompanyWindow.vue
@@ -13,17 +13,21 @@
            <el-form-item label="统一信用代码" prop="code">
                <el-input v-model="form.code" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="法人姓名" prop="legalName">
                <el-input v-model="form.legalName" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="绑定手机号" prop="phone">
                <div style="width: 100%; display: flex; align-items: center;">
                    <el-input v-model="form.phone" style="flex: 1;" placeholder="请输入" v-trim/>
                    <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;">发送验证码</el-button>
                    <el-input v-model="form.phone" maxlength="11" type="number" style="flex: 1;" placeholder="请输入" v-trim/>
                    <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;" @click="send" v-if="num === 0">发送验证码</el-button>
                    <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;" v-else>{{num}}s</el-button>
                </div>
            </el-form-item>
            <el-form-item label="验证码" prop="code">
                <el-input v-model="form.code" placeholder="请输入" v-trim/>
            <el-form-item label="验证码" prop="captche">
                <el-input v-model="form.captche" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="公司账号" prop="taxAccount">
                <el-input v-model="form.taxAccount" placeholder="请输入" v-trim/>
            <el-form-item label="公司账号" prop="username">
                <el-input v-model="form.username" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="认证邮箱" prop="email">
                <el-input v-model="form.email" placeholder="请输入" v-trim/>
@@ -31,8 +35,8 @@
            <el-form-item label="纳税人识别号" prop="taxCode">
                <el-input v-model="form.taxCode" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="银行账号" prop="taxBank">
                <el-input v-model="form.taxBank" placeholder="请输入" v-trim/>
            <el-form-item label="银行账号" prop="taxAccount">
                <el-input v-model="form.taxAccount" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="开户行" prop="taxBank">
                <el-input v-model="form.taxBank" placeholder="请输入" v-trim/>
@@ -46,34 +50,23 @@
            <el-form-item label="纸质发票接收地址" prop="invoiceAddr">
                <el-input v-model="form.invoiceAddr" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="营业执照" prop="invoiceAddr">
                <el-upload
                    action="https://jsonplaceholder.typicode.com/posts/"
                    list-type="picture-card"
                    :on-remove="handleRemove">
                    <i class="el-icon-plus"></i>
                </el-upload>
            <el-form-item label="营业执照" prop="businessImg">
                <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="file" @uploadSuccess="result" />
            </el-form-item>
            <el-form-item label="法人身份证" prop="invoiceAddr">
                <el-upload
                    action="https://jsonplaceholder.typicode.com/posts/"
                    list-type="picture-card"
                    :on-remove="handleRemove">
                    <i class="el-icon-plus"></i>
                </el-upload>
            <el-form-item label="法人身份证" prop="idcardImgList">
                <div style="width: 100%; display: flex; align-items: center;">
                    <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="file1" @uploadSuccess="result1" />
                    <div style="width: 15px;height: 100%;"></div>
                    <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="file2" @uploadSuccess="result2" />
                </div>
            </el-form-item>
            <el-form-item label="电子签章" prop="invoiceAddr">
                <el-upload
                    action="https://jsonplaceholder.typicode.com/posts/"
                    list-type="picture-card"
                    :on-remove="handleRemove">
                    <i class="el-icon-plus"></i>
                </el-upload>
            <el-form-item label="电子签章" prop="signImg">
                <UploadAvatarImage :uploadData="{ folder: 'company' }" :file="file3" @uploadSuccess="result3" />
            </el-form-item>
        </el-form>
        <el-button type="primary" style="margin-bottom: 15px;">添加</el-button>
        <el-button type="primary" style="margin-bottom: 15px;" @click="add">添加</el-button>
        <el-table
            :data="tableData"
            :data="form.solutionList"
            border
            style="width: 100%">
            <el-table-column
@@ -88,12 +81,12 @@
                align="center"
                label="保险方案">
                <template slot-scope="{row}">
                    <el-select v-model="row.info" placeholder="请选择">
                    <el-select v-model="row.solutionBaseId" placeholder="请选择">
                        <el-option
                            v-for="item in options"
                            :key="item.value"
                            :label="item.label"
                            :value="item.value">
                            v-for="item in programme"
                            :key="item.id"
                            :label="item.name"
                            :value="item.id">
                        </el-option>
                    </el-select>
                </template>
@@ -102,10 +95,8 @@
                align="center"
                label="加减保功能">
                <template slot-scope="{row}">
                    <el-checkbox-group v-model="row.type">
                        <el-checkbox label="1">加保</el-checkbox>
                        <el-checkbox label="2">减保</el-checkbox>
                    </el-checkbox-group>
                    <el-checkbox :true-label="1" :false-label="0" v-model="row.canAdd">加保</el-checkbox>
                    <el-checkbox :true-label="1" :false-label="0" v-model="row.canReduce">减保</el-checkbox>
                </template>
            </el-table-column>
            <el-table-column
@@ -113,7 +104,7 @@
                align="center"
                width="100">
                <template slot-scope="scope">
                    <el-button type="text" size="small" style="color: red;">删除</el-button>
                    <el-button type="text" size="small" style="color: red;" @click="dele(scope.$index)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>
@@ -124,6 +115,8 @@
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import UploadAvatarImage from '@/components/common/UploadAvatarImage'
    import { all } from '@/api/business/solutions'
    import { sendSms } from '@/api/business/smsEmail'
    export default {
        name: 'OperaCompanyWindow',
        extends: BaseOpera,
@@ -135,23 +128,89 @@
                    id: null,
                    name: '',
                    code: '',
                    legalName: '',
                    taxCode: '',
                    taxAccount: '',
                    username: '',
                    taxBank: '',
                    taxAddr: '',
                    invoiceEmail: '',
                    invoiceAddr: '',
                    phone: '',
                    email: ''
                    email: '',
                    captche: '',
                    businessImg: {
                        fileurl: '',
                        name: ''
                },
                    idcardImgList: [],
                    signImg: {
                        fileurl: '',
                        name: ''
                    },
                    solutionList: [
                        {
                            solutionBaseId: '',
                            canAdd: 0,
                            canReduce: 0
                        }
                    ]
                },
                timer: null,
                num: 0,
                // éªŒè¯è§„则
                rules: {
                    name: [
                        { required: true, message: '请输入公司名称' }
                    ],
                    code: [
                        { required: true, message: '请输入统一信用代码' }
                    ],
                    captche: [
                        { required: true, message: '请输入验证码' }
                    ],
                    legalName: [
                        { required: true, message: '请输入法人姓名' }
                    ],
                    phone: [
                        { required: true, message: '请输入手机号' }
                    ],
                    taxAccount: [
                        { required: true, message: '请输入手机号' }
                    ],
                    email: [
                        { required: true, message: '请输入认证邮箱' }
                    ],
                    businessImg: [
                        { required: true, message: '请上传营业执照' }
                    ],
                    idcardImgList: [
                        { required: true, message: '请上传法人身份证' }
                    ],
                    signImg: [
                        { required: true, message: '请上传电子签章' }
                    ],
                    username: [
                        { required: true, message: '请输入公司账号' }
                    ]
                },
                options: [],
                tableData: [{
                    type: [],
                    info: ''
                }]
                file: {
                    imgurl: '',
                    imgurlfull: ''
                },
                file1: {
                    imgurl: '',
                    imgurlfull: ''
                },
                file2: {
                    imgurl: '',
                    imgurlfull: ''
                },
                file3: {
                    imgurl: '',
                    imgurlfull: ''
                },
                programme: []
            }
        },
        created () {
@@ -160,9 +219,97 @@
                'field.id': 'id'
            })
        },
        watch: {
            visible: {
                handler(news) {
                    if (news) {
                        clearInterval(this.timer)
                        this.num = 0
                    }
                }
            }
        },
        methods: {
            send() {
                if (!this.form.phone) {
                    this.$message.warning('请输入手机号')
                    return
                }
                sendSms({ phone: this.form.phone })
                    .then(res => {
                        this.num = 60
                        this.setTime()
                    })
            },
            setTime() {
                this.timer = setInterval(() => {
                    this.num -= 1
                    if (this.num === 0) {
                        clearInterval(this.timer)
                        this.num = 0
                    }
                }, 1000)
            },
            open (title, target) {
                this.title = title
                this.visible = true
                this.getAll()
                // æ–°å»º
                if (target == null) {
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form[this.configData['field.id']] = null
                    })
                    return
                }
                // ç¼–辑
                this.$nextTick(() => {
                    for (const key in this.form) {
                        this.form[key] = target[key]
                    }
                })
            },
            // èŽ·å–å…¨éƒ¨æ–¹æ¡ˆ
            getAll() {
                all({})
                    .then(res => {
                        this.programme = res
                    })
            },
            dele(index) {
                if (this.form.solutionList.length === 1) {
                    this.$message.warning('至少保留一项')
                    return
                }
                this.form.solutionList.splice(index, 1)
            },
            add() {
                this.form.solutionList.push({
                    solutionName: '',
                    canAdd: '',
                    canReduce: ''
                })
            },
            handleRemove(file, fileList) {
                console.log(file, fileList);
            },
            // æŽ¥æ”¶è¥ä¸šæ‰§ç…§æ•°æ®
            result(data) {
                this.form.businessImg.fileurl = data.imgurl
                this.form.businessImg.name = data.name
            },
            // èº«ä»½è¯ç…§ç‰‡1
            result1(data) {
                this.form.idcardImgList[0] = { fileurl: data.imgurl, name: data.name }
            },
            // èº«ä»½è¯ç…§ç‰‡2
            result2(data) {
                this.form.idcardImgList[1] = { fileurl: data.imgurl, name: data.name }
            },
            // ç”µå­ç­¾ç« 
            result3(data) {
                this.form.signImg.fileurl = data.imgurl
                this.form.signImg.name = data.name
            }
        }
    }
company/src/components/business/OperaInsuranceDescWindow.vue
@@ -4,12 +4,12 @@
        submitText="修改"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="$refs.operaInsuranceWindow.open('编辑保险公司')"
        @confirm="$refs.operaInsuranceWindow.open('编辑保险公司', form)"
    >
        <div class="box">
            <div class="box_name">
                <span>保险公司:平安保险</span>
                <span>是否启用:是</span>
                <span>保险公司:{{form.name}}</span>
                <span>是否启用:{{form.status == 0 ? '启用' : '禁用'}}</span>
            </div>
            <el-table
                :data="tableData"
@@ -30,7 +30,7 @@
            </el-table>
        </div>
        <!-- æ–°å»º/修改 -->
        <OperaInsuranceWindow ref="operaInsuranceWindow" @success="handlePageChange"/>
        <OperaInsuranceWindow ref="operaInsuranceWindow" @success="success"/>
    </GlobalWindow>
</template>
@@ -38,6 +38,7 @@
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import OperaInsuranceWindow from '@/components/business/OperaInsuranceWindow'
    import { all } from '@/api/business/worktype'
    export default {
        name: 'OperaInsuranceDescWindow',
        extends: BaseOpera,
@@ -47,10 +48,8 @@
                // è¡¨å•数据
                form: {
                    id: null,
                    name: ''
                },
                // éªŒè¯è§„则
                rules: {
                    name: '',
                    status: ''
                },
                tableData: []
            }
@@ -60,6 +59,38 @@
                api: '/business/insurance',
                'field.id': 'id'
            })
        },
        methods: {
            open (title, target) {
                this.title = title
                this.visible = true
                // æ–°å»º
                if (target == null) {
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form[this.configData['field.id']] = null
                    })
                    return
                }
                // ç¼–辑
                this.$nextTick(() => {
                    for (const key in this.form) {
                        this.form[key] = target[key]
                    }
                    all({ insuranceId: this.form.id })
                        .then(res => {
                            let arr = []
                            res.forEach(item => {
                                arr.push({ name: item.name })
                            })
                            this.tableData = arr
                        })
                })
            },
            success() {
                this.$emit('success')
                this.visible = false
            }
        }
    }
</script>
company/src/components/business/OperaInsuranceWindow.vue
@@ -9,9 +9,13 @@
            <el-form-item label="保险公司" prop="name">
                <el-input v-model="form.name" placeholder="平安保险" v-trim/>
            </el-form-item>
            <el-button type="primary" style="margin-bottom: 10px;">添加</el-button>
            <div style="width: 100%; display: flex; align-items: center;margin-bottom: 10px;">
                <el-button type="primary" @click="add">添加</el-button>
                <el-button type="primary" @click="impor">导入工种</el-button>
                <el-button type="text" @click="exprot">导入模版xls</el-button>
            </div>
            <el-table
                :data="tableData"
                :data="form.worktypeList"
                border
                style="width: 100%; margin-bottom: 20px;">
                <el-table-column
@@ -34,17 +38,21 @@
                    align="center"
                    width="100">
                    <template slot-scope="scope">
                        <el-button type="text" size="small" style="color: red;">删除</el-button>
                        <el-button type="text" size="small" style="color: red;" @click="dele(scope.$index)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </el-form>
        <!--    ä¸Šä¼ å·¥ç§    -->
        <input type="file" @change="getFile" style="opacity: 0;" ref="upload" accept=".xlsx" />
    </GlobalWindow>
</template>
<script>
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import { importExcel, all } from '@/api/business/worktype'
    export default {
        name: 'OperaInsuranceWindow',
        extends: BaseOpera,
@@ -54,12 +62,14 @@
                // è¡¨å•数据
                form: {
                    id: null,
                    name: ''
                    name: '',
                    worktypeList: [
                        { name: '' }
                    ]
                },
                // éªŒè¯è§„则
                rules: {
                },
                tableData: []
                }
            }
        },
        created () {
@@ -67,6 +77,81 @@
                api: '/business/insurance',
                'field.id': 'id'
            })
        },
        methods: {
            open (title, target) {
                this.title = title
                this.visible = true
                // æ–°å»º
                if (target == null) {
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form[this.configData['field.id']] = null
                    })
                    return
                }
                // ç¼–辑
                this.$nextTick(() => {
                    for (const key in this.form) {
                        this.form[key] = target[key]
                    }
                    all({ insuranceId: this.form.id })
                        .then(res => {
                            let arr = []
                            res.forEach(item => {
                                arr.push({ name: item.name })
                            })
                            this.form.worktypeList = arr
                        })
                })
            },
            // å¯¼å‡ºæ¨¡æ¿
            exprot() {
                let a = document.createElement("a");
                a.href = '/public/file/typeWork.xlsx';
                a.download = '保险公司-工种导入模版.xlsx';
                a.click();
            },
            // å¯¼å…¥å·¥ç§æ¨¡æ¿
            getFile(e) {
                const formdate = new FormData()
                formdate.append('file', e.target.files[0])
                importExcel(formdate)
                    .then(res => {
                        res.forEach(item => {
                            if (this.form.worktypeList.length === 0) {
                                this.form.worktypeList.push({ name: item })
                            } else {
                                let next = true
                                this.form.worktypeList.forEach(row => {
                                    if (row.name === item) {
                                        next = false
                                    }
                                })
                                if (next) {
                                    this.form.worktypeList.push({ name: item })
                                }
                            }
                        })
                    })
                    .finally(() => {
                        this.$refs.upload.value = null
                    })
            },
            // ä¸Šä¼ æ–‡ä»¶
            impor() {
                this.$refs.upload.click()
            },
            add() {
                this.form.worktypeList.push({ name: '' })
            },
            dele(index) {
                if (this.form.worktypeList.length === 1) {
                    this.$message.warning('至少保留一项内容')
                    return
                }
                this.form.worktypeList.splice(index, 1)
            }
        }
    }
</script>
company/src/components/business/OperaSolutionsDescWindow.vue
@@ -5,25 +5,25 @@
        submitText="修改"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="$refs.operaSolutionsWindow.open('编辑方案')"
        @confirm="$refs.operaSolutionsWindow.open('编辑方案', form)"
    >
        <div class="info">
            <div class="info_list">
                <div class="info_list_item">
                    <div class="info_list_item_label">方案名称:</div>
                    <div class="info_list_item_val">平安保险雇主责任险A版</div>
                    <div class="info_list_item_val">{{form.name}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">保险公司:</div>
                    <div class="info_list_item_val">平安保险</div>
                    <div class="info_list_item_val">{{form.insuranceName}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">承保公司:</div>
                    <div class="info_list_item_val">安徽平安保险有限公司</div>
                    <div class="info_list_item_val">{{form.companyName}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">投保年龄:</div>
                    <div class="info_list_item_val">25至65</div>
                    <div class="info_list_item_val">{{form.minAge}}至{{form.maxAge}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">投保类型:</div>
@@ -31,31 +31,39 @@
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">保险费用:</div>
                    <div class="info_list_item_val">200元/人/å¹´</div>
                    <div class="info_list_item_val">
                        {{form.price}}元/人/
                        <span v-if="form.timeUnit === 0">天</span>
                        <span v-if="form.timeUnit === 1">半月</span>
                        <span v-if="form.timeUnit === 2">月</span>
                        <span v-if="form.timeUnit === 3">å¹´</span>
                    </div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">投保周期:</div>
                    <div class="info_list_item_val">1月</div>
                    <div class="info_list_item_val">
                        {{form.insureCycle}}
                        <span v-if="form.insureCycleUnit === 0">天</span>
                        <span v-if="form.insureCycleUnit === 1">半月</span>
                        <span v-if="form.insureCycleUnit === 2">月</span>
                        <span v-if="form.insureCycleUnit === 3">å¹´</span>
                    </div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">生效时间:</div>
                    <div class="info_list_item_val">1日后生效</div>
                    <div class="info_list_item_val">{{form.validType === 0 ? '日后生效' : '次月生效'}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">投保类型:</div>
                    <div class="info_list_item_val">直保</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">单独指派工种:</div>
                    <div class="info_list_item_val">否</div>
                    <div class="info_list_item_val">{{form.type === 0 ? '直保' : '委托投保'}}</div>
                </div>
                <div class="info_list_item">
                    <div class="info_list_item_label">接收文件邮箱:</div>
                    <div class="info_list_item_val">111@163.com</div>
                    <div class="info_list_item_val">{{form.email}}</div>
                </div>
            </div>
            <el-table
                :data="tableData"
                :data="form.worktypeList"
                border
                style="width: 100%; margin-bottom: 20px;">
                <el-table-column
@@ -67,15 +75,21 @@
                    </template>
                </el-table-column>
                <el-table-column
                    prop="code"
                    prop="worktypeName"
                    align="center"
                    label="所属工种">
                </el-table-column>
            </el-table>
            <div class="info_fwb">富文本内容</div>
            <div class="info_agree">
                <div class="info_agree_label">保险声明:</div>
                <div class="info_agree_label">特别约定:</div>
                <div class="info_agree_val">
                    {{form.specialAgreement}}
                </div>
            </div>
        </div>
        <!-- ä¿®æ”¹ -->
        <OperaSolutionsWindow ref="operaSolutionsWindow" @success="handlePageChange"/>
        <OperaSolutionsWindow ref="operaSolutionsWindow" @success="callback"/>
    </GlobalWindow>
</template>
@@ -83,6 +97,7 @@
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import OperaSolutionsWindow from '@/components/business/OperaSolutionsWindow'
    import { solutionsId } from '@/api/business/solutions'
    export default {
        name: 'OperaSolutionsDescWindow',
        extends: BaseOpera,
@@ -93,24 +108,25 @@
                form: {
                    id: null,
                    name: '',
                    companyName: '',
                    insuranceId: '',
                    validType: '',
                    type: '',
                    validType: 0,
                    type: 0,
                    minAge: '',
                    maxAge: '',
                    price: '',
                    timeUnit: '',
                    insureCycle: '',
                    insureCycleUnit: '',
                    priceCycleUnit: '',
                    email: '',
                    specialAgreement: '',
                    specialInfo: '',
                    ortherInfo: ''
                },
                // éªŒè¯è§„则
                rules: {
                },
                tableData: []
                    ortherInfo: '',
                    insuranceName: '',
                    signKeyword: '',
                    worktypeList: [],
                    worktypeIdList: []
                }
            }
        },
        created () {
@@ -118,6 +134,35 @@
                api: '/business/solutions',
                'field.id': 'id'
            })
        },
        methods: {
            open (title, target) {
                this.title = title
                this.visible = true
                this.$nextTick(() => {
                    for (const key in this.form) {
                        this.form[key] = target[key]
                    }
                    this.getDetails()
                })
            },
            getDetails() {
                solutionsId(this.form.id)
                    .then(res => {
                        for (const key in this.form) {
                            this.form[key] = res[key]
                        }
                        this.form.worktypeIdList = res.worktypeList.map(item => {
                            return {
                                worktypeId: item.worktypeId
                            }
                        })
                    })
            },
            callback() {
                this.$emit('success')
                this.visible = false
            }
        }
    }
</script>
@@ -125,6 +170,24 @@
<style lang="scss" scoped>
    .info {
        width: 100%;
        .info_agree {
            width: 100%;
            display: flex;
            flex-direction: column;
            margin-top: 20px;
            .info_agree_label {
                font-size: 14px;
                font-weight: 500;
                color: #000000;
                margin-top: 5px;
            }
            .info_agree_val {
                font-size: 14px;
                font-weight: 500;
                color: #000000;
                margin-top: 5px;
            }
        }
        .info_label {
            width: 100%;
            display: flex;
company/src/components/business/OperaSolutionsWindow.vue
@@ -10,35 +10,35 @@
                <el-input v-model="form.name" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="保险公司" prop="insuranceId">
                <el-select v-model="form.insuranceId" placeholder="请选择">
                <el-select v-model="form.insuranceId" @change="getAllWorktype1" placeholder="请选择">
                    <el-option
                        v-for="item in options"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value">
                        v-for="item in company"
                        :key="item.id"
                        :label="item.name"
                        :value="item.id">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="承保公司" prop="name">
                <el-input v-model="form.name" placeholder="请输入" v-trim/>
            <el-form-item label="承保公司" prop="companyName">
                <el-input v-model="form.companyName" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="投保年龄" prop="minAge">
                <div style="display: flex; align-items: center;">
                    <el-select v-model="form.minAge" style="flex: 1;" placeholder="请选择">
                        <el-option
                            v-for="item in options"
                            :key="item.value"
                            :label="item.label"
                            :value="item.value">
                            v-for="item in 60"
                            :key="item"
                            :label="item"
                            :value="item">
                        </el-option>
                    </el-select>
                    <span style="margin: 0 30px;">至</span>
                    <el-select v-model="form.maxAge" style="flex: 1;" placeholder="请选择">
                        <el-option
                            v-for="item in options"
                            :key="item.value"
                            :label="item.label"
                            :value="item.value">
                            v-for="item in 60"
                            :key="item"
                            :label="item"
                            :value="item">
                        </el-option>
                    </el-select>
                </div>
@@ -46,34 +46,26 @@
            <el-form-item label="保险费用" prop="price">
                <div style="display: flex; align-items: center;">
                    <el-input v-model="form.price" style="flex: 1;" placeholder="请输入" v-trim/>
                    <span style="margin: 0 30px;">至</span>
                    <span style="margin: 0 30px;">元/人</span>
                    <el-select v-model="form.timeUnit" style="flex: 1;" placeholder="请选择">
                        <el-option label="天" value="0"></el-option>
                        <el-option label="半月" value="1"></el-option>
                        <el-option label="月" value="2"></el-option>
                        <el-option label="å¹´" value="3"></el-option>
                        <el-option label="天" :value="0"></el-option>
                        <el-option label="半月" :value="1"></el-option>
                        <el-option label="月" :value="2"></el-option>
                        <el-option label="å¹´" :value="3"></el-option>
                    </el-select>
                </div>
            </el-form-item>
            <el-form-item label="投保周期" prop="insureCycleUnit">
            <el-form-item label="投保周期" prop="insureCycle">
                <div style="display: flex; align-items: center;">
                    <el-input v-model="form.insureCycleUnit" style="flex: 1;" placeholder="请输入" v-trim/>
                    <span style="margin: 0 30px;">至</span>
                    <el-select v-model="form.timeUnit" style="flex: 1;" placeholder="请选择">
                        <el-option label="天" value="0"></el-option>
                        <el-option label="半月" value="1"></el-option>
                        <el-option label="月" value="2"></el-option>
                        <el-option label="å¹´" value="3"></el-option>
                    <el-input v-model="form.insureCycle" style="flex: 1;" placeholder="请输入" v-trim/>
                    <span style="margin: 0 30px;"></span>
                    <el-select v-model="form.insureCycleUnit" style="flex: 1;" placeholder="请选择">
                        <el-option label="天" :value="0"></el-option>
                        <el-option label="半月" :value="1"></el-option>
                        <el-option label="月" :value="2"></el-option>
                        <el-option label="å¹´" :value="3"></el-option>
                    </el-select>
                </div>
            </el-form-item>
            <el-form-item label="最小计费周期" prop="priceCycleUnit">
                <el-select v-model="form.priceCycleUnit" style="flex: 1;" placeholder="请选择">
                    <el-option label="天" value="0"></el-option>
                    <el-option label="半月" value="1"></el-option>
                    <el-option label="月" value="2"></el-option>
                    <el-option label="å¹´" value="3"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="生效时间" prop="validType">
                <el-radio-group v-model="form.validType">
@@ -90,12 +82,12 @@
            <el-form-item label="接收文件邮箱" prop="email">
                <el-input v-model="form.email" placeholder="请输入" v-trim/>
            </el-form-item>
            <el-form-item label="投保单签章关键字" prop="email">
                <el-input v-model="form.email" placeholder="请输入" v-trim/>
            <el-form-item label="投保单签章关键字" prop="signKeyword">
                <el-input v-model="form.signKeyword" placeholder="多个英文逗号隔开" v-trim/>
            </el-form-item>
            <el-button type="primary">添加工种</el-button>
            <el-button type="primary" @click="add">添加工种</el-button>
            <el-table
                :data="tableData"
                :data="form.worktypeIdList"
                border
                style="width: 100%; margin-bottom: 20px;">
                <el-table-column
@@ -110,12 +102,12 @@
                    align="center"
                    label="所属工种">
                    <template slot-scope="{row}">
                        <el-select filterable v-model="row.info" placeholder="请选择">
                        <el-select filterable v-model="row.worktypeId" placeholder="请选择">
                            <el-option
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value">
                                v-for="item in typeWork"
                                :key="item.id"
                                :label="item.name"
                                :value="item.id">
                            </el-option>
                        </el-select>
                    </template>
@@ -125,7 +117,7 @@
                    align="center"
                    width="100">
                    <template slot-scope="scope">
                        <el-button type="text" size="small" style="color: red;">删除</el-button>
                        <el-button type="text" size="small" style="color: red;" @click="dele(scope.$index)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -145,6 +137,9 @@
<script>
    import BaseOpera from '@/components/base/BaseOpera'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import { all } from '@/api/business/insurance'
    import { all as allWorktype } from '@/api/business/worktype'
    import { solutionsId } from '@/api/business/solutions'
    export default {
        name: 'OperaSolutionsWindow',
        extends: BaseOpera,
@@ -155,24 +150,55 @@
                form: {
                    id: null,
                    name: '',
                    companyName: '',
                    insuranceId: '',
                    validType: '',
                    type: '',
                    validType: 0,
                    type: 0,
                    minAge: '',
                    maxAge: '',
                    price: '',
                    timeUnit: '',
                    insureCycle: '',
                    insureCycleUnit: '',
                    priceCycleUnit: '',
                    email: '',
                    specialAgreement: '',
                    specialInfo: '',
                    ortherInfo: ''
                    ortherInfo: '',
                    signKeyword: '',
                    worktypeIdList: [{ worktypeId: '' }]
                },
                // éªŒè¯è§„则
                rules: {
                    name: [
                        { required: true, message: '请输入方案名称' }
                    ],
                    insuranceId: [
                        { required: true, message: '请选择保险公司' }
                    ],
                    companyName: [
                        { required: true, message: '请输入承保公司' }
                    ],
                    minAge: [
                        { required: true, message: '请选择投保年龄' }
                    ],
                    price: [
                        { required: true, message: '请输入保险费用' }
                    ],
                    insureCycle: [
                        { required: true, message: '请输入投保周期' }
                    ],
                    validType: [
                        { required: true, message: '请选择生效时间' }
                    ],
                    type: [
                        { required: true, message: '请选择投保类型' }
                    ],
                    signKeyword: [
                        { required: true, message: '请输入投保单签章关键字' }
                    ]
                },
                tableData: []
                company: [],
                typeWork: []
            }
        },
        created () {
@@ -180,6 +206,107 @@
                api: '/business/solutions',
                'field.id': 'id'
            })
        },
        methods: {
            // åˆ‡æ¢å…¬å¸
            getAllWorktype1() {
                this.form.worktypeIdList = [{ worktypeId: '' }]
                this.getAllWorktype()
            },
            // ç¡®è®¤æ–°å»º/修改
            confirm () {
                let data = JSON.parse(JSON.stringify(this.form))
                data.worktypeIdList = data.worktypeIdList.map(item => item.worktypeId)
                this.$refs.form.validate((valid) => {
                    if (!valid) {
                        return
                    }
                    // è°ƒç”¨æ–°å»ºæŽ¥å£
                    this.isWorking = true
                    if (data.id == null || data.id === '') {
                        this.api.create(data)
                            .then(() => {
                                this.visible = false
                                this.$tip.apiSuccess('新建成功')
                                this.$emit('success')
                            })
                            .catch(e => {
                                this.$tip.apiFailed(e)
                            })
                            .finally(() => {
                                this.isWorking = false
                            })
                    } else {
                        this.api.updateById(data)
                            .then(() => {
                                this.visible = false
                                this.$tip.apiSuccess('修改成功')
                                this.$emit('success')
                            })
                            .catch(e => {
                                this.$tip.apiFailed(e)
                            })
                            .finally(() => {
                                this.isWorking = false
                            })
                    }
                })
            },
            open (title, target) {
                this.title = title
                this.visible = true
                this.form.worktypeIdList = [{ worktypeId: '' }]
                this.allCompany()
                // æ–°å»º
                if (target == null) {
                    this.$nextTick(() => {
                        this.$refs.form.resetFields()
                        this.form[this.configData['field.id']] = null
                    })
                    return
                }
                // ç¼–辑
                this.$nextTick(() => {
                    solutionsId(target.id)
                        .then(res => {
                            for (const key in this.form) {
                                this.form[key] = res[key]
                            }
                            this.form.worktypeIdList = res.worktypeList.map(item => {
                                return {
                                    worktypeId: item.worktypeId
                                }
                            })
                            this.getAllWorktype()
                        })
                })
            },
            // æŸ¥è¯¢ä¿é™©å…¬å¸ä¸‹å…¨éƒ¨å·¥ç§
            getAllWorktype() {
                allWorktype({
                    insuranceId: this.form.insuranceId
                }).then(res => {
                    this.typeWork = res
                })
            },
            // æŸ¥è¯¢å…¨éƒ¨ä¿é™©å…¬å¸
            allCompany() {
                all({ dataType: 2 })
                    .then(res => {
                        console.log(res)
                        this.company = res
                    })
            },
            add() {
                this.form.worktypeIdList.push({ worktypeId: '' })
            },
            dele(index) {
                if (this.form.worktypeIdList.length === 1) {
                    this.$message.warning('至少要保留一项')
                    return
                }
                this.form.worktypeIdList.splice(index, 1)
            }
        }
    }
</script>
company/src/components/common/UploadAvatarImage.vue
@@ -34,13 +34,7 @@
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload',
      // uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadPicture',
      // uploadData: {
      //   folder: 'upload',
      //   type: 'image'
      // },
      imgurlfull: ''
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload'
    }
  },
  
@@ -51,9 +45,8 @@
        let { data } = res
        this.file.imgurl = data.imgaddr;
        this.file.imgurlfull = data.url;
        console.log(this.file);
        this.$message.success('上传成功')
        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url })
        this.$emit('uploadSuccess', { imgurl: data.imgaddr, imgurlfull: data.url, name: data.originname })
      } else {
        this.$message.error('上传失败')
      }
company/src/components/system/user/OperaUserWindow.vue
@@ -7,44 +7,24 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="用户名" prop="username" required>
        <el-input v-model="form.username" placeholder="请输入用户名" v-trim maxlength="50"/>
      <el-form-item label="账号" prop="username" required>
        <el-input v-model="form.username" placeholder="请输入" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="姓名" prop="realname" required>
        <el-input v-model="form.realname" placeholder="请输入姓名" v-trim maxlength="50"/>
      <el-form-item label="名称" prop="realname" required>
        <el-input v-model="form.realname" placeholder="请输入" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="性别" prop="sex" required>
        <el-radio-group v-model="form.sex">
          <el-radio label="1">男</el-radio>
          <el-radio label="0">女</el-radio>
        </el-radio-group>
      <el-form-item label="联系方式" prop="mobile">
        <el-input v-model="form.mobile" placeholder="请输入" v-trim maxlength="11"/>
      </el-form-item>
      <el-form-item label="头像" prop="avatar" required>
        <el-radio-group v-model="form.avatar" class="form-item-avatar">
          <el-radio label="https://dmtest.ahapp.net/preselectfile/man.png" border><img src="https://dmtest.ahapp.net/preselectfile/man.png" alt=""></el-radio>
          <el-radio label="https://dmtest.ahapp.net/preselectfile/woman.png" border><img src="https://dmtest.ahapp.net/preselectfile/woman.png" alt=""></el-radio>
        </el-radio-group>
      <el-form-item label="验证码" prop="captcha">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-input v-model="form.captcha" maxlength="11" type="number" style="flex: 1;" placeholder="请输入" v-trim/>
          <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;" @click="send" v-if="num === 0">发送验证码</el-button>
          <el-button type="primary" style="flex-shrink: 0; margin-left: 15px;" v-else>{{num}}s</el-button>
        </div>
      </el-form-item>
      <el-form-item v-if="form.id == null" label="初始密码" prop="password" required>
        <el-input v-model="form.password" type="password" placeholder="请输入初始密码" maxlength="30" show-password/>
      </el-form-item>
            <el-form-item label="所属部门" prop="departmentId" required>
        <DepartmentSelect v-model="form.departmentId" placeholder="请选择用户所属部门" :inline="false" clearable/>
      </el-form-item>
      <el-form-item label="岗位" prop="positionId">
        <PositionSelect v-model="form.positionIds" placeholder="请选择用户所在岗位" :inline="false" :multiple="true" clearable/>
      </el-form-item>
      <el-form-item label="工号" prop="empNo">
        <el-input v-model="form.empNo" placeholder="请输入工号" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="手机号码" prop="mobile">
        <el-input v-model="form.mobile" placeholder="请输入手机号码" v-trim maxlength="11"/>
      </el-form-item>
      <el-form-item label="邮箱" prop="email">
        <el-input v-model="form.email" placeholder="请输入邮箱" v-trim maxlength="200"/>
      </el-form-item>
      <el-form-item label="生日" prop="birthday">
        <el-date-picker v-model="form.birthday" value-format="yyyy-MM-dd" placeholder="请选择用户生日"/>
      <el-form-item label="抄送文件邮箱" prop="email">
        <el-input v-model="form.email" placeholder="请输入" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -56,6 +36,7 @@
import DepartmentSelect from '@/components/common/DepartmentSelect'
import PositionSelect from '@/components/common/PositionSelect'
import { checkMobile, checkEmail } from '@/utils/form'
import { sendSms } from '@/api/business/smsEmail'
export default {
  name: 'OperaUserWindow',
@@ -68,16 +49,12 @@
        id: null,
        username: '', // ç”¨æˆ·å
        realname: '', // å§“名
        empNo: '', // å·¥å·
        departmentId: null, //  æ‰€å±žéƒ¨é—¨ID
        positionIds: [], //  æ‰€å±žå²—位ID集
        avatar: '/avatar/man.png', // å¤´åƒ
        password: '', // å¯†ç 
        mobile: '', // æ‰‹æœºå·ç 
        email: '', // é‚®ç®±
        sex: '1', // æ€§åˆ«
        birthday: '' // ç”Ÿæ—¥
        email: '',
        captcha: ''
      },
      num: 0,
      timer: null,
      // éªŒè¯è§„则
      rules: {
        username: [
@@ -86,28 +63,36 @@
        realname: [
          { required: true, message: '请输入姓名' }
        ],
        password: [
          { required: true, message: '请输入密码' }
        ],
        departmentId: [
          { required: true, message: '请选择部门' }
        ],
        avatar: [
          { required: true, message: '请选择用户头像' }
        ],
        sex: [
          { required: true, message: '请选择用户性别' }
        ],
        mobile: [
          { required: true, validator: checkMobile }
        ],
        email: [
          { validator: checkEmail }
          { required: true, message: '请输入邮箱' }
        ]
      }
    }
  },
  methods: {
    send() {
      if (!this.form.mobile) {
        this.$message.warning('请输入手机号')
        return
      }
      sendSms({ phone: this.form.mobile })
        .then(res => {
          this.num = 60
          this.setTime()
        })
    },
    setTime() {
      this.timer = setInterval(() => {
        this.num -= 1
        if (this.num === 0) {
          clearInterval(this.timer)
          this.num = 0
        }
      }, 1000)
    },
    /**
     * @title çª—口标题
     * @target ç¼–辑的用户对象
@@ -115,6 +100,8 @@
    open (title, target) {
      this.title = title
      this.visible = true
      clearInterval(this.timer)
      this.num = 0
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
company/src/components/system/user/allocationEnterprises.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
<template>
    <GlobalWindow
        :visible.sync="visible"
        :confirm-working="isWorking"
        width="582px"
        title="配置用户角色"
        @confirm="confirm"
    >
        <p class="tip" v-if="user != null">为用户 <em>{{user.realname}}</em> åˆ†é…ä¼ä¸š</p>
        <el-transfer
            v-if="company"
            v-model="selectedIds"
            :titles="['未分配企业', '已分配企业']"
            :props="{
                key: 'id',
                label: 'name'
            }"
            :data="company">
        </el-transfer>
    </GlobalWindow>
</template>
<script>
    import BasePage from '@/components/base/BasePage'
    import GlobalWindow from '@/components/common/GlobalWindow'
    import { pageAll } from '@/api/business/company'
    import { create } from '@/api/business/companyPermission'
    export default {
        name: 'allocationEnterprises',
        extends: BasePage,
        components: { GlobalWindow },
        data () {
            return {
                visible: false,
                isWorking: false,
                // ç”¨æˆ·
                user: null,
                // ä¼ä¸šåˆ—表
                company: null,
                // å·²é€‰ä¸­çš„角色ID
                selectedIds: []
            }
        },
        methods: {
            open (title, target) {
                this.selectedIds = []
                this.visible = true
                this.title = title
                this.user = target
                pageAll({ userId: target.id })
                    .then(res => {
                        this.company = res.map(r => {
                            return {
                                name: r.name,
                                id: r.id
                            }
                        })
                        res.forEach(item => {
                            if (item.hasPerimission === 1) {
                                this.selectedIds.push(item.id)
                            }
                        })
                    })
            },
            // ç¡®è®¤é€‰æ‹©è§’色
            confirm () {
                if (this.isWorking) {
                    return
                }
                this.isWorking = true
                create({
                    userId: this.user.id,
                    companyIdList: this.selectedIds
                })
                    .then(() => {
                        this.$tip.apiSuccess('角色配置成功,用户重新登录后生效')
                        this.visible = false
                        this.$emit('success')
                    })
                    .catch(e => {
                        this.$tip.apiFailed(e)
                    })
                    .finally(() => {
                        this.isWorking = false
                    })
            },
            // å…³é—­
            close () {
                this.$emit('update:visible', false)
            }
        }
    }
</script>
<style scoped lang="scss">
    @import "@/assets/style/variables.scss";
    // è§’色配置
    .global-window {
        .tip {
            em {
                font-style: normal;
                color: $primary-color;
                font-weight: bold;
            }
        }
        .tip-warn {
            margin: 4px 0 12px 0;
            font-size: 12px;
            color: #999;
            i {
                color: orange;
                margin-right: 4px;
                font-size: 14px;
                position: relative;
                top: 1px;
            }
        }
    }
</style>
company/src/views/business/company.vue
@@ -19,8 +19,8 @@
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:company:create']">
                <li><el-button type="primary" @click="$refs.operaCompanyWindow.open('新建企业信息表')" icon="el-icon-plus" v-permissions="['business:company:create']">新建企业</el-button></li>
                <li><el-button type="primary" @click="$refs.OperaCompanyDescWindow.open('详情')" icon="el-icon-plus" v-permissions="['business:company:create']">详情</el-button></li>
                <li><el-button type="primary" @click="$refs.operaCompanyWindow.open('新建企业信息表')" v-permissions="['business:company:create']">新建企业</el-button></li>
                <li><el-button type="primary" @click="$refs.OperaCompanyDescWindow.open('详情')" v-permissions="['business:company:create']">详情</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
company/src/views/business/insurance.vue
@@ -7,15 +7,14 @@
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:insurance:exportExcel']" @click="exportExcel">导出</el-button>
<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:insurance:exportExcel']" @click="exportExcel">导出</el-button>-->
                <el-button @click="reset">重置</el-button>
                <el-button @click="$refs.OperaInsuranceDescWindow.open('保险公司详情')">详情</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:insurance:create']">
                <li><el-button type="primary" @click="$refs.operaInsuranceWindow.open('新增保险公司')" icon="el-icon-plus" v-permissions="['business:insurance:create']">新建</el-button></li>
                <li><el-button type="primary" @click="$refs.operaInsuranceWindow.open('新增保险公司')" v-permissions="['business:insurance:create']">新增保险公司</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
@@ -31,6 +30,7 @@
                <el-table-column label="启用状态" min-width="100px">
                    <template slot-scope="{row}">
                        <el-switch
                            @change="changeStatus($event, row)"
                            v-model="row.status"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
@@ -46,8 +46,8 @@
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.operaInsuranceWindow.open('编辑保险公司信息表', row)" icon="el-icon-edit" v-permissions="['business:insurance:update']">查看详情</el-button>
                        <el-button type="text" @click="$refs.operaInsuranceWindow.open('编辑保险公司信息表', row)" icon="el-icon-edit" v-permissions="['business:insurance:update']">修改</el-button>
                        <el-button type="text" @click="$refs.OperaInsuranceDescWindow.open('保险公司详情', row)" icon="el-icon-edit" v-permissions="['business:insurance:update']">查看详情</el-button>
                        <el-button type="text" @click="$refs.operaInsuranceWindow.open('修改保险公司', row)" icon="el-icon-edit" v-permissions="['business:insurance:update']">修改</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -71,6 +71,7 @@
    import Pagination from '@/components/common/Pagination'
    import OperaInsuranceWindow from '@/components/business/OperaInsuranceWindow'
    import OperaInsuranceDescWindow from '@/components/business/OperaInsuranceDescWindow'
    import { updateStatus } from '@/api/business/insurance'
    export default {
        name: 'Insurance',
        extends: BaseTable,
@@ -91,6 +92,18 @@
                'field.main': 'id'
            })
            this.search()
        },
        methods: {
            // ä¿®æ”¹çŠ¶æ€
            changeStatus(status, row) {
                updateStatus({ id: row.id, status })
                    .then(res => {
                        this.search()
                    })
                    .catch(err => {
                        row.status = row.status === 0 ? 1 : 0
                    })
            }
        }
    }
</script>
company/src/views/business/solutions.vue
@@ -19,16 +19,25 @@
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:solutions:create']">
                <li><el-button type="primary" @click="$refs.operaSolutionsWindow.open('新建保险方案')" icon="el-icon-plus" v-permissions="['business:solutions:create']">新建</el-button></li>
                <li><el-button type="primary" @click="$refs.operaSolutionsWindow.open('新建保险方案')" v-permissions="['business:solutions:create']">添加方案</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column label="序号" width="80px">
                    <template slot-scope="scope">
                        <span>{{scope.$index + 1}}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="name" label="保险方案" min-width="100px"></el-table-column>
                <el-table-column prop="insuranceId" label="保险公司" min-width="100px"></el-table-column>
                <el-table-column prop="insuranceId" label="投保年龄" min-width="100px"></el-table-column>
                <el-table-column prop="insuranceName" label="保险公司" min-width="100px"></el-table-column>
                <el-table-column label="投保年龄" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.minAge}}至{{row.maxAge}}岁</span>
                    </template>
                </el-table-column>
                <el-table-column label="投保生效日期" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.validType === 0">日后生效</span>
@@ -37,12 +46,17 @@
                </el-table-column>
                <el-table-column label="保险费用" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.price}}元/人/月</span>
                        <span>{{row.price}}元/人/</span>
                        <span v-if="row.timeUnit === 0">天</span>
                        <span v-if="row.timeUnit === 1">半月</span>
                        <span v-if="row.timeUnit === 2">月</span>
                        <span v-if="row.timeUnit === 3">å¹´</span>
                    </template>
                </el-table-column>
                <el-table-column prop="status" label="启用状态" min-width="100px">
                    <template slot-scope="{row}">
                        <el-switch
                            @change="changeStatus($event, row)"
                            v-model="row.status"
                            active-color="#13ce66"
                            inactive-color="#ff4949"
@@ -51,10 +65,6 @@
                        </el-switch>
                    </template>
                </el-table-column>
                <el-table-column prop="minAge" label="最低年龄" min-width="100px"></el-table-column>
                <el-table-column prop="maxAge" label="最高年龄" min-width="100px"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:solutions:update', 'business:solutions:delete'])"
                    label="操作"
@@ -62,8 +72,8 @@
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.operaSolutionsWindow.open('方案详情', row)" icon="el-icon-edit" v-permissions="['business:solutions:update']">查看详情</el-button>
                        <el-button type="text" @click="$refs.operaSolutionsWindow.open('编辑保险方案', row)" icon="el-icon-edit" v-permissions="['business:solutions:update']">修改</el-button>
                        <el-button type="text" @click="$refs.OperaSolutionsDescWindow.open('方案详情', { id: row.id })" icon="el-icon-edit" v-permissions="['business:solutions:update']">查看详情</el-button>
                        <el-button type="text" @click="$refs.operaSolutionsWindow.open('编辑保险方案', { id: row.id })" icon="el-icon-edit" v-permissions="['business:solutions:update']">修改</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -87,6 +97,7 @@
    import Pagination from '@/components/common/Pagination'
    import OperaSolutionsWindow from '@/components/business/OperaSolutionsWindow'
    import OperaSolutionsDescWindow from '@/components/business/OperaSolutionsDescWindow'
    import { updateStatus } from '@/api/business/solutions'
    export default {
        name: 'Solutions',
        extends: BaseTable,
@@ -108,6 +119,18 @@
                'field.main': 'id'
            })
            this.search()
        },
        methods: {
            // ä¿®æ”¹çŠ¶æ€
            changeStatus(status, row) {
                updateStatus({ id: row.id, status })
                    .then(res => {
                        this.search()
                    })
                    .catch(err => {
                        row.status = row.status === 0 ? 1 : 0
                    })
            }
        }
    }
</script>
company/src/views/system/user.vue
@@ -2,21 +2,21 @@
  <TableLayout :permissions="['system:user:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="80px" inline>
      <el-form-item label="用户名" prop="username">
        <el-input v-model="searchForm.username" v-trim placeholder="请输入用户名" @keypress.enter.native="search"/>
      </el-form-item>
<!--      <el-form-item label="用户名" prop="username">-->
<!--        <el-input v-model="searchForm.username" v-trim placeholder="请输入用户名" @keypress.enter.native="search"/>-->
<!--      </el-form-item>-->
      <el-form-item label="姓名" prop="realname">
        <el-input v-model="searchForm.realname" v-trim placeholder="请输入姓名" @keypress.enter.native="search"/>
        <el-input v-model="searchForm.realname" v-trim placeholder="请输入" @keypress.enter.native="search"/>
      </el-form-item>
      <el-form-item label="手机号码" prop="mobile">
        <el-input v-model="searchForm.mobile" v-trim placeholder="请输入手机号码" @keypress.enter.native="search"/>
      </el-form-item>
            <el-form-item label="所属部门" prop="rootDeptId">
        <DepartmentSelect v-model="searchForm.rootDeptId" placeholder="请选择所属部门" clearable/>
      </el-form-item>
      <el-form-item label="岗位" prop="positionId">
        <PositionSelect v-model="searchForm.positionId" placeholder="请选择岗位" clearable/>
      </el-form-item>
<!--      <el-form-item label="手机号码" prop="mobile">-->
<!--        <el-input v-model="searchForm.mobile" v-trim placeholder="请输入手机号码" @keypress.enter.native="search"/>-->
<!--      </el-form-item>-->
<!--            <el-form-item label="所属部门" prop="rootDeptId">-->
<!--        <DepartmentSelect v-model="searchForm.rootDeptId" placeholder="请选择所属部门" clearable/>-->
<!--      </el-form-item>-->
<!--      <el-form-item label="岗位" prop="positionId">-->
<!--        <PositionSelect v-model="searchForm.positionId" placeholder="请选择岗位" clearable/>-->
<!--      </el-form-item>-->
      <section>
        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
@@ -25,44 +25,25 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['system:user:create', 'system:user:delete']">
        <li v-permissions="['system:user:create']"><el-button icon="el-icon-plus" type="primary" @click="$refs.operaUserWindow.open('新建用户')">新建</el-button></li>
        <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">删除</el-button></li>
        <li v-permissions="['system:user:create']"><el-button type="primary" @click="$refs.operaUserWindow.open('新增账号')">新增账号</el-button></li>
<!--        <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">删除</el-button></li>-->
      </ul>
<!--      @selection-change="handleSelectionChange"-->
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        :default-sort = "{prop: 'createTime', order: 'descending'}"
        stripe
        @selection-change="handleSelectionChange"
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="avatar" label="头像" width="80px" class-name="table-column-avatar" fixed="left">
          <template slot-scope="{row}">
            <img :src="row.avatar == null ? '/static/avatar/man.png' : row.avatar">
        <el-table-column label="序号" width="80px">
          <template slot-scope="scope">
            <span>{{scope.$index + 1}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="realname" label="姓名" min-width="100px" fixed="left"></el-table-column>
        <el-table-column prop="username" label="用户名" min-width="120px"></el-table-column>
        <el-table-column prop="empNo" label="工号" sortable="custom" sort-by="EMP_NO" min-width="80px"></el-table-column>
        <el-table-column prop="department" label="部门" min-width="120px">
          <template slot-scope="{row}">{{row.department == null ? '' : row.department.name}}</template>
        </el-table-column>
        <el-table-column prop="position" label="岗位" min-width="160px" class-name="table-column-strings">
          <template slot-scope="{row}">
            <ul>
              <li v-for="position in row.positions" :key="position.id">{{position.name}}</li>
            </ul>
          </template>
        </el-table-column>
        <el-table-column prop="sex" label="性别" sortable="custom" sort-by="SEX" min-width="80px">
          <template slot-scope="{row}">
            {{row.sex | sex}}
          </template>
        </el-table-column>
        <el-table-column prop="mobile" label="手机号码" min-width="100px"></el-table-column>
        <el-table-column prop="email" label="邮箱" min-width="180px"></el-table-column>
        <el-table-column prop="birthday" label="生日" sortable="custom" sort-by="BIRTHDAY" min-width="100px"></el-table-column>
        <el-table-column prop="username" label="账号" min-width="120px"></el-table-column>
        <el-table-column prop="realname" label="姓名" min-width="100px"></el-table-column>
        <el-table-column prop="mobile" label="联系方式" min-width="100px"></el-table-column>
        <el-table-column prop="roles" label="角色" min-width="160px" class-name="table-column-strings">
          <template slot-scope="{row}">
            <ul>
@@ -70,14 +51,18 @@
            </ul>
          </template>
        </el-table-column>
        <el-table-column prop="createUser" label="创建人" min-width="100px">
          <template slot-scope="{row}">{{row.createUserInfo == null ? '' : row.createUserInfo.username}}</template>
        <el-table-column label="启用状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch
              @change="changeStatus($event, row)"
              v-model="row.status"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="0"
              :inactive-value="1">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="createTime" label="创建时间" sortable="custom" sort-by="CREATE_TIME" min-width="140px"></el-table-column>
        <el-table-column prop="updateUser" label="更新人" min-width="100px">
          <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template>
        </el-table-column>
        <el-table-column prop="updateTime" label="更新时间" sortable="custom" sort-by="UPDATE_TIME" min-width="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['system:user:update', 'system:user:createUserRole', 'system:user:resetPwd', 'system:user:delete'])"
          label="操作"
@@ -86,9 +71,10 @@
        >
          <template v-if="isAdmin || (row.id !== userInfo.id && row.roles.findIndex(r => r.code === adminCode) === -1)" slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.operaUserWindow.open('编辑用户', row)" v-permissions="['system:user:update']">编辑</el-button>
            <el-button type="text" @click="$refs.allocationEnterprises.open('分配企业', row)">分配企业</el-button>
            <el-button type="text" icon="el-icon-s-custom" @click="$refs.roleConfigWindow.open(row)" v-permissions="['system:user:createUserRole']">配置角色</el-button>
            <el-button type="text" @click="$refs.resetPwdWindow.open(row)" v-permissions="['system:user:resetPwd']">重置密码</el-button>
            <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">删除</el-button>
<!--            <el-button v-if="!row.fixed" type="text" icon="el-icon-delete" @click="deleteById(row)" v-permissions="['system:user:delete']">删除</el-button>-->
          </template>
        </el-table-column>
      </el-table>
@@ -104,6 +90,8 @@
    <RoleConfigWindow ref="roleConfigWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
    <!-- é‡ç½®å¯†ç  -->
    <ResetPwdWindow ref="resetPwdWindow"/>
    <!--  åˆ†é…ä¼ä¸š  -->
    <allocationEnterprises ref="allocationEnterprises" @success="handlePageChange(tableData.pagination.pageIndex)"/>
  </TableLayout>
</template>
@@ -112,15 +100,17 @@
import TableLayout from '@/layouts/TableLayout'
import BaseTable from '@/components/base/BaseTable'
import OperaUserWindow from '@/components/system/user/OperaUserWindow'
import allocationEnterprises from '@/components/system/user/allocationEnterprises'
import RoleConfigWindow from '@/components/system/user/RoleConfigWindow'
import ResetPwdWindow from '@/components/system/user/ResetPwdWindow'
import DepartmentSelect from '@/components/common/DepartmentSelect'
import PositionSelect from '@/components/common/PositionSelect'
import { updUserStatus } from '@/api/system/user'
export default {
  name: 'SystemUser',
  extends: BaseTable,
  components: { PositionSelect, DepartmentSelect, ResetPwdWindow, RoleConfigWindow, OperaUserWindow, TableLayout, Pagination },
  components: { allocationEnterprises, PositionSelect, DepartmentSelect, ResetPwdWindow, RoleConfigWindow, OperaUserWindow, TableLayout, Pagination },
  data () {
    return {
      // æœç´¢
@@ -144,6 +134,18 @@
      }]
    })
    this.search()
  },
  methods: {
    changeStatus(status, row) {
      updUserStatus({
        id: row.id,
        status
      }).then(res => {
        this.search()
      }).catch(err => {
        row.status = row.status === 0 ? 1 : 0
      })
    }
  }
}
</script>