<template>
    <div class="app-container">
        <el-form
            :model="queryParams"
            ref="queryForm"
            size="small"
            :inline="true"
            v-show="showSearch"
        >
            <el-form-item prop="deptName">
                <el-input
                    clearable
                    placeholder="部门名称"
                    v-model="queryParams.deptName"
                    @keyup.enter.native="handleQuery"
                />
            </el-form-item>

            <el-form-item>
                <el-button
                    size="mini"
                    type="primary"
                    icon="el-icon-search"
                    @click="handleQuery"
                >
                    搜索
                </el-button>
                <el-button
                    size="mini"
                    @click="resetQuery"
                    icon="el-icon-refresh"
                >
                    重置
                </el-button>
                <el-button
                    type="primary"
                    plain
                    size="mini"
                    @click="handleAdd"
                    icon="el-icon-plus"
                    v-hasPermi="['system:dept:add']"
                >
                    新增
                </el-button>
            </el-form-item>
        </el-form>

        <el-table
            v-if="refreshTable"
            v-loading="loading"
            :data="deptList"
            row-key="deptId"
            border
            :default-expand-all="isExpandAll"
            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
        >
            <el-table-column prop="deptName" label="部门名称" align="center" />
            <el-table-column prop="remark" label="部门描述" align="center" />

            <el-table-column label="更新时间" align="center" prop="createTime">
                <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-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="50%"
            append-to-body
        >
            <el-form
                ref="form"
                :model="form"
                :rules="rules"
                label-width="120px"
            >
                <el-row>
                    <el-col :span="24">
                        <el-form-item label="部门名称" prop="deptName">
                            <el-input
                                maxlength="30"
                                show-word-limit
                                v-model="form.deptName"
                                placeholder="请输入部门名称"
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="24">
                        <el-form-item label="上级部门" prop="parentId">
                            <treeselect
                                v-model="form.parentId"
                                :options="deptOptions"
                                :normalizer="normalizer"
                                placeholder="选择上级部门"
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="24">
                        <el-form-item label="部门描述" prop="remark">
                            <el-input
                                type="textarea"
                                maxlength="100"
                                show-word-limit
                                v-model="form.remark"
                                placeholder="请输入部门描述"
                                :autosize="{ minRows: 6, maxRows: 10 }"
                            />
                        </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>
    </div>
</template>

<script>
import {
    listDept,
    getDept,
    delDept,
    addDept,
    updateDept,
    listDeptExcludeChild,
} 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: false,
                //         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',
                    },
                ],
            },
        }
    },
    created() {
        this.getList()
    },
    methods: {
        /** 查询部门列表 */
        getList() {
            this.loading = true
            listDept(this.queryParams).then((response) => {
                this.deptList = this.handleTree(response.data, 'deptId')
                this.loading = false
            })
        },
        /** 转换部门数据结构 */
        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',
                remark: undefined,
            }
            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.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.form.parentId === 0
                    ? (this.form.parentId = undefined)
                    : null
                this.open = true
                this.title = '修改部门'
                listDeptExcludeChild(row.deptId).then((response) => {
                    this.deptOptions = this.handleTree(response.data, 'deptId')
                    if (this.deptOptions.length == 0) {
                        const noResultsOptions = {
                            deptId: this.form.parentId,
                            deptName: this.form.parentName,
                            children: [],
                        }
                        this.deptOptions.push(noResultsOptions)
                    }
                })
            })
        },
        /** 提交按钮 */
        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 {
                        const { deptName, parentId, remark } = this.form
                        const params = { deptName, remark }

                        if (parentId === undefined) {
                            params.parentId = 0
                        } else {
                            params.parentId = parentId
                        }
                        addDept(params).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(() => {})
        },
    },
}
</script>
