gaoluyang
6 天以前 19edc651c0e4718e9ccc645d7417146953fbbd70
src/views/safetyManagement/basicInfo/index.vue
@@ -18,7 +18,7 @@
          <div class="actions">
            <el-button type="primary" @click="addPersonnel" icon="Plus">新增</el-button>
          </div>
          <PIMTable :column="personnelColumns" :tableData="personnelList" :page="personnelPage" @pagination="changePersonnelPage" />
          <PIMTable :column="personnelColumns" :tableData="personnelList" :page="personnelPage" @pagination="changePersonnelPage" :tableLoading="personnelLoading" />
        </div>
      </el-tab-pane>
@@ -28,7 +28,7 @@
            <el-input v-model="equipmentFilters.name" placeholder="请输入设备名称" clearable style="width: 200px" />
          </el-form-item>
          <el-form-item label="所属区域">
            <el-input v-model="equipmentFilters.area" placeholder="请输入所属区域" clearable style="width: 200px" />
            <el-input v-model="equipmentFilters.areaName" placeholder="请输入所属区域" clearable style="width: 200px" />
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="getEquipmentData">搜索</el-button>
@@ -39,7 +39,7 @@
          <div class="actions">
            <el-button type="primary" @click="addEquipment" icon="Plus">新增</el-button>
          </div>
          <PIMTable :column="equipmentColumns" :tableData="equipmentList" :page="equipmentPage" @pagination="changeEquipmentPage" />
          <PIMTable :column="equipmentColumns" :tableData="equipmentList" :page="equipmentPage" @pagination="changeEquipmentPage" :tableLoading="equipmentLoading" />
        </div>
      </el-tab-pane>
@@ -57,7 +57,7 @@
          <div class="actions">
            <el-button type="primary" @click="addArea" icon="Plus">新增</el-button>
          </div>
          <PIMTable :column="areaColumns" :tableData="areaList" :page="areaPage" @pagination="changeAreaPage" />
          <PIMTable :column="areaColumns" :tableData="areaList" :page="areaPage" @pagination="changeAreaPage" :tableLoading="areaLoading" />
        </div>
      </el-tab-pane>
@@ -75,7 +75,7 @@
          <div class="actions">
            <el-button type="primary" @click="addRisk" icon="Plus">新增</el-button>
          </div>
          <PIMTable :column="riskColumns" :tableData="riskList" :page="riskPage" @pagination="changeRiskPage" />
          <PIMTable :column="riskColumns" :tableData="riskList" :page="riskPage" @pagination="changeRiskPage" :tableLoading="riskLoading" />
        </div>
      </el-tab-pane>
@@ -93,16 +93,197 @@
          <div class="actions">
            <el-button type="primary" @click="addEmergency" icon="Plus">新增</el-button>
          </div>
          <PIMTable :column="emergencyColumns" :tableData="emergencyList" :page="emergencyPage" @pagination="changeEmergencyPage" />
          <PIMTable :column="emergencyColumns" :tableData="emergencyList" :page="emergencyPage" @pagination="changeEmergencyPage" :tableLoading="emergencyLoading" />
        </div>
      </el-tab-pane>
    </el-tabs>
    <!-- 人员档案弹窗 -->
    <el-dialog :title="personnelDialog.title" v-model="personnelDialog.visible" width="600px" append-to-body>
      <el-form ref="personnelFormRef" :model="personnelForm" :rules="personnelRules" label-width="100px">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="personnelForm.name" placeholder="请输入姓名" />
        </el-form-item>
        <el-form-item label="部门" prop="dept">
          <el-input v-model="personnelForm.dept" placeholder="请输入部门" />
        </el-form-item>
        <el-form-item label="岗位" prop="post">
          <el-input v-model="personnelForm.post" placeholder="请输入岗位" />
        </el-form-item>
        <el-form-item label="联系方式" prop="phone">
          <el-input v-model="personnelForm.phone" placeholder="请输入联系方式" />
        </el-form-item>
        <el-form-item label="入职日期" prop="entryDate">
          <el-date-picker v-model="personnelForm.entryDate" type="date" placeholder="选择入职日期" value-format="YYYY-MM-DD" style="width: 100%" />
        </el-form-item>
        <el-form-item label="状态" prop="status">
          <el-radio-group v-model="personnelForm.status">
            <el-radio :value="1">在职</el-radio>
            <el-radio :value="0">离职</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="personnelForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="personnelDialog.visible = false">取 消</el-button>
        <el-button type="primary" @click="submitPersonnelForm" :loading="personnelDialog.loading">确 定</el-button>
      </template>
    </el-dialog>
    <!-- 设备设施弹窗 -->
    <el-dialog :title="equipmentDialog.title" v-model="equipmentDialog.visible" width="600px" append-to-body>
      <el-form ref="equipmentFormRef" :model="equipmentForm" :rules="equipmentRules" label-width="100px">
        <el-form-item label="设备名称" prop="name">
          <el-input v-model="equipmentForm.name" placeholder="请输入设备名称" />
        </el-form-item>
        <el-form-item label="规格型号" prop="model">
          <el-input v-model="equipmentForm.model" placeholder="请输入规格型号" />
        </el-form-item>
        <el-form-item label="所属区域" prop="areaName">
          <el-input v-model="equipmentForm.areaName" placeholder="请输入所属区域" />
        </el-form-item>
        <el-form-item label="状态" prop="status">
          <el-radio-group v-model="equipmentForm.status">
            <el-radio :value="1">正常</el-radio>
            <el-radio :value="0">停用</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="equipmentForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="equipmentDialog.visible = false">取 消</el-button>
        <el-button type="primary" @click="submitEquipmentForm" :loading="equipmentDialog.loading">确 定</el-button>
      </template>
    </el-dialog>
    <!-- 作业区域弹窗 -->
    <el-dialog :title="areaDialog.title" v-model="areaDialog.visible" width="600px" append-to-body>
      <el-form ref="areaFormRef" :model="areaForm" :rules="areaRules" label-width="100px">
        <el-form-item label="区域名称" prop="name">
          <el-input v-model="areaForm.name" placeholder="请输入区域名称" />
        </el-form-item>
        <el-form-item label="位置" prop="location">
          <el-input v-model="areaForm.location" placeholder="请输入位置" />
        </el-form-item>
        <el-form-item label="负责人" prop="manager">
          <el-input v-model="areaForm.manager" placeholder="请输入负责人" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="areaForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="areaDialog.visible = false">取 消</el-button>
        <el-button type="primary" @click="submitAreaForm" :loading="areaDialog.loading">确 定</el-button>
      </template>
    </el-dialog>
    <!-- 岗位风险弹窗 -->
    <el-dialog :title="riskDialog.title" v-model="riskDialog.visible" width="600px" append-to-body>
      <el-form ref="riskFormRef" :model="riskForm" :rules="riskRules" label-width="100px">
        <el-form-item label="风险类型" prop="type">
          <el-input v-model="riskForm.type" placeholder="请输入风险类型" />
        </el-form-item>
        <el-form-item label="风险等级" prop="level">
          <el-select v-model="riskForm.level" placeholder="请选择风险等级" style="width: 100%">
            <el-option label="高" value="high" />
            <el-option label="中" value="medium" />
            <el-option label="低" value="low" />
          </el-select>
        </el-form-item>
        <el-form-item label="关联岗位" prop="post">
          <el-input v-model="riskForm.post" placeholder="请输入关联岗位" />
        </el-form-item>
        <el-form-item label="风险描述" prop="description">
          <el-input v-model="riskForm.description" type="textarea" :rows="3" placeholder="请输入风险描述" />
        </el-form-item>
        <el-form-item label="控制措施" prop="controlMeasures">
          <el-input v-model="riskForm.controlMeasures" type="textarea" :rows="3" placeholder="请输入控制措施" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="riskForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="riskDialog.visible = false">取 消</el-button>
        <el-button type="primary" @click="submitRiskForm" :loading="riskDialog.loading">确 定</el-button>
      </template>
    </el-dialog>
    <!-- 应急资源弹窗 -->
    <el-dialog :title="emergencyDialog.title" v-model="emergencyDialog.visible" width="600px" append-to-body>
      <el-form ref="emergencyFormRef" :model="emergencyForm" :rules="emergencyRules" label-width="100px">
        <el-form-item label="资源名称" prop="name">
          <el-input v-model="emergencyForm.name" placeholder="请输入资源名称" />
        </el-form-item>
        <el-form-item label="资源类型" prop="type">
          <el-input v-model="emergencyForm.type" placeholder="请输入资源类型" />
        </el-form-item>
        <el-form-item label="数量" prop="quantity">
          <el-input-number v-model="emergencyForm.quantity" :min="0" style="width: 100%" />
        </el-form-item>
        <el-form-item label="所属区域" prop="areaName">
          <el-input v-model="emergencyForm.areaName" placeholder="请输入所属区域" />
        </el-form-item>
        <el-form-item label="存放位置" prop="location">
          <el-input v-model="emergencyForm.location" placeholder="请输入存放位置" />
        </el-form-item>
        <el-form-item label="管理人" prop="manager">
          <el-input v-model="emergencyForm.manager" placeholder="请输入管理人" />
        </el-form-item>
        <el-form-item label="状态" prop="status">
          <el-radio-group v-model="emergencyForm.status">
            <el-radio :value="1">正常</el-radio>
            <el-radio :value="0">缺失</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="emergencyForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="emergencyDialog.visible = false">取 消</el-button>
        <el-button type="primary" @click="submitEmergencyForm" :loading="emergencyDialog.loading">确 定</el-button>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, reactive } from "vue";
import { ref, reactive, onMounted } from "vue";
import PIMTable from "@/components/PIMTable/PIMTable.vue";
import {
  getPersonnelList,
  addPersonnel as addPersonnelApi,
  updatePersonnel,
  deletePersonnel,
  getPersonnelDetail,
  getEquipmentList,
  addEquipment as addEquipmentApi,
  updateEquipment,
  deleteEquipment,
  getEquipmentDetail,
  getWorkAreaList,
  addWorkArea as addWorkAreaApi,
  updateWorkArea,
  deleteWorkArea,
  getWorkAreaDetail,
  getRiskList,
  addRisk as addRiskApi,
  updateRisk,
  deleteRisk,
  getRiskDetail,
  getEmergencyList,
  addEmergency as addEmergencyApi,
  updateEmergency,
  deleteEmergency,
  getEmergencyDetail
} from "@/api/safetyManagement/basicInfo.js";
import { ElMessage, ElMessageBox } from "element-plus";
defineOptions({
  name: "基础信息管理",
@@ -110,88 +291,762 @@
const activeTab = ref("personnel");
// 人员档案
// ==================== 人员档案 ====================
const personnelFilters = reactive({ name: "", dept: "" });
const personnelList = ref([]);
const personnelPage = reactive({ current: 1, size: 10, total: 0 });
const personnelLoading = ref(false);
const personnelColumns = [
  { label: "姓名", prop: "name", align: "center" },
  { label: "部门", prop: "dept", align: "center" },
  { label: "岗位", prop: "post", align: "center" },
  { label: "联系方式", prop: "phone", align: "center" },
  { label: "入职日期", prop: "entryDate", align: "center" },
  {
    label: "状态",
    prop: "status",
    align: "center",
    dataType: "tag",
    formatType: (val) => (val === 1 ? "success" : "info"),
    formatData: (val) => (val === 1 ? "在职" : "离职")
  },
  {
    label: "操作",
    prop: "action",
    align: "center",
    dataType: "action",
    operation: [
      { name: "编辑", type: "text", clickFun: (row) => handleEditPersonnel(row) },
      { name: "删除", type: "text", clickFun: (row) => handleDeletePersonnel(row) }
    ]
  }
];
// 设备设施
const equipmentFilters = reactive({ name: "", area: "" });
const personnelDialog = reactive({ visible: false, title: "", loading: false });
const personnelFormRef = ref(null);
const personnelForm = reactive({
  id: null,
  name: "",
  dept: "",
  post: "",
  phone: "",
  entryDate: "",
  status: 1,
  remark: ""
});
const personnelRules = {
  name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
  dept: [{ required: true, message: "请输入部门", trigger: "blur" }]
};
// ==================== 设备设施 ====================
const equipmentFilters = reactive({ name: "", areaName: "" });
const equipmentList = ref([]);
const equipmentPage = reactive({ current: 1, size: 10, total: 0 });
const equipmentLoading = ref(false);
const equipmentColumns = [
  { label: "设备名称", prop: "name", align: "center" },
  { label: "规格型号", prop: "model", align: "center" },
  { label: "所属区域", prop: "area", align: "center" },
  { label: "状态", prop: "status", align: "center" },
  { label: "所属区域", prop: "areaName", align: "center" },
  {
    label: "状态",
    prop: "status",
    align: "center",
    dataType: "tag",
    formatType: (val) => (val === 1 ? "success" : "danger"),
    formatData: (val) => (val === 1 ? "正常" : "停用")
  },
  {
    label: "操作",
    prop: "action",
    align: "center",
    dataType: "action",
    operation: [
      { name: "编辑", type: "text", clickFun: (row) => handleEditEquipment(row) },
      { name: "删除", type: "text", clickFun: (row) => handleDeleteEquipment(row) }
    ]
  }
];
// 作业区域
const equipmentDialog = reactive({ visible: false, title: "", loading: false });
const equipmentFormRef = ref(null);
const equipmentForm = reactive({
  id: null,
  name: "",
  model: "",
  areaName: "",
  status: 1,
  remark: ""
});
const equipmentRules = {
  name: [{ required: true, message: "请输入设备名称", trigger: "blur" }]
};
// ==================== 作业区域 ====================
const areaFilters = reactive({ name: "" });
const areaList = ref([]);
const areaPage = reactive({ current: 1, size: 10, total: 0 });
const areaLoading = ref(false);
const areaColumns = [
  { label: "区域名称", prop: "name", align: "center" },
  { label: "位置", prop: "location", align: "center" },
  { label: "负责人", prop: "manager", align: "center" },
  {
    label: "操作",
    prop: "action",
    align: "center",
    dataType: "action",
    operation: [
      { name: "编辑", type: "text", clickFun: (row) => handleEditArea(row) },
      { name: "删除", type: "text", clickFun: (row) => handleDeleteArea(row) }
    ]
  }
];
// 岗位风险
const areaDialog = reactive({ visible: false, title: "", loading: false });
const areaFormRef = ref(null);
const areaForm = reactive({
  id: null,
  name: "",
  location: "",
  manager: "",
  remark: ""
});
const areaRules = {
  name: [{ required: true, message: "请输入区域名称", trigger: "blur" }]
};
// ==================== 岗位风险 ====================
const riskFilters = reactive({ type: "" });
const riskList = ref([]);
const riskPage = reactive({ current: 1, size: 10, total: 0 });
const riskLoading = ref(false);
const riskColumns = [
  { label: "风险类型", prop: "type", align: "center" },
  { label: "风险等级", prop: "level", align: "center" },
  {
    label: "风险等级",
    prop: "level",
    align: "center",
    dataType: "tag",
    formatType: (val) => {
      if (val === 'high') return 'danger';
      if (val === 'medium') return 'warning';
      return 'success';
    },
    formatData: (val) => {
      const map = { high: '高', medium: '中', low: '低' };
      return map[val] || val;
    }
  },
  { label: "描述", prop: "description", align: "center" },
  {
    label: "操作",
    prop: "action",
    align: "center",
    dataType: "action",
    operation: [
      { name: "编辑", type: "text", clickFun: (row) => handleEditRisk(row) },
      { name: "删除", type: "text", clickFun: (row) => handleDeleteRisk(row) }
    ]
  }
];
// 应急资源
const riskDialog = reactive({ visible: false, title: "", loading: false });
const riskFormRef = ref(null);
const riskForm = reactive({
  id: null,
  type: "",
  level: "",
  description: "",
  post: "",
  controlMeasures: "",
  remark: ""
});
const riskRules = {
  type: [{ required: true, message: "请输入风险类型", trigger: "blur" }],
  level: [{ required: true, message: "请选择风险等级", trigger: "change" }]
};
// ==================== 应急资源 ====================
const emergencyFilters = reactive({ name: "" });
const emergencyList = ref([]);
const emergencyPage = reactive({ current: 1, size: 10, total: 0 });
const emergencyLoading = ref(false);
const emergencyColumns = [
  { label: "资源名称", prop: "name", align: "center" },
  { label: "类型", prop: "type", align: "center" },
  { label: "数量", prop: "quantity", align: "center" },
  { label: "存放位置", prop: "location", align: "center" },
  {
    label: "状态",
    prop: "status",
    align: "center",
    dataType: "tag",
    formatType: (val) => (val === 1 ? "success" : "danger"),
    formatData: (val) => (val === 1 ? "正常" : "缺失")
  },
  {
    label: "操作",
    prop: "action",
    align: "center",
    dataType: "action",
    operation: [
      { name: "编辑", type: "text", clickFun: (row) => handleEditEmergency(row) },
      { name: "删除", type: "text", clickFun: (row) => handleDeleteEmergency(row) }
    ]
  }
];
const handleTabChange = () => {
  // 切换tab时加载对应数据
const emergencyDialog = reactive({ visible: false, title: "", loading: false });
const emergencyFormRef = ref(null);
const emergencyForm = reactive({
  id: null,
  name: "",
  type: "",
  quantity: 0,
  areaName: "",
  location: "",
  manager: "",
  status: 1,
  remark: ""
});
const emergencyRules = {
  name: [{ required: true, message: "请输入资源名称", trigger: "blur" }],
  type: [{ required: true, message: "请输入资源类型", trigger: "blur" }]
};
const getPersonnelData = () => {};
const resetPersonnelFilters = () => { personnelFilters.name = ""; personnelFilters.dept = ""; };
const addPersonnel = () => {};
const changePersonnelPage = ({ page, limit }) => { personnelPage.current = page; personnelPage.size = limit; };
// ==================== 通用方法 ====================
const loadData = () => {
  switch (activeTab.value) {
    case 'personnel':
      getPersonnelData();
      break;
    case 'equipment':
      getEquipmentData();
      break;
    case 'workArea':
      getAreaData();
      break;
    case 'risk':
      getRiskData();
      break;
    case 'emergency':
      getEmergencyData();
      break;
  }
};
const getEquipmentData = () => {};
const resetEquipmentFilters = () => { equipmentFilters.name = ""; equipmentFilters.area = ""; };
const addEquipment = () => {};
const changeEquipmentPage = ({ page, limit }) => { equipmentPage.current = page; equipmentPage.size = limit; };
const handleTabChange = () => {
  loadData();
};
const getAreaData = () => {};
const resetAreaFilters = () => { areaFilters.name = ""; };
const addArea = () => {};
const changeAreaPage = ({ page, limit }) => { areaPage.current = page; areaPage.size = limit; };
const getRiskData = () => {};
const resetRiskFilters = () => { riskFilters.type = ""; };
const addRisk = () => {};
const changeRiskPage = ({ page, limit }) => { riskPage.current = page; riskPage.size = limit; };
const getEmergencyData = () => {};
const resetEmergencyFilters = () => { emergencyFilters.name = ""; };
const addEmergency = () => {};
const changeEmergencyPage = ({ page, limit }) => { emergencyPage.current = page; emergencyPage.size = limit; };
// ==================== 人员档案方法 ====================
const getPersonnelData = async () => {
  personnelLoading.value = true;
  try {
    const res = await getPersonnelList({
      pageNum: personnelPage.current,
      pageSize: personnelPage.size,
      ...personnelFilters
    });
    if (res.code === 200) {
      personnelList.value = res.data.rows || res.data.records || [];
      personnelPage.total = res.data.total || 0;
    }
  } catch (error) {
    ElMessage.error('获取人员档案失败');
  } finally {
    personnelLoading.value = false;
  }
};
const resetPersonnelFilters = () => {
  personnelFilters.name = "";
  personnelFilters.dept = "";
  personnelPage.current = 1;
  getPersonnelData();
};
const changePersonnelPage = ({ page, limit }) => {
  personnelPage.current = page;
  personnelPage.size = limit;
  getPersonnelData();
};
const resetPersonnelForm = () => {
  personnelForm.id = null;
  personnelForm.name = "";
  personnelForm.dept = "";
  personnelForm.post = "";
  personnelForm.phone = "";
  personnelForm.entryDate = "";
  personnelForm.status = 1;
  personnelForm.remark = "";
};
const addPersonnel = () => {
  resetPersonnelForm();
  personnelDialog.title = "新增人员档案";
  personnelDialog.visible = true;
};
const handleEditPersonnel = async (row) => {
  resetPersonnelForm();
  try {
    const res = await getPersonnelDetail(row.id);
    if (res.code === 200) {
      Object.assign(personnelForm, res.data);
      personnelDialog.title = "编辑人员档案";
      personnelDialog.visible = true;
    }
  } catch (error) {
    ElMessage.error('获取人员档案详情失败');
  }
};
const handleDeletePersonnel = (row) => {
  ElMessageBox.confirm(`确认删除人员 "${row.name}" 吗?`, "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning"
  }).then(async () => {
    try {
      const res = await deletePersonnel(row.id);
      if (res.code === 200) {
        ElMessage.success("删除成功");
        getPersonnelData();
      }
    } catch (error) {
      ElMessage.error("删除失败");
    }
  });
};
const submitPersonnelForm = async () => {
  const valid = await personnelFormRef.value.validate().catch(() => false);
  if (!valid) return;
  personnelDialog.loading = true;
  try {
    const api = personnelForm.id ? updatePersonnel : addPersonnelApi;
    const res = await api(personnelForm);
    if (res.code === 200) {
      ElMessage.success(personnelForm.id ? "修改成功" : "新增成功");
      personnelDialog.visible = false;
      getPersonnelData();
    }
  } catch (error) {
    ElMessage.error(personnelForm.id ? "修改失败" : "新增失败");
  } finally {
    personnelDialog.loading = false;
  }
};
// ==================== 设备设施方法 ====================
const getEquipmentData = async () => {
  equipmentLoading.value = true;
  try {
    const res = await getEquipmentList({
      pageNum: equipmentPage.current,
      pageSize: equipmentPage.size,
      ...equipmentFilters
    });
    if (res.code === 200) {
      equipmentList.value = res.data.rows || res.data.records || [];
      equipmentPage.total = res.data.total || 0;
    }
  } catch (error) {
    ElMessage.error('获取设备设施失败');
  } finally {
    equipmentLoading.value = false;
  }
};
const resetEquipmentFilters = () => {
  equipmentFilters.name = "";
  equipmentFilters.areaName = "";
  equipmentPage.current = 1;
  getEquipmentData();
};
const changeEquipmentPage = ({ page, limit }) => {
  equipmentPage.current = page;
  equipmentPage.size = limit;
  getEquipmentData();
};
const resetEquipmentForm = () => {
  equipmentForm.id = null;
  equipmentForm.name = "";
  equipmentForm.model = "";
  equipmentForm.areaName = "";
  equipmentForm.status = 1;
  equipmentForm.remark = "";
};
const addEquipment = () => {
  resetEquipmentForm();
  equipmentDialog.title = "新增设备设施";
  equipmentDialog.visible = true;
};
const handleEditEquipment = async (row) => {
  resetEquipmentForm();
  try {
    const res = await getEquipmentDetail(row.id);
    if (res.code === 200) {
      Object.assign(equipmentForm, res.data);
      equipmentDialog.title = "编辑设备设施";
      equipmentDialog.visible = true;
    }
  } catch (error) {
    ElMessage.error('获取设备详情失败');
  }
};
const handleDeleteEquipment = (row) => {
  ElMessageBox.confirm(`确认删除设备 "${row.name}" 吗?`, "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning"
  }).then(async () => {
    try {
      const res = await deleteEquipment(row.id);
      if (res.code === 200) {
        ElMessage.success("删除成功");
        getEquipmentData();
      }
    } catch (error) {
      ElMessage.error("删除失败");
    }
  });
};
const submitEquipmentForm = async () => {
  const valid = await equipmentFormRef.value.validate().catch(() => false);
  if (!valid) return;
  equipmentDialog.loading = true;
  try {
    const api = equipmentForm.id ? updateEquipment : addEquipmentApi;
    const res = await api(equipmentForm);
    if (res.code === 200) {
      ElMessage.success(equipmentForm.id ? "修改成功" : "新增成功");
      equipmentDialog.visible = false;
      getEquipmentData();
    }
  } catch (error) {
    ElMessage.error(equipmentForm.id ? "修改失败" : "新增失败");
  } finally {
    equipmentDialog.loading = false;
  }
};
// ==================== 作业区域方法 ====================
const getAreaData = async () => {
  areaLoading.value = true;
  try {
    const res = await getWorkAreaList({
      pageNum: areaPage.current,
      pageSize: areaPage.size,
      ...areaFilters
    });
    if (res.code === 200) {
      areaList.value = res.data.rows || res.data.records || [];
      areaPage.total = res.data.total || 0;
    }
  } catch (error) {
    ElMessage.error('获取作业区域失败');
  } finally {
    areaLoading.value = false;
  }
};
const resetAreaFilters = () => {
  areaFilters.name = "";
  areaPage.current = 1;
  getAreaData();
};
const changeAreaPage = ({ page, limit }) => {
  areaPage.current = page;
  areaPage.size = limit;
  getAreaData();
};
const resetAreaForm = () => {
  areaForm.id = null;
  areaForm.name = "";
  areaForm.location = "";
  areaForm.manager = "";
  areaForm.remark = "";
};
const addArea = () => {
  resetAreaForm();
  areaDialog.title = "新增作业区域";
  areaDialog.visible = true;
};
const handleEditArea = async (row) => {
  resetAreaForm();
  try {
    const res = await getWorkAreaDetail(row.id);
    if (res.code === 200) {
      Object.assign(areaForm, res.data);
      areaDialog.title = "编辑作业区域";
      areaDialog.visible = true;
    }
  } catch (error) {
    ElMessage.error('获取作业区域详情失败');
  }
};
const handleDeleteArea = (row) => {
  ElMessageBox.confirm(`确认删除区域 "${row.name}" 吗?`, "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning"
  }).then(async () => {
    try {
      const res = await deleteWorkArea(row.id);
      if (res.code === 200) {
        ElMessage.success("删除成功");
        getAreaData();
      }
    } catch (error) {
      ElMessage.error("删除失败");
    }
  });
};
const submitAreaForm = async () => {
  const valid = await areaFormRef.value.validate().catch(() => false);
  if (!valid) return;
  areaDialog.loading = true;
  try {
    const api = areaForm.id ? updateWorkArea : addWorkAreaApi;
    const res = await api(areaForm);
    if (res.code === 200) {
      ElMessage.success(areaForm.id ? "修改成功" : "新增成功");
      areaDialog.visible = false;
      getAreaData();
    }
  } catch (error) {
    ElMessage.error(areaForm.id ? "修改失败" : "新增失败");
  } finally {
    areaDialog.loading = false;
  }
};
// ==================== 岗位风险方法 ====================
const getRiskData = async () => {
  riskLoading.value = true;
  try {
    const res = await getRiskList({
      pageNum: riskPage.current,
      pageSize: riskPage.size,
      ...riskFilters
    });
    if (res.code === 200) {
      riskList.value = res.data.rows || res.data.records || [];
      riskPage.total = res.data.total || 0;
    }
  } catch (error) {
    ElMessage.error('获取岗位风险失败');
  } finally {
    riskLoading.value = false;
  }
};
const resetRiskFilters = () => {
  riskFilters.type = "";
  riskPage.current = 1;
  getRiskData();
};
const changeRiskPage = ({ page, limit }) => {
  riskPage.current = page;
  riskPage.size = limit;
  getRiskData();
};
const resetRiskForm = () => {
  riskForm.id = null;
  riskForm.type = "";
  riskForm.level = "";
  riskForm.description = "";
  riskForm.post = "";
  riskForm.controlMeasures = "";
  riskForm.remark = "";
};
const addRisk = () => {
  resetRiskForm();
  riskDialog.title = "新增岗位风险";
  riskDialog.visible = true;
};
const handleEditRisk = async (row) => {
  resetRiskForm();
  try {
    const res = await getRiskDetail(row.id);
    if (res.code === 200) {
      Object.assign(riskForm, res.data);
      riskDialog.title = "编辑岗位风险";
      riskDialog.visible = true;
    }
  } catch (error) {
    ElMessage.error('获取岗位风险详情失败');
  }
};
const handleDeleteRisk = (row) => {
  ElMessageBox.confirm(`确认删除风险 "${row.type}" 吗?`, "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning"
  }).then(async () => {
    try {
      const res = await deleteRisk(row.id);
      if (res.code === 200) {
        ElMessage.success("删除成功");
        getRiskData();
      }
    } catch (error) {
      ElMessage.error("删除失败");
    }
  });
};
const submitRiskForm = async () => {
  const valid = await riskFormRef.value.validate().catch(() => false);
  if (!valid) return;
  riskDialog.loading = true;
  try {
    const api = riskForm.id ? updateRisk : addRiskApi;
    const res = await api(riskForm);
    if (res.code === 200) {
      ElMessage.success(riskForm.id ? "修改成功" : "新增成功");
      riskDialog.visible = false;
      getRiskData();
    }
  } catch (error) {
    ElMessage.error(riskForm.id ? "修改失败" : "新增失败");
  } finally {
    riskDialog.loading = false;
  }
};
// ==================== 应急资源方法 ====================
const getEmergencyData = async () => {
  emergencyLoading.value = true;
  try {
    const res = await getEmergencyList({
      pageNum: emergencyPage.current,
      pageSize: emergencyPage.size,
      ...emergencyFilters
    });
    if (res.code === 200) {
      emergencyList.value = res.data.rows || res.data.records || [];
      emergencyPage.total = res.data.total || 0;
    }
  } catch (error) {
    ElMessage.error('获取应急资源失败');
  } finally {
    emergencyLoading.value = false;
  }
};
const resetEmergencyFilters = () => {
  emergencyFilters.name = "";
  emergencyPage.current = 1;
  getEmergencyData();
};
const changeEmergencyPage = ({ page, limit }) => {
  emergencyPage.current = page;
  emergencyPage.size = limit;
  getEmergencyData();
};
const resetEmergencyForm = () => {
  emergencyForm.id = null;
  emergencyForm.name = "";
  emergencyForm.type = "";
  emergencyForm.quantity = 0;
  emergencyForm.areaName = "";
  emergencyForm.location = "";
  emergencyForm.manager = "";
  emergencyForm.status = 1;
  emergencyForm.remark = "";
};
const addEmergency = () => {
  resetEmergencyForm();
  emergencyDialog.title = "新增应急资源";
  emergencyDialog.visible = true;
};
const handleEditEmergency = async (row) => {
  resetEmergencyForm();
  try {
    const res = await getEmergencyDetail(row.id);
    if (res.code === 200) {
      Object.assign(emergencyForm, res.data);
      emergencyDialog.title = "编辑应急资源";
      emergencyDialog.visible = true;
    }
  } catch (error) {
    ElMessage.error('获取应急资源详情失败');
  }
};
const handleDeleteEmergency = (row) => {
  ElMessageBox.confirm(`确认删除资源 "${row.name}" 吗?`, "提示", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning"
  }).then(async () => {
    try {
      const res = await deleteEmergency(row.id);
      if (res.code === 200) {
        ElMessage.success("删除成功");
        getEmergencyData();
      }
    } catch (error) {
      ElMessage.error("删除失败");
    }
  });
};
const submitEmergencyForm = async () => {
  const valid = await emergencyFormRef.value.validate().catch(() => false);
  if (!valid) return;
  emergencyDialog.loading = true;
  try {
    const api = emergencyForm.id ? updateEmergency : addEmergencyApi;
    const res = await api(emergencyForm);
    if (res.code === 200) {
      ElMessage.success(emergencyForm.id ? "修改成功" : "新增成功");
      emergencyDialog.visible = false;
      getEmergencyData();
    }
  } catch (error) {
    ElMessage.error(emergencyForm.id ? "修改失败" : "新增失败");
  } finally {
    emergencyDialog.loading = false;
  }
};
onMounted(() => {
  getPersonnelData();
});
</script>
<style lang="scss" scoped>