<template>
    <!-- 配件管理 -->
    <div class="app-container" id="accessory">
        <el-form
            :model="queryParams"
            ref="queryForm"
            size="small"
            :inline="true"
            v-show="showSearch"
        >
            <el-form-item label="关键字" prop="paName">
                <el-input
                    v-model="queryParams.paName"
                    placeholder="请输入关键字"
                    maxlength="50"
                    clearable
                    @keyup.enter.native="handleQuery"
                />
            </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="handleAdd"
                    v-hasPermi="['machinery:parts: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="paId"
            :default-expand-all="isExpandAll"
            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
        >
            <el-table-column
                prop="paName"
                label="名称"
                min-width="260"
            ></el-table-column>
            <el-table-column
                prop="unitId"
                label="计量单位"
                min-width="260"
            ></el-table-column>
            <el-table-column
                prop="buyPrice"
                label="购置价格"
                min-width="260"
            ></el-table-column>
            <el-table-column
                prop="num"
                label="数量"
                min-width="200"
            ></el-table-column>
            <el-table-column
                prop="remark"
                label="备注信息"
                min-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"
                width="160px"
            >
                <template slot-scope="scope">
                    <el-button
                        size="mini"
                        type="primary"
                        icon="el-icon-edit"
                        @click="handleUpdate(scope.row)"
                        v-hasPermi="['machinery:parts: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
                        v-if="scope.row.parentId != 0"
                        size="mini"
                        type="danger"
                        icon="el-icon-delete"
                        @click="handleDelete(scope.row)"
                        v-hasPermi="['machinery:parts:del']"
                        >删除</el-button
                    >
                </template>
            </el-table-column>
        </el-table>

        <!-- 添加或修改部门对话框 -->
        <el-dialog
            :title="title"
            :visible.sync="open"
            width="600px"
            append-to-body
            :close-on-click-modal="false"
        >
            <el-form ref="form" :model="form" :rules="rules" label-width="80px">
                <el-row>
                    <el-col :span="24">
                        <el-form-item label="上级" prop="currentId">
                            <el-cascader
                                v-model="form.currentId"
                                :options="deptOptions"
                                :disabled="isEdit"
                                :props="{
                                    expandTrigger: 'hover',
                                    label: 'label',
                                    value: 'id',
                                    checkStrictly: true,
                                }"
                                @change="handleNodeClick"
                            >
                            </el-cascader>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="名称" prop="paName">
                            <el-input
                                v-model="form.paName"
                                placeholder="请输入名称"
                                maxlength="50"
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="计量单位" prop="unitId">
                            <el-input
                                v-model="form.unitId"
                                placeholder="请输入计量单位"
                                maxlength="50"
                            />
                            <!-- <el-input-number v-model="form.unitId" controls-position="right" :min="0" /> -->
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="购置价格" prop="buyPrice">
                            <el-input
                                v-model="form.buyPrice"
                                placeholder="请输入购置价格"
                                maxlength="20"
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
                        <el-form-item label="数量" prop="num">
                            <el-input
                                v-model="form.num"
                                placeholder="请输入数量"
                                maxlength="20"
                            />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row>
                    <el-col :span="12">
                        <el-form-item label="备注信息" prop="remark">
                            <el-input
                                v-model="form.remark"
                                placeholder="请输入备注"
                                maxlength="50"
                            />
                        </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 { apiGetPartTree } from '@/api/system/dept'
import {
    listPartType,
    addMaPartType,
    getPartType,
    updatePartTypeById,
    delPartType,
} from '@/api/store/tools'

import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
// level 层级 +1
export default {
    name: 'Accessory',
    dicts: ['sys_normal_disable'],
    components: { Treeselect },
    data() {
        return {
            // 遮罩层
            loading: true,
            // 显示搜索条件
            showSearch: true,
            // 表格树数据
            deptList: [],
            // 部门树选项
            deptOptions: [],
            // 弹出层标题
            title: '',
            // 是否显示弹出层
            open: false,
            // 是否展开，默认全部展开
            isExpandAll: true,
            // 重新渲染表格状态
            refreshTable: true,
            // 查询参数
            queryParams: {
                paName: undefined,
                status: undefined,
            },
            // 表单参数
            form: {},
            // 表单校验
            rules: {
                parentId: [
                    {
                        required: true,
                        message: '上级部门不能为空',
                        trigger: 'blur',
                    },
                ],
                paName: [
                    {
                        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',
                    },
                ],
            },
            isEdit: false,
        }
    },
    created() {
        this.getList()
    },
    methods: {
        /** 查询部门列表 */
        getList() {
            // this.loading = true;
            listPartType(this.queryParams)
                .then((response) => {
                    this.deptList = this.handleTree(response.data, 'paId')
                    this.loading = false
                })
                .catch((err) => {
                    console.log('err', err)
                })
        },
        /** 转换部门数据结构 */
        normalizer(node) {
            if (node.children && !node.children.length) {
                delete node.children
            }
            return {
                id: node.paId,
                label: node.paName,
                children: node.children,
            }
        },
        // 取消按钮
        cancel() {
            this.open = false
            this.reset()
        },
        // 表单重置
        reset() {
            this.form = {
                currentId: '',
                level: undefined,
                parentId: undefined,
                paName: undefined,
                orderNum: undefined,
                leader: undefined,
                phone: undefined,
                email: undefined,
                status: '0',
            }
            this.resetForm('form')
        },
        /** 搜索按钮操作 */
        handleQuery() {
            this.getList()
        },
        /** 重置按钮操作 */
        resetQuery() {
            this.resetForm('queryForm')
            this.handleQuery()
        },
        /** 新增按钮操作 */
        handleAdd() {
            this.reset()
            this.open = true
            this.title = '添加'
            this.isEdit = false
            this.initApiGetPartTree()
        },
        /** 展开/折叠操作 */
        toggleExpandAll() {
            this.refreshTable = false
            this.isExpandAll = !this.isExpandAll
            this.$nextTick(() => {
                this.refreshTable = true
            })
        },
        /** 修改按钮操作 */
        handleUpdate(row) {
            this.reset()
            this.open = true
            this.title = '修改部门'
            this.isEdit = true
            this.initGetPartType(row)
        },
        /** 提交按钮 */
        submitForm() {
            this.$refs['form'].validate((valid) => {
                if (valid) {
                    if (this.form.paId != undefined) {
                        delete this.form.currentId
                        updatePartTypeById(this.form).then((response) => {
                            this.$modal.msgSuccess('修改成功')
                            this.open = false
                            this.getList()
                        })
                    } else {
                        addMaPartType(this.form).then((response) => {
                            this.$modal.msgSuccess('新增成功')
                            this.open = false
                            this.getList()
                        })
                    }
                }
            })
        },
        async initApiGetPartTree() {
            try {
                const res = await apiGetPartTree()
                this.deptOptions = res.data
            } catch (error) {}
        },
        handleNodeClick(ev) {
            const res = this.searchTree(
                this.deptOptions,
                this.form.currentId && this.form.currentId.length > 0
                    ? this.form.currentId.slice(-1)[0]
                    : {},
            )
            if (res) {
                this.form.parentId = res.id
                this.form.level = Number(res.level) + 1
            }
        },
        /** 删除按钮操作 */
        handleDelete(row) {
            this.$modal
                .confirm('是否确认删除名称为"' + row.paName + '"的数据项？')
                .then(function () {
                    return delPartType(row.paId)
                })
                .then(() => {
                    this.getList()
                    this.$modal.msgSuccess('删除成功')
                })
                .catch(() => {})
        },
        searchTree(tree, id) {
            let res = null
            let state = false
            function readTree(tree, id) {
                if (state) return
                for (let i = 0; i < tree.length; i++) {
                    if (tree[i].id == id) {
                        state = true
                        res = tree[i]
                    } else {
                        if (tree[i].children != null) {
                            readTree(tree[i].children, id)
                        }
                    }
                }
            }
            readTree(tree, id)
            return res
        },
        getAllParentArr(list, id, name, child) {
            for (let i in list) {
                if (list[i][name] == id) {
                    return [list[i]]
                }
                if (list[i][child]) {
                    let node = this.getAllParentArr(
                        list[i][child],
                        id,
                        name,
                        child,
                    )
                    if (!!node) {
                        return node.concat(list[i])
                    }
                }
            }
        },
        handleRowClick(ev) {
            this.form.currentId = row.parentId
        },
        async initGetPartType(row) {
            const currentItem = this.getAllParentArr(
                this.deptList,
                row.parentId,
                'parentId',
                'children',
            )
            this.form = JSON.parse(JSON.stringify(row))
            this.form.currentId =
                currentItem && currentItem.reverse().map((ele) => ele.paId)
            this.initApiGetPartTree()
        },
    },
}
</script>
<style lang="scss" scoped>
::v-deep.el-table .fixed-width .el-button--mini {
    width: 60px !important;
    margin-bottom: 10px;
}
</style>