Parcourir la source

pms 设备责任人功能优化 选中设备默认筛选设备所属部门下的人员

zhangcl il y a 3 semaines
Parent
commit
744213eee3

+ 80 - 7
src/views/pms/device/personlog/ConfigDevicePerson.vue

@@ -53,14 +53,16 @@
           <div class="dept-select">
             <el-tree-select
               clearable
-              v-model="formData.deptId"
+              v-model="formData.deptIds"
               :data="deptList"
               :props="defaultProps"
+              multiple
+              show-checkbox
               check-strictly
               node-key="id"
               filterable
               :placeholder="t('configPerson.rpHolder')"
-              @node-click="handleDeptUserTreeNodeClick"
+              @node-click="handleDeptCheckChange"
               @clear="handleClearDeptForPerson"
             />
           </div>
@@ -175,6 +177,7 @@ const formData = ref({
   assetProperty: undefined,
   reason: '',
   picUrl: undefined,
+  deptIds: [] as number[], // 改为部门ID数组
 })
 
 const queryParams = reactive({
@@ -197,7 +200,7 @@ const tempRelations = ref<Array<{
   reason: string
 }>>([])
 
-watch(selectedDevices, (newVal, oldVal) => {
+watch(selectedDevices, async (newVal, oldVal) => {
   // 找出新增的设备
   const addedDevices = newVal.filter(id => !oldVal.includes(id));
   // 找出取消选择的设备
@@ -224,7 +227,60 @@ watch(selectedDevices, (newVal, oldVal) => {
     selectedUsers.value = []
     formData.value.reason = ''
   }
-})
+
+  // 获取设备部门ID集合
+  const deptIdSet = new Set<number>()
+  newVal.forEach(deviceId => {
+    const device = simpleDevices.value.find(d => d.id === deviceId)
+    if (device?.deptId) deptIdSet.add(device.deptId)
+  })
+  formData.value.deptIds = Array.from(deptIdSet)
+  // 部门更新后自动加载人员
+  await getUserList()
+}, { deep: true })
+
+// 监听部门ID变化 部门变化后重新筛选用户
+watch(
+  () => formData.value.deptIds,
+  async (newVal, oldVal) => {
+    // 找出被删除的部门
+    const deletedDeptIds = oldVal?.filter(id => !newVal?.includes(id)) || []
+
+    if (deletedDeptIds.length > 0) {
+      // 找出被删除部门下的用户ID
+      const usersToRemove = simpleUsers.value
+        .filter(user => deletedDeptIds.includes(user.deptId))
+        .map(user => user.id)
+
+      // 同步更新已选用户
+      selectedUsers.value = selectedUsers.value.filter(
+        id => !usersToRemove.includes(id)
+      )
+
+      // 更新关联记录
+      tempRelations.value = tempRelations.value.map(relation => {
+        const validUserIds = relation.userIds.filter(
+          id => !usersToRemove.includes(id)
+        )
+
+        // 获取有效用户名称
+        const validUsers = simpleUsers.value.filter(
+          u => validUserIds.includes(u.id)
+        )
+
+        return {
+          ...relation,
+          userIds: validUserIds,
+          userNames: validUsers.map(u => u.nickname).join(', ')
+        }
+      })
+    }
+
+    // 重新加载人员列表
+    await getUserList()
+  },
+  { deep: true } // 深度监听数组变化
+)
 
 const handleUserSelectionChange = (userIds: number[]) => {
   // 处理清空责任人的情况
@@ -298,8 +354,19 @@ const getUserList = async () => {
     // 开始加载时禁用搜索框
     personLoaded.value = false
 
+    // 保留当前选中但不在被删除部门的用户
+    const currentDeptIds = formData.value.deptIds || []
+    const validUserIds = simpleUsers.value
+      .filter(user => currentDeptIds.includes(user.deptId))
+      .map(user => user.id)
+
+    selectedUsers.value = selectedUsers.value.filter(
+      id => validUserIds.includes(id)
+    )
+
     const params = {
-      deptId: formData.value.deptId,
+      deptIds: formData.value.deptIds,
+      // deptId: formData.value.deptId,
       pageNo: 1,
       pageSize: 10 }
     const data = await UserApi.simpleUserList(params)
@@ -385,6 +452,7 @@ const handleClearDeptForDevice = () => {
 
 // 处理 人员关联 部门选择清空事件
 const handleClearDeptForPerson = () => {
+  formData.value.deptIds = []
   simpleUsers.value = []
   selectedUsers.value = []
   personLoaded.value = false  // 清空时禁用搜索框
@@ -397,6 +465,11 @@ const handleClearDeptForPerson = () => {
   })
 }
 
+// 新增部门选择监听
+const handleDeptCheckChange = () => {
+  // getUserList() // 选择变化时重新加载人员
+}
+
 // 过滤后的人员列表计算属性
 const filteredUsers = computed(() => {
   const searchText = userFilterText.value.toLowerCase().trim()
@@ -476,9 +549,9 @@ onMounted(async () => {
       await handleDeptDeviceTreeNodeClick(firstRootNode)
 
       // 设置责任人部门的默认值
-      formData.value.deptId = firstRootNode.id
+      formData.value.deptIds = [firstRootNode.id]
       // 触发责任人部门的节点点击事件,加载人员列表
-      await handleDeptUserTreeNodeClick(firstRootNode)
+      await getUserList() //handleDeptUserTreeNodeClick(firstRootNode)
     } else {
       console.warn("部门树数据为空,无法设置默认值")
     }

+ 2 - 2
src/views/pms/maintenance/IotMaintenancePlanEdit.vue

@@ -963,7 +963,7 @@ const calculateRemainKm = (row: IotMaintenanceBomVO) => {
     row.nextRunningKilometers > 0;
 
   return isValid
-    ? (row.nextRunningKilometers - (mileageValue - row.lastRunningKilometers))
+    ? parseFloat((row.nextRunningKilometers - (mileageValue - row.lastRunningKilometers)).toFixed(2))
     : null; // 不满足条件返回null
 };
 
@@ -990,7 +990,7 @@ const calculateRemainH = (row: IotMaintenanceBomVO) => {
     row.nextRunningTime > 0;
 
   return isValid
-    ? (row.nextRunningTime - (runTimeValue - row.lastRunningTime))
+    ? parseFloat((row.nextRunningTime - (runTimeValue - row.lastRunningTime)).toFixed(2))
     : null; // 不满足条件返回null
 };