Quellcode durchsuchen

fix(score/event): 优化配分事项弹窗交互与数据加载逻辑

1. 为弹窗添加加载状态提示,提升用户体验
2. 缓存全量人员数据避免重复请求
3. 重构级联选择逻辑,优化部门/队室/小组/人员联动
4. 修复弹窗打开时机与表单重置顺序问题
5. 新增通道/小组变化时的人员列表重置逻辑
huoyi@samsundot.com vor 1 Woche
Ursprung
Commit
ad73470135
1 geänderte Dateien mit 59 neuen und 18 gelöschten Zeilen
  1. 59 18
      src/views/score/event/index.vue

+ 59 - 18
src/views/score/event/index.vue

@@ -157,8 +157,8 @@
157 157
       v-model:limit="queryParams.pageSize" @pagination="getList" />
158 158
 
159 159
     <!-- 新增/修改对话框 -->
160
-    <el-dialog :title="dialogTitle" v-model="dialogVisible" width="680px" append-to-body>
161
-      <el-form ref="formRef" :model="form" label-width="100px">
160
+    <el-dialog :title="dialogTitle" v-model="dialogVisible" width="680px" append-to-body  element-loading-text="加载中...">
161
+      <el-form ref="formRef" :model="form" label-width="100px" v-loading="dialogLoading">
162 162
         <el-row :gutter="16">
163 163
           <el-col :span="12">
164 164
             <el-form-item label="配分层级" prop="org" :rules="rules.org">
@@ -311,7 +311,7 @@ const { score_level, score_type } = proxy.useDict('score_level', 'score_type')
311 311
 
312 312
 const loading = ref(false), list = ref([]), total = ref(0), showSearch = ref(true)
313 313
 const dateRange = ref([]), queryRef = ref(null), formRef = ref(null)
314
-const dialogVisible = ref(false), dialogTitle = ref('')
314
+const dialogVisible = ref(false), dialogTitle = ref(''), dialogLoading = ref(false)
315 315
 const single = ref(true), multiple = ref(true), ids = ref([])
316 316
 const dimensionOptions = ref([])
317 317
 const indicatorTree = ref([])  // 当前维度的指标树(扁平+嵌套)
@@ -322,6 +322,7 @@ const deptOptions = ref([])
322 322
 const teamOptions = ref([])
323 323
 const groupOptions = ref([])
324 324
 const personOptions = ref([])
325
+const allPersonOptions = ref([]) // 缓存全部人员,避免重复请求
325 326
 const queryDeptOptions = ref([])
326 327
 const queryTeamOptions = ref([])
327 328
 const queryGroupOptions = ref([])
@@ -369,6 +370,7 @@ async function handleLevelChange() {
369 370
 }
370 371
 
371 372
 async function handleFormLevelChange() {
373
+
372 374
   form.dimensionId = null
373 375
   form.level2Id = null; form.level2Name = ''; form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''
374 376
   form.deptId = null; form.teamId = null; form.groupId = null; form.personId = null
@@ -388,6 +390,7 @@ async function handleFormLevelChange() {
388 390
   // } else if (org === '4') {
389 391
   await loadAllPersons()
390 392
   // }
393
+ 
391 394
 }
392 395
 
393 396
 async function loadAllTeams() {
@@ -407,8 +410,9 @@ async function loadAllGroups() {
407 410
 
408 411
 async function loadAllPersons() {
409 412
   const r = await listUser({ pageSize: 9999 })
410
-
411
-  personOptions.value = r.rows || []
413
+  const rows = r.rows || []
414
+  allPersonOptions.value = rows
415
+  personOptions.value = rows
412 416
 }
413 417
 
414 418
 async function loadRegions() {
@@ -434,40 +438,65 @@ async function handleFormRegionalChange(val) {
434 438
   }
435 439
 }
436 440
 
437
-function handleBrigadeChange() {
441
+async function handleBrigadeChange(val) {
442
+  
443
+  form.teamId = null; form.groupId = null; form.personId = null
444
+  teamOptions.value = []; groupOptions.value = []; personOptions.value = []
445
+  if (val) {
446
+    const r = await deptTreeSelect({ parentId: val })
447
+    teamOptions.value = r.data || []
448
+  }
449
+ 
438 450
 }
439 451
 
440 452
 async function handleDepartmentChange(val) {
441
-  form.deptId = null
453
+
454
+  form.groupId = null; form.personId = null
455
+  groupOptions.value = []; personOptions.value = []
442 456
   if (val) {
443
-    const r = await getDeptOrgInfo({ deptId: val })
444
-    if (r.data) {
445
-      form.deptId = r.data.brigadeId
446
-    }
457
+    const r = await deptTreeSelect({ parentId: val })
458
+    groupOptions.value = r.data || []
447 459
   }
460
+  
448 461
 }
449 462
 
450 463
 async function handleGroupChange(val) {
451
-  form.deptId = null; form.teamId = null
464
+
465
+  form.personId = null
466
+  personOptions.value = []
452 467
   if (val) {
453
-    const r = await getDeptOrgInfo({ deptId: val })
454
-    if (r.data) {
455
-      form.deptId = r.data.brigadeId
456
-      form.teamId = r.data.departmentId
457
-    }
468
+    const r = await listUser({ deptId: val, pageSize: 9999 })
469
+    personOptions.value = r.rows || []
470
+  } else {
471
+    personOptions.value = [...allPersonOptions.value]
458 472
   }
473
+ 
459 474
 }
460 475
 
461 476
 async function handlePersonChange(val) {
477
+  dialogLoading.value = true
462 478
   form.deptId = null; form.teamId = null; form.groupId = null
479
+  teamOptions.value = []; groupOptions.value = []; 
463 480
   if (val) {
464 481
     const r = await getUserOrgInfo({ userId: val })
465 482
     if (r.data) {
466 483
       form.deptId = r.data.deptInfo.brigadeId
467 484
       form.teamId = r.data.deptInfo.departmentId
468 485
       form.groupId = r.data.deptInfo.teamId
486
+
487
+      // 根据部门加载队室/班组选项
488
+      if (form.deptId) {
489
+        const r1 = await deptTreeSelect({ parentId: form.deptId })
490
+        teamOptions.value = r1.data || []
491
+      }
492
+      // 根据队室/班组加载通道/小组选项
493
+      if (form.teamId) {
494
+        const r2 = await deptTreeSelect({ parentId: form.teamId })
495
+        groupOptions.value = r2.data || []
496
+      }
469 497
     }
470 498
   }
499
+  dialogLoading.value = false
471 500
 }
472 501
 
473 502
 async function loadQueryDepts() {
@@ -550,6 +579,8 @@ function resetForm() {
550 579
 
551 580
 function handleAdd() { resetForm(); dialogTitle.value = '新增配分事项'; dialogVisible.value = true }
552 581
 async function handleUpdate(row) {
582
+ 
583
+  dialogVisible.value = true
553 584
   resetForm()
554 585
   const record = row?.id ? row : list.value.find(r => r.id === ids.value[0])
555 586
   if (record) {
@@ -605,10 +636,12 @@ async function handleUpdate(row) {
605 636
     if (record.level3Id) onLevel3Change(record.level3Id, true)
606 637
     if (record.level4Id) onLevel4Change(record.level4Id, true)
607 638
   }
608
-  dialogTitle.value = '修改配分事项'; dialogVisible.value = true
639
+ 
640
+  dialogTitle.value = '修改配分事项'
609 641
 }
610 642
 
611 643
 async function onDimensionChange(dimId, preserveSelection) {
644
+  dialogLoading.value = true
612 645
   const dim = dimensionOptions.value.find(d => d.id === dimId)
613 646
   if (dim) form.dimensionName = dim.name
614 647
   const r = await treeIndicator({ dimensionId: dimId, org: form.org })
@@ -617,6 +650,7 @@ async function onDimensionChange(dimId, preserveSelection) {
617 650
   if (!preserveSelection) { form.level2Id = null; form.level2Name = ''; form.level3Id = null; form.level3Name = ''; form.level4Id = null; form.level4Name = ''; form.scoreValue = 0 }
618 651
   level3Options.value = []; level4Options.value = []
619 652
   if (preserveSelection && form.level2Id) onLevel2Change(form.level2Id, true)
653
+  dialogLoading.value = false
620 654
 }
621 655
 
622 656
 function onLevel2Change(val, preserveSelection) {
@@ -760,6 +794,13 @@ const processPostTree = (nodes, isFirstLevel = true) => {
760 794
   })
761 795
 }
762 796
 
797
+// 监听通道/小组变化:无值时责任人显示全部人员
798
+watch(() => form.groupId, (newVal) => {
799
+  if (!newVal) {
800
+    personOptions.value = [...allPersonOptions.value]
801
+  }
802
+})
803
+
763 804
 onMounted(() => {
764 805
   loadDimensions();
765 806
   loadDepts();