<template>
   <div class="app-container">
      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-position="top">
         <el-form-item label="部门名称" prop="deptName" label-position="top">
            <el-input
               v-model="queryParams.deptName"
               placeholder="请输入部门名称"
               clearable
               @keyup.enter="handleQuery"
            />
         </el-form-item>
         <el-form-item label="状态" prop="status" label-position="top">
            <el-select v-model="queryParams.status" placeholder="部门状态" clearable>
               <el-option
                  v-for="dict in sys_normal_disable"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
               />
            </el-select>
         </el-form-item>
         <el-form-item label-position="top"/>
         <el-form-item label-position="top">
            <div class="item-search">&nbsp;</div>
            <div class="item-search">
               <el-button icon="Refresh" @click="resetQuery">重置</el-button>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
            </div>
         </el-form-item>
      </el-form>
      <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
            <el-button
               type="primary"
               icon="Plus"
               @click="handleAdd"
               v-hasPermi="['system:dept:add']"
            >新增</el-button>
         </el-col>
         <el-col :span="1.5">
            <el-button
               type="info"
               icon="Sort"
               @click="toggleExpandAll"
            >展开/折叠</el-button>
         </el-col>
         <right-toolbar v-model:showSearch="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="部门名称"></el-table-column>
         <el-table-column prop="level" label="层级" width="100">
            <template #default="scope">
               <dict-tag :options="dept_level" :value="scope.row.level" />
            </template>
         </el-table-column>
         <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
         <el-table-column prop="status" label="状态" width="100">
            <template #default="scope">
               <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
            </template>
         </el-table-column>
         <el-table-column label="创建时间" prop="createTime" width="200">
            <template #default="scope">
               <span>{{ parseTime(scope.row.createTime) }}</span>
            </template>
         </el-table-column>
         <el-table-column label="操作" class-name="small-padding fixed-width" width="210">
            <template #default="scope">
               <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']"><i class="fa fa-edit"></i>编辑</el-button>
               <el-button link type="success" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']"><i class="fa fa-plus"></i>新增</el-button>
               <el-button v-if="scope.row.parentId != 0" link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']"><i class="fa fa-trash"></i>删除</el-button>
            </template>
         </el-table-column>
      </el-table>

      <!-- 添加或修改部门对话框 -->
      <el-dialog :title="title" v-model="open" width="600px" append-to-body>
         <el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
            <el-row>
               <el-col :span="24" v-if="form.parentId !== 0">
                  <el-form-item label="上级部门" prop="parentId">
                     <el-tree-select
                        v-model="form.parentId"
                        :data="deptOptions"
                        :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
                        value-key="deptId"
                        placeholder="选择上级部门"
                        check-strictly
                        :disabled="isLevelDisabled"
                     />
                  </el-form-item>
               </el-col>
               <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="level">
                     <el-select v-model="form.level" placeholder="请选择层级" :disabled="isLevelDisabled">
                        <el-option
                           v-for="dict in dept_level"
                           :key="dict.value"
                           :label="dict.label"
                           :value="dict.value"
                        />
                     </el-select>
                  </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" :min="0" />
                  </el-form-item>
               </el-col>
               <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" />
                  </el-form-item>
               </el-col>
               <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 sys_normal_disable"
                           :key="dict.value"
                           :value="dict.value"
                        >{{ dict.label }}</el-radio>
                     </el-radio-group>
                  </el-form-item>
               </el-col>
            </el-row>
         </el-form>
         <template #footer>
            <div class="dialog-footer">
               <el-button type="primary" @click="submitForm">确 定</el-button>
               <el-button @click="cancel">取 消</el-button>
            </div>
         </template>
      </el-dialog>
   </div>
</template>

<script setup name="Dept">
import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"

const { proxy } = getCurrentInstance()
const { sys_normal_disable, dept_level } = proxy.useDict("sys_normal_disable", "dept_level")

const deptList = ref([])
const open = ref(false)
const loading = ref(true)
const showSearch = ref(true)
const title = ref("")
const deptOptions = ref([])
const isExpandAll = ref(true)
const refreshTable = ref(true)
const isLevelDisabled = computed(() => {
  // 根节点不能编辑层级
  return form.value.parentId === 0
})

const data = reactive({
  form: {},
  queryParams: {
    deptName: undefined,
    status: undefined
  },
  rules: {
    parentId: [{ required: true, message: "上级部门不能为空", trigger: "blur" }],
    deptName: [{ required: true, message: "部门名称不能为空", trigger: "blur" }],
    level: [{ 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" }]
  },
})

/** 验证层级规则 */
function validateLevelRule(rule, value, callback) {
  // 根节点不需要验证层级
  if (form.value.parentId === 0) {
    return callback()
  }
  // 其他情况按正常规则验证
  if (!value) {
    callback(new Error('部门层级不能为空'))
  } else {
    callback()
  }
}

const { queryParams, form, rules } = toRefs(data)

/** 查询部门列表 */
function getList() {
  loading.value = true
  listDept(queryParams.value).then(response => {
    deptList.value = proxy.handleTree(response.data, "deptId")
    loading.value = false
  })
}

/** 取消按钮 */
function cancel() {
  open.value = false
  reset()
}

/** 表单重置 */
function reset() {
  form.value = {
    deptId: undefined,
    parentId: undefined,
    deptName: undefined,
    level: "1",
    orderNum: 0,
    leader: undefined,
    phone: undefined,
    email: undefined,
    status: "0"
  }
  proxy.resetForm("deptRef")
}

/** 搜索按钮操作 */
function handleQuery() {
  getList()
}

/** 重置按钮操作 */
function resetQuery() {
  proxy.resetForm("queryRef")
  handleQuery()
}

/** 新增按钮操作 */
function handleAdd(row) {
  reset()
  listDept().then(response => {
    deptOptions.value = proxy.handleTree(response.data, "deptId")
  })
  if (row != undefined) {
    form.value.parentId = row.deptId
  }
  open.value = true
  title.value = "添加部门"
}

/** 展开/折叠操作 */
function toggleExpandAll() {
  refreshTable.value = false
  isExpandAll.value = !isExpandAll.value
  nextTick(() => {
    refreshTable.value = true
  })
}

/** 修改按钮操作 */
function handleUpdate(row) {
  reset()
  listDeptExcludeChild(row.deptId).then(response => {
    deptOptions.value = proxy.handleTree(response.data, "deptId")
  })
  getDept(row.deptId).then(response => {
    // 保留原始数据
    const deptData = response.data
    // 如果是根节点且level未设置，则设置默认值
    if (deptData.parentId === 0 && !deptData.level) {
      deptData.level = "1"
    }
    form.value = deptData
    open.value = true
    title.value = "修改部门"
  })
}

/** 提交按钮 */
function submitForm() {
  proxy.$refs["deptRef"].validate(valid => {
    if (valid) {
      // 验证层级规则
      if (!validateLevelRules()) {
        return
      }
      
      if (form.value.deptId != undefined) {
        updateDept(form.value).then(response => {
          proxy.$modal.msgSuccess("修改成功")
          open.value = false
          getList()
        })
      } else {
        addDept(form.value).then(response => {
          proxy.$modal.msgSuccess("新增成功")
          open.value = false
          getList()
        })
      }
    }
  })
}

/** 验证层级规则 */
function validateLevelRules() {
  // 根节点无需验证层级规则
  if (form.value.parentId === 0) {
    return true;
  }
  
  // 获取当前选择的父级部门
  const parentDept = findDeptById(form.value.parentId, deptOptions.value);
  if (!parentDept) {
    proxy.$modal.msgError("未找到父级部门信息");
    return false;
  }
  
  // 如果当前层级为维保中心(2)
  if (form.value.level === "2") {
    // 父级不能是维保中心(2)或场站(3)
    if (parentDept.level === "2" || parentDept.level === "3") {
      proxy.$modal.msgError("维保中心不能添加在维保中心或场站下");
      return false;
    }
    
    // 祖级列表中不能有维保中心(2)或场站(3)
    const ancestors = parentDept.ancestors ? parentDept.ancestors.split(",") : [];
    const ancestorDepts = findDeptsByIds(ancestors, deptOptions.value);
    for (const ancestor of ancestorDepts) {
      if (ancestor.level === "2" || ancestor.level === "3") {
        proxy.$modal.msgError("维保中心的上级不能包含维保中心或场站");
        return false;
      }
    }
  }
  
  // 如果当前层级为场站(3)
  if (form.value.level === "3") {
    // 父级必须是维保中心(2)
    if (parentDept.level !== "2") {
      proxy.$modal.msgError("场站只能添加在维保中心下");
      return false;
    }
    
    // 祖级列表中不能有场站(3)
    const ancestors = parentDept.ancestors ? parentDept.ancestors.split(",") : [];
    const ancestorDepts = findDeptsByIds(ancestors, deptOptions.value);
    for (const ancestor of ancestorDepts) {
      if (ancestor.level === "3") {
        proxy.$modal.msgError("场站的上级不能包含场站");
        return false;
      }
    }
  }
  
  // 编辑时检查子级是否违反层级规则
  if (form.value.deptId) {
    // 从完整的部门列表中查找当前部门，以获取真实的子级信息
    const currentDept = findDeptById(form.value.deptId, deptList.value);
    if (currentDept && currentDept.children) {
      // 检查子级中是否有场站
      const hasStation = currentDept.children.some(child => child.level === "3");
      // 检查子级中是否有维保中心
      const hasMaintenanceCenter = currentDept.children.some(child => child.level === "2");
      
      if (form.value.level === "1") {
        // 如果要修改为普通部门
        if (hasStation) {
          // 有场站的部门必须是维保中心
          proxy.$modal.msgError("该部门的子级包含场站，不能修改为普通部门");
          return false;
        }
        // 有维保中心的部门可以是普通部门，所以不需要报错
      } else if (form.value.level === "2") {
        // 如果要修改为维保中心
        if (hasStation) {
          // 有场站的部门必须保持为维保中心，这个检查已经通过
        }
        // 有维保中心的部门不能改为维保中心
        if (hasMaintenanceCenter) {
          proxy.$modal.msgError("该部门的子级包含维保中心，不能修改为维保中心");
          return false;
        }
      } else if (form.value.level === "3") {
        // 如果要修改为场站
        if (hasMaintenanceCenter || hasStation) {
          proxy.$modal.msgError("该部门的子级包含维保中心或场站，不能修改为场站");
          return false;
        }
      }
    }
  }
  
  return true;
}

/**
 * 检查维保中心是否有场站子级
 */
function hasStationChildren(dept) {
  if (!dept.children || dept.children.length === 0) {
    return false;
  }
  
  for (const child of dept.children) {
    if (child.level === "3") {
      return true;
    }
    // 递归检查孙级部门
    if (hasStationChildren(child)) {
      return true;
    }
  }
  
  return false;
}

/** 根据ID查找部门 */
function findDeptById(deptId, depts) {
  for (const dept of depts) {
    if (dept.deptId === deptId) {
      return dept
    }
    if (dept.children && dept.children.length > 0) {
      const found = findDeptById(deptId, dept.children)
      if (found) {
        return found
      }
    }
  }
  return null
}

/** 根据ID数组查找部门 */
function findDeptsByIds(deptIds, depts) {
  const result = []
  const allDepts = flattenDepts(depts)
  
  for (const deptId of deptIds) {
    const dept = allDepts.find(d => d.deptId == deptId)
    if (dept) {
      result.push(dept)
    }
  }
  
  return result
}

/** 扁平化部门树 */
function flattenDepts(depts) {
  const result = []
  for (const dept of depts) {
    result.push(dept)
    if (dept.children && dept.children.length > 0) {
      result.push(...flattenDepts(dept.children))
    }
  }
  return result
}

/** 删除按钮操作 */
function handleDelete(row) {
  proxy.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function() {
    return delDept(row.deptId)
  }).then(() => {
    getList()
    proxy.$modal.msgSuccess("删除成功")
  }).catch(() => {})
}

getList()
</script>