safetyOrganizationSystemManagementDetail.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <template>
  2. <main class="safety-platform-container__main">
  3. <el-form
  4. ref="formRef"
  5. :model="form"
  6. :rules="rules"
  7. label-width="100px"
  8. style="max-width: 600px"
  9. label-position="left"
  10. >
  11. <el-form-item label="员工工号:" prop="employeeId" required>
  12. <el-input v-model="form.employeeId" placeholder="请输入员工工号" :disabled="isViewMode" />
  13. </el-form-item>
  14. <el-form-item label="员工姓名:" prop="employeeName" required>
  15. <el-input v-model="form.employeeName" placeholder="请输入员工姓名" :disabled="isViewMode" />
  16. </el-form-item>
  17. <el-form-item label="组织名称:" prop="orgId" required>
  18. <el-tree-select
  19. placeholder="请选择组织名称"
  20. v-model="form.orgId"
  21. :data="organizations"
  22. check-strictly
  23. :render-after-expand="false"
  24. @change="handleOrgChange"
  25. :disabled="isViewMode"
  26. >
  27. </el-tree-select>
  28. </el-form-item>
  29. <el-form-item label="岗位职责:" prop="jobResp" required>
  30. <el-input
  31. v-model="form.jobResp"
  32. type="textarea"
  33. :rows="4"
  34. :maxlength="200"
  35. placeholder="请填写岗位职责"
  36. :disabled="isViewMode"
  37. />
  38. </el-form-item>
  39. <!-- 状态 -->
  40. <el-form-item label="状态:" prop="status" required>
  41. <el-radio-group v-model="form.status" :disabled="isViewMode">
  42. <el-radio :value="1">启用</el-radio>
  43. <el-radio :value="2">禁用</el-radio>
  44. </el-radio-group>
  45. </el-form-item>
  46. </el-form>
  47. </main>
  48. <footer class="safety-platform-container__footer">
  49. <el-button @click="router.back()">返回</el-button>
  50. <el-button v-if="!isViewMode" type="primary" @click="handleSubmit">
  51. {{ isCreateMode ? '提交' : '保存' }}
  52. </el-button>
  53. </footer>
  54. </template>
  55. <script setup lang="ts">
  56. import { computed, onMounted, ref } from 'vue';
  57. import { useRoute, useRouter } from 'vue-router';
  58. import { ElMessage } from 'element-plus';
  59. import { FORM_RULES } from '../configs/form';
  60. import {
  61. getSafetySystemList,
  62. addEmployee,
  63. updateEmployee,
  64. employeeDetail,
  65. } from '@/api/safety-organization-management';
  66. const router = useRouter();
  67. const route = useRoute();
  68. const operate = computed(() => (route.query.operate as string) || 'employee-create');
  69. const currentId = computed(() => Number(route.query.id));
  70. const isCreateMode = computed(() => operate.value === 'employee-create');
  71. const isEditMode = computed(() => operate.value === 'employee-edit');
  72. const isViewMode = computed(() => operate.value === 'employee-view');
  73. interface FormDataType {
  74. id?: number;
  75. orgId?: string;
  76. employeeId: string;
  77. employeeName: string;
  78. jobResp: string;
  79. status: string|number;
  80. selectedOrg?: any;
  81. }
  82. const form = ref<FormDataType>({
  83. id: undefined,
  84. orgId: '',
  85. employeeId: '',
  86. employeeName: '',
  87. jobResp: '',
  88. status: 1,
  89. });
  90. const selectedOrg = ref({});
  91. // 表单验证规则
  92. const rules = ref(FORM_RULES);
  93. // 组织名称选项
  94. const organizations = ref([]);
  95. // 获取组织列表
  96. const fetchSafetyOrganizationTeamList = async () => {
  97. try {
  98. const res = await getSafetySystemList();
  99. organizations.value = formatTreeData(res);
  100. } catch (error) {
  101. ElMessage.error('获取组织列表失败');
  102. }
  103. };
  104. // 组织名称剔除空的children
  105. const formatTreeData = (data) => {
  106. return data
  107. .map((node) => {
  108. const children = node.children?.length ? formatTreeData(node.children) : undefined;
  109. return {
  110. value: node.orgId,
  111. label: node.orgName,
  112. orgId: node.orgId,
  113. orgName: node.orgName,
  114. children,
  115. };
  116. })
  117. .filter((node) => node); // 过滤掉无效节点
  118. };
  119. // 在树数据中根据 value 查找节点
  120. const findNodeByValue = (tree, value) => {
  121. if (!tree || !Array.isArray(tree)) {
  122. return null;
  123. }
  124. for (const node of tree) {
  125. // 如果当前节点的value匹配,返回该节点
  126. if (node.value === value || node.orgId === value) {
  127. return node;
  128. }
  129. // 如果有子节点,递归查找
  130. if (node.children && node.children.length > 0) {
  131. const found = findNodeByValue(node.children, value);
  132. if (found) {
  133. return found;
  134. }
  135. }
  136. }
  137. return null;
  138. };
  139. // 选中组织变化时的回调
  140. const handleOrgChange = (value) => {
  141. // 通过 value 在 organizations 树中查找对应的节点
  142. const selectedNode = findNodeByValue(organizations.value, value);
  143. if (selectedNode) {
  144. // 存储当前选中的组织信息
  145. form.value.orgId = selectedNode.orgId;
  146. selectedOrg.value = selectedNode;
  147. }
  148. };
  149. const formRef = ref();
  150. const handleValidate = async () => {
  151. if (!formRef.value) return;
  152. const res = await formRef.value.validateField();
  153. return res;
  154. };
  155. const getDetail = async () => {
  156. if (!currentId.value) return;
  157. try {
  158. const res = await employeeDetail(currentId.value);
  159. if (res) {
  160. // 详情页面(映射接口字段到表单字段)
  161. Object.assign(form.value, res);
  162. }
  163. } catch (e) {
  164. console.error('获取详情失败:', e);
  165. ElMessage.error('获取详情失败');
  166. }
  167. };
  168. const handleSubmit = async () => {
  169. const res = await handleValidate();
  170. if (!res) return;
  171. try {
  172. console.log(res, form.value);
  173. if (isCreateMode.value) {
  174. await addEmployee(form.value);
  175. ElMessage.success('创建成功');
  176. } else if (isEditMode.value && currentId.value) {
  177. await updateEmployee({
  178. id: currentId.value,
  179. ...form.value,
  180. });
  181. ElMessage.success('保存成功');
  182. }
  183. router.back();
  184. } catch (e) {
  185. console.error('保存失败:', e);
  186. ElMessage.error('保存失败,请重试');
  187. }
  188. };
  189. onMounted(() => {
  190. fetchSafetyOrganizationTeamList();
  191. if (isEditMode.value || isViewMode.value) {
  192. getDetail();
  193. }
  194. });
  195. </script>
  196. <style scoped lang="scss">
  197. @use '@/styles/page-details-layout.scss' as *;
  198. .el-form-item {
  199. margin-bottom: 30px;
  200. }
  201. </style>