organization-edit.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <el-form label-width="100px" :model="data" :rules="rules" ref="baseFormRef">
  3. <el-form-item label="单位名称" prop="orgName" required>
  4. <el-input v-model.trim="data.orgName" style="width: 300px" :maxlength="50" placeholder="请输入" />
  5. </el-form-item>
  6. <el-form-item label="类型" prop="type" required>
  7. <!-- <el-input v-model="data.type" style="width: 300px" :maxlength="500" placeholder="请输入" /> -->
  8. <el-select style="width: 300px" v-model="data.type">
  9. <el-option :value="Number(key)" :label="type" v-for="(type, key) in OrganizationTypeDesc" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="行政区划" prop="type">
  13. <el-cascader style="width: 300px" v-model="selectedValue" :props="lazyProps" :placeholder="'请选择地区'" clearable
  14. @change="handleChange" lazy />
  15. </el-form-item>
  16. </el-form>
  17. </template>
  18. <script setup lang="ts">
  19. import { QuiskExpose } from "@/helper/mount";
  20. import type { FormInstance, FormRules } from "element-plus";
  21. import type { OrganizationType } from "@/request/organization";
  22. import { OrganizationTypeDesc } from '@/store/organization';
  23. import { getProvinces, getCities, getAreas } from '@/request/organization';
  24. import { ref, reactive, unref, watchEffect, onMounted } from "vue";
  25. import { user } from '@/store/user'
  26. import { globalPasswordRex } from "@/util/regex";
  27. import type { CascaderProps } from 'element-plus'
  28. // import areaData from '@/util/area.json';
  29. const selectedValue = ref([])
  30. const baseFormRef = ref<FormInstance>();
  31. const rules = reactive<FormRules>({
  32. orgName: [
  33. { required: true, message: "请输入单位名称", trigger: "blur" },
  34. ],
  35. type: [
  36. { required: true, message: "请选择类型", trigger: "change" },
  37. ],
  38. contact: [
  39. { required: true, message: "请输入联系人", trigger: "blur" },
  40. ],
  41. userName: [
  42. { required: true, pattern: /^1[3456789]\d{9}$/, message: "请输入正确手机号", trigger: "blur" },
  43. ],
  44. password: [
  45. { required: true, pattern: globalPasswordRex, message: "请输入8-16位数字、字母大小写组合", trigger: "blur" },
  46. { required: true, min: 8, message: '密码太短!', trigger: "blur" },
  47. ],
  48. },)
  49. const props = defineProps<{
  50. org: OrganizationType,
  51. submit: (data: OrganizationType) => Promise<any>;
  52. }>();
  53. const data = ref<OrganizationType & {}>({
  54. ancestors: "",
  55. contact: "",
  56. orderNum: 0,
  57. orgId: 0,
  58. orgName: "",
  59. parentId: 0,
  60. password: "",
  61. type: null,
  62. userName: ""
  63. });
  64. const setParentId = () => {
  65. if (user.value) {
  66. const isSuper = user.value.roles.filter(item => item.roleKey === "super_admin").length > 0;
  67. data.value.parentId = isSuper ? 0 : Number(user.value.orgId)
  68. }
  69. }
  70. watchEffect(() => {
  71. if (props.org) {
  72. data.value = { ...props.org }
  73. }
  74. })
  75. // 动态加载配置
  76. const lazyProps = ref<CascaderProps>({
  77. lazy: true,
  78. // 启用懒加载模式
  79. async lazyLoad(node, resolve) {
  80. // debugger
  81. const { level, value } = node; // level: 当前层级(0=省,1=市,2=区)
  82. console.log('node', node.data)
  83. const dataRes = await loadData(level, node.data);
  84. resolve(dataRes); // 将子节点数据返回给组件
  85. },
  86. checkStrictly: true, // 允许选择任意一级(可选)
  87. label: 'name', // 显示字段名
  88. value: 'id', // 值字段名
  89. leaf: 'leaf', // 标识是否为叶子节点(不可再展开)
  90. });
  91. const loadData = async (level, node) => {
  92. // 根据层级模拟数据
  93. console.log('level', level, node)
  94. switch (level) {
  95. case 0: // 加载省份
  96. const provinces = await getProvinces();
  97. const resP = Array.from(provinces as any).map(p => {
  98. p.leaf = false
  99. return p
  100. });
  101. return resP;
  102. case 1:
  103. let cities
  104. if (node.zx) {
  105. const areas = await getAreas(node.province, node.city);
  106. console.log('areas', areas)
  107. } else {
  108. cities = await getCities(node.province);
  109. console.log('cities', node.province, cities);
  110. }
  111. return cities
  112. // break;
  113. case 2: // 加载区县
  114. const areas = await getAreas(node.province, node.city)
  115. console.log('areas', areas)
  116. return areas.map(a => {
  117. a.leaf = true
  118. return a
  119. })
  120. default:
  121. return [];
  122. }
  123. };
  124. // 处理选择事件
  125. const handleChange = (value: string) => {
  126. console.log('选中的省市区编码:', value);
  127. };
  128. defineExpose<QuiskExpose>({
  129. async submit() {
  130. if (unref(baseFormRef)) {
  131. setParentId();
  132. const res = await unref(baseFormRef)?.validate();
  133. if (res) {
  134. await props.submit(data.value as any as OrganizationType);
  135. }
  136. } else {
  137. throw "";
  138. }
  139. },
  140. });
  141. </script>