<template>
    <div class="app-container">
        <el-form
            :model="queryParams"
            ref="queryForm"
            size="small"
            :inline="true"
            v-show="showSearch"
        >
            <el-form-item label="部门名称" prop="deptName">
                <el-input
                    v-model="queryParams.deptName"
                    placeholder="请输入部门名称"
                    clearable
                    @keyup.enter.native="handleQuery"
                />
            </el-form-item>
            <el-form-item label="状态" prop="status">
                <el-select
                    v-model="queryParams.status"
                    filterable
                    placeholder="部门状态"
                    clearable
                >
                    <el-option
                        v-for="dict in dict.type.sys_normal_disable"
                        :key="dict.value"
                        :label="dict.label"
                        :value="dict.value"
                    />
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button
                    type="primary"
                    icon="el-icon-search"
                    size="mini"
                    @click="handleQuery"
                    >搜索</el-button
                >
                <el-button
                    icon="el-icon-refresh"
                    size="mini"
                    @click="resetQuery"
                    >重置</el-button
                >
            </el-form-item>
        </el-form>

        <el-row :gutter="10" class="mb8">
            <el-col :span="1.5">
                <!-- 超级管理员所属 -->
                <el-button
                    type="primary"
                    plain
                    icon="el-icon-plus"
                    size="mini"
                    @click="handleAddCompany"
                    v-if="
                        userId == 1 &&
                        (ENV === 'development-nw' || ENV === 'production-nw')
                    "
                    >新增公司</el-button
                >
            </el-col>
            <el-col :span="1.5">
                <el-button
                    type="primary"
                    plain
                    icon="el-icon-plus"
                    size="mini"
                    @click="handleAdd"
                    v-hasPermi="['system:dept:add']"
                    >新增部门</el-button
                >
            </el-col>
            <el-col :span="1.5">
                <el-button
                    type="info"
                    plain
                    icon="el-icon-sort"
                    size="mini"
                    @click="toggleExpandAll"
                    >展开/折叠</el-button
                >
            </el-col>
            <right-toolbar
                :showSearch.sync="showSearch"
                @queryTable="getList"
            ></right-toolbar>
        </el-row>

        <el-table
            v-if="refreshTable"
            v-loading="loading"
            :data="deptList"
            row-key="deptId"
            :default-expand-all="isExpandAll"
            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
        >
            <el-table-column
                prop="deptName"
                label="部门名称"
                width="260"
            ></el-table-column>
            <el-table-column
                prop="orderNum"
                label="排序"
                width="200"
            ></el-table-column>
            <el-table-column prop="status" label="状态" width="100">
                <template slot-scope="scope">
                    <dict-tag
                        :options="dict.type.sys_normal_disable"
                        :value="scope.row.status"
                    />
                </template>
            </el-table-column>
            <el-table-column
                label="创建时间"
                align="center"
                prop="createTime"
                width="200"
            >
                <template slot-scope="scope">
                    <span>{{ parseTime(scope.row.createTime) }}</span>
                </template>
            </el-table-column>
            <el-table-column
                label="操作"
                align="center"
                class-name="small-padding fixed-width"
            >
                <template slot-scope="scope">
                    <el-button
                        size="mini"
                        type="text"
                        icon="el-icon-edit"
                        @click="handleUpdate(scope.row)"
                        v-hasPermi="['system:dept:edit']"
                        >修改</el-button
                    >
                    <el-button
                        size="mini"
                        type="text"
                        icon="el-icon-plus"
                        @click="handleAdd(scope.row)"
                        v-hasPermi="['system:dept:add']"
                        >新增</el-button
                    >
                    <el-button
                        size="mini"
                        type="text"
                        icon="el-icon-delete"
                        @click="handleDelete(scope.row)"
                        v-hasPermi="['system:dept:remove']"
                        >删除</el-button
                    >
                </template>
            </el-table-column>
        </el-table>

        <!-- 添加或修改部门对话框 -->
        <el-dialog
            :title="title"
            :visible.sync="open"
            width="60%"
            append-to-body
        >
            <el-form
                ref="form"
                :model="form"
                :rules="rules"
                label-width="140px"
            >
                <el-row>
                    <el-col :span="24" v-if="form.parentId !== 0">
                        <el-form-item label="上级部门" prop="parentId">
                            <treeselect
                                v-model="form.parentId"
                                :options="deptOptions"
                                :normalizer="normalizer"
                                noChildrenText="没有数据了"
                                noOptionsText="没有数据"
                                noResultsText="没有搜索结果"
                                placeholder="选择上级部门"
                                @select="treeChange"
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="部门名称" prop="deptName">
                            <el-input
                                v-model="form.deptName"
                                placeholder="请输入部门名称"
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="显示排序" prop="orderNum">
                            <el-input-number
                                v-model="form.orderNum"
                                controls-position="right"
                                style="width: 100%"
                                :min="0"
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row v-if="form.parentId === 0">
                    <el-col :span="12">
                        <el-form-item
                            label="统一社会信用代码"
                            prop="socialCreditCode"
                        >
                            <el-input
                                v-model="form.socialCreditCode"
                                placeholder="请输入统一社会信用代码"
                                clearable
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item
                            label="企业代号"
                            prop="enterpriseOwnershipCode"
                        >
                            <el-select
                                v-model="form.enterpriseOwnershipCode"
                                placeholder="请选择企业代号"
                                style="width: 100%"
                                clearable
                            >
                                <el-option
                                    label="南方电网下属企业"
                                    value="CSG"
                                />
                                <el-option
                                    label="社会及大集体企业"
                                    value="SE"
                                />
                            </el-select>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="负责人" prop="leader">
                            <el-input
                                v-model="form.leader"
                                placeholder="请输入负责人"
                                maxlength="20"
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="联系电话" prop="phone">
                            <el-input
                                v-model="form.phone"
                                placeholder="请输入联系电话"
                                maxlength="11"
                                onkeyup="this.value = this.value.replace(/[^\d]/g,'');"
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="邮箱" prop="email">
                            <el-input
                                v-model="form.email"
                                placeholder="请输入邮箱"
                                maxlength="50"
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="部门状态">
                            <el-radio-group v-model="form.status">
                                <el-radio
                                    v-for="dict in dict.type.sys_normal_disable"
                                    :key="dict.value"
                                    :label="dict.value"
                                    >{{ dict.label }}</el-radio
                                >
                            </el-radio-group>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button type="primary" @click="submitForm">确 定</el-button>
                <el-button @click="cancel">取 消</el-button>
            </div>
        </el-dialog>

        <!-- 新增公司 -->
        <el-dialog
            title="添加公司"
            :visible.sync="addCompanyVisible"
            width="50%"
            append-to-body
            :before-close="closeAddCompanyDialog"
        >
            <el-form
                ref="addCompanyRef"
                :model="addCompanyForm"
                :rules="addCompanyRules"
                label-width="140px"
            >
                <el-form-item label="公司名称" prop="deptName">
                    <el-input
                        v-model="addCompanyForm.deptName"
                        placeholder="请输入公司名称"
                        clearable
                    />
                </el-form-item>
                <el-form-item prop="socialCreditCode" label="统一社会信用代码">
                    <el-input
                        v-model="addCompanyForm.socialCreditCode"
                        placeholder="请输入统一社会信用代码"
                        clearable
                    />
                </el-form-item>
                <el-form-item label="企业代号" prop="enterpriseOwnershipCode">
                    <el-select
                        v-model="addCompanyForm.enterpriseOwnershipCode"
                        placeholder="请选择企业代号"
                        style="width: 100%"
                        clearable
                    >
                        <el-option label="南方电网下属企业" value="CSG" />
                        <el-option label="社会及大集体企业" value="SE" />
                    </el-select>
                </el-form-item>
            </el-form>
            <!-- <el-table border :data="companyList">
                <el-table-column
                    type="index"
                    label="序号"
                    width="80"
                    align="center"
                />
                <el-table-column label="公司名称" align="center">
                    <template slot-scope="scope">
                        <el-input
                            placeholder="请输入公司名称"
                            clearable
                            v-model.trim="scope.row.deptName"
                            :ref="`deptName_${scope.$index}`"
                        />
                    </template>
                </el-table-column>
                <el-table-column label="统一社会信用代码" align="center">
                    <template slot-scope="scope">
                        <el-input
                            placeholder="请输入统一社会信用代码"
                            clearable
                            v-model.trim="scope.row.socialCreditCode"
                            :ref="`socialCreditCode_${scope.$index}`"
                        />
                    </template>
                </el-table-column>
                <el-table-column label="企业代号" align="center">
                    <template slot-scope="scope">
                        <el-input
                            placeholder="请输入企业代号"
                            clearable
                            v-model.trim="scope.row.enterpriseOwnershipCode"
                            :ref="`enterpriseOwnershipCode_${scope.$index}`"
                        />
                    </template>
                </el-table-column>

                <el-table-column label="操作" align="center" width="180">
                    <template slot-scope="scope">
                        <el-button
                            type="text"
                            @click="addRows"
                            icon="el-icon-plus"
                            v-if="scope.$index === 0"
                            >新增</el-button
                        >
                        <el-button
                            type="text"
                            @click="delRows(scope.$index)"
                            icon="el-icon-delete"
                            style="color: #f56c6c"
                            v-if="scope.$index !== 0"
                            >删除</el-button
                        >
                    </template>
                </el-table-column>
            </el-table> -->
            <div slot="footer" class="dialog-footer">
                <el-button size="mini" type="primary" @click="submitCompany"
                    >确 定</el-button
                >
                <el-button size="mini" @click="closeAddCompanyDialog"
                    >取 消</el-button
                >
            </div>
        </el-dialog>
    </div>
</template>

<script>
import {
    listDept,
    getDept,
    delDept,
    addDept,
    updateDept,
    listDeptExcludeChild,
    addCompanyApi,
} from '@/api/system/dept'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'

export default {
    name: 'Dept',
    dicts: ['sys_normal_disable'],
    components: { Treeselect },
    data() {
        return {
            // 遮罩层
            loading: true,
            // 显示搜索条件
            showSearch: true,
            // 表格树数据
            deptList: [],
            // 部门树选项
            deptOptions: [],
            // 弹出层标题
            title: '',
            // 是否显示弹出层
            open: false,
            // 是否展开，默认全部展开
            isExpandAll: true,
            // 重新渲染表格状态
            refreshTable: true,
            // 查询参数
            queryParams: {
                deptName: undefined,
                status: undefined,
            },
            // 表单参数
            form: {},
            // 表单校验
            rules: {
                parentId: [
                    {
                        required: true,
                        message: '上级部门不能为空',
                        trigger: 'blur',
                    },
                ],
                deptName: [
                    {
                        required: true,
                        message: '部门名称不能为空',
                        trigger: 'blur',
                    },
                ],
                orderNum: [
                    {
                        required: true,
                        message: '显示排序不能为空',
                        trigger: 'blur',
                    },
                ],
                email: [
                    {
                        type: 'email',
                        message: '请输入正确的邮箱地址',
                        trigger: ['blur', 'change'],
                    },
                ],
                phone: [
                    {
                        pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
                        message: '请输入正确的手机号码',
                        trigger: 'blur',
                    },
                ],
            },
            // 新增公司弹框
            addCompanyVisible: false,
            // 新增公司数据源
            companyList: [
                {
                    deptName: '',
                    socialCreditCode: '',
                    enterpriseOwnershipCode: '',
                },
            ],
            userId: sessionStorage.getItem('userId'),
            ENV: process.env.VUE_APP_ENV, // 获取当前运行环境 如是南网开发环境或线上环境 则显示新增公司按钮

            addCompanyForm: {
                deptName: '',
                socialCreditCode: '',
                enterpriseOwnershipCode: '',
            },

            addCompanyRules: {
                deptName: [
                    {
                        required: true,
                        message: '请输入公司名称',
                        trigger: 'blur',
                    },
                ],

                socialCreditCode: [
                    {
                        required: true,
                        message: '请输入统一社会信用代码',
                        trigger: 'blur',
                    },
                    // {
                    //     pattern: /^[A-Z0-9]{2}[0-9]{6}[A-Z0-9]{9}[0-9X]$/,
                    //     message: '请输入正确的统一社会信用代码',
                    //     trigger: 'blur',
                    // },
                ],

                enterpriseOwnershipCode: [
                    {
                        required: true,
                        message: '请选择企业代号',
                        trigger: ['blur', 'change'],
                    },
                ],
            },
        }
    },
    created() {
        this.getList()
    },
    methods: {
        /** 查询部门列表 */
        getList() {
            this.loading = true
            listDept(this.queryParams).then((response) => {
                this.deptList = this.handleTree(response.data, 'deptId')
                this.loading = false
                // console.log(this.deptList, '树节点数据---')
            })
        },
        /** 转换部门数据结构 */
        normalizer(node) {
            if (node.children && !node.children.length) {
                delete node.children
            }
            return {
                id: node.deptId,
                label: node.deptName,
                children: node.children,
            }
        },
        // 取消按钮
        cancel() {
            this.open = false
            this.reset()
        },
        // 表单重置
        reset() {
            this.form = {
                deptId: undefined,
                parentId: undefined,
                deptName: undefined,
                orderNum: undefined,
                leader: undefined,
                phone: undefined,
                email: undefined,
                status: '0',
            }
            this.resetForm('form')
        },
        /** 搜索按钮操作 */
        handleQuery() {
            this.getList()
        },
        /** 重置按钮操作 */
        resetQuery() {
            this.resetForm('queryForm')
            this.handleQuery()
        },
        /** 新增按钮操作 */
        handleAdd(row) {
            this.reset()
            if (row != undefined) {
                this.form.parentId = row.deptId
                this.form.companyId = row.companyId
            }
            this.open = true
            this.title = '添加部门'
            listDept().then((response) => {
                this.deptOptions = this.handleTree(response.data, 'deptId')
            })
        },
        /** 展开/折叠操作 */
        toggleExpandAll() {
            this.refreshTable = false
            this.isExpandAll = !this.isExpandAll
            this.$nextTick(() => {
                this.refreshTable = true
            })
        },
        /** 修改按钮操作 */
        handleUpdate(row) {
            this.reset()
            getDept(row.deptId).then((response) => {
                this.form = response.data
                this.open = true
                this.title = '修改部门'
            })
            listDeptExcludeChild(row.deptId).then((response) => {
                this.deptOptions = this.handleTree(response.data, 'deptId')
            })
        },
        /** 提交按钮 */
        submitForm: function () {
            this.$refs['form'].validate((valid) => {
                if (valid) {
                    if (this.form.deptId != undefined) {
                        updateDept(this.form).then((response) => {
                            this.$modal.msgSuccess('修改成功')
                            this.open = false
                            this.getList()
                        })
                    } else {
                        addDept(this.form).then((response) => {
                            this.$modal.msgSuccess('新增成功')
                            this.open = false
                            this.getList()
                        })
                    }
                }
            })
        },
        /** 删除按钮操作 */
        handleDelete(row) {
            this.$modal
                .confirm('是否确认删除名称为"' + row.deptName + '"的数据项？')
                .then(function () {
                    return delDept(row.deptId)
                })
                .then(() => {
                    this.getList()
                    this.$modal.msgSuccess('删除成功')
                })
                .catch(() => {})
        },
        /** 树节点选择事件 */
        treeChange(val) {
            this.form.companyId = val.companyId
        },
        /** 新增公司 */
        handleAddCompany() {
            console.log('新增公司！！')
            this.addCompanyVisible = true
        },
        /** 新增行 */
        addRows() {
            const rows = {
                deptName: '',
                socialCreditCode: '',
                enterpriseOwnershipCode: '',
            }
            this.companyList.push(rows)
        },
        /** 删除行 */
        delRows(index) {
            this.companyLis = this.companyList.splice(index, 1)
        },
        /** 确定 */
        async submitCompany() {
            this.$refs['addCompanyRef'].validate(async (valid) => {
                if (valid) {
                    const res = await addCompanyApi(this.addCompanyForm)
                    if (res.code === 200) {
                        this.$message.success('新增成功！')
                        this.addCompanyVisible = false
                        this.$refs.addCompanyRef.resetFields()
                        this.getList()
                    }
                }
            })
            // 判断公司名称是否为空
            // let isNull = false
            // try {
            //     this.companyList.map((e, v) => {
            //         if (!e.deptName) {
            //             this.$message.error('请输入公司名称！')
            //             this.$refs[`deptName_${v}`][0].focus()
            //             isNull = true
            //             throw new Error()
            //         }
            //         if (!e.socialCreditCode) {
            //             this.$message.error('请输入统一社会信用代码！')
            //             this.$refs[`socialCreditCode_${v}`][0].focus()
            //             isNull = true
            //             throw new Error()
            //         }
            //         if (!e.enterpriseOwnershipCode) {
            //             this.$message.error('请输入企业代号！')
            //             this.$refs[`enterpriseOwnershipCode_${v}`][0].focus()
            //             isNull = true
            //             throw new Error()
            //         }
            //     })
            // } catch (error) {}
            // if (isNull) return
            // // 判断已有的公司名称是否重复
            // const seen = {}
            // const uniqueCompanyList = this.companyList.reduce((acc, item) => {
            //     const name = item.deptName
            //     if (!seen[name]) {
            //         seen[name] = true
            //         acc.push(item)
            //     }
            //     return acc
            // }, [])

            // if (uniqueCompanyList.length < this.companyList.length) {
            //     this.$message.error('公司名称不可重复添加！')
            //     return
            // }
            // let list = [...this.companyList]
            // const res = await addCompanyApi(list)
            // if (res.code == 200) {
            //     this.$message.success('新增成功！')
            //     this.getList()
            //     this.companyList = [
            //         {
            //             deptName: '',
            //             socialCreditCode: '',
            //             enterpriseOwnershipCode: '',
            //         },
            //     ]
            //     this.addCompanyVisible = false
            // }
        },
        /** 关闭新增公司弹框 */
        closeAddCompanyDialog() {
            this.addCompanyVisible = false
            this.$refs.addCompanyRef.resetFields()
        },
    },
}
</script>
