From cc0e9036de6e922e8fe254fef01d8de9996024b7 Mon Sep 17 00:00:00 2001
From: hyingbo <1363390067@qq.com>
Date: 星期四, 17 七月 2025 18:16:03 +0800
Subject: [PATCH] 获取报警描述修改

---
 lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java |  218 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 214 insertions(+), 4 deletions(-)

diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java
index cfb31e0..2704bd2 100644
--- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java
+++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DevicePermissionServiceImpl.java
@@ -1,23 +1,47 @@
 package org.jeecg.modules.dnc.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.modules.dnc.entity.DevicePermission;
 import org.jeecg.modules.dnc.mapper.DevicePermissionMapper;
+import org.jeecg.modules.dnc.service.IDevicePermissionService;
 import org.jeecg.modules.dnc.ucenter.UserDepartExt;
 import org.jeecg.modules.dnc.utils.ValidateUtil;
+import org.jeecg.modules.mdc.entity.MdcEquipment;
+import org.jeecg.modules.mdc.mapper.MdcEquipmentMapper;
+import org.jeecg.modules.mdc.model.MdcEquipmentTree;
+import org.jeecg.modules.mdc.util.FindsEquipmentProductionUtil;
+import org.jeecg.modules.system.entity.MdcProduction;
 import org.jeecg.modules.system.entity.SysUser;
-import org.jeecg.modules.dnc.service.IDevicePermissionService;
+import org.jeecg.modules.system.service.IMdcProductionService;
+import org.jeecg.modules.system.service.IMdcUserProductionService;
+import org.jeecg.modules.system.service.ISysUserService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 public class DevicePermissionServiceImpl extends ServiceImpl<DevicePermissionMapper, DevicePermission> implements IDevicePermissionService {
+    @Resource
+    private IMdcProductionService mdcProductionService;
+    @Resource
+    private IMdcUserProductionService mdcUserProductionService;
+    @Resource
+    private MdcEquipmentMapper mdcEquipmentMapper;
+    @Resource
+    private ISysUserService sysUserService;
+
     @Override
     public DevicePermission getByUserIdAndDeviceId(String userId, String deviceId) {
         if(!ValidateUtil.validateString(userId) || !ValidateUtil.validateString(deviceId))
@@ -67,4 +91,190 @@
             list = Collections.emptyList();
         return list;
     }
+
+
+    /**
+     * * 鍔犺浇浜х嚎璁惧鏍�
+     */
+    @Override
+    public List<MdcEquipmentTree> DncLoadTreeListByProduction() {
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // 鑾峰彇鎵�鏈夋湁鏁堜骇绾垮苟寤虹珛蹇�熸煡璇㈡槧灏�
+        Map<String, MdcProduction> productionMap = getValidProductions();
+
+        // 鑾峰彇鐢ㄦ埛鏉冮檺鐩稿叧鐨勬墍鏈変骇绾縄D锛堝寘鍚眰绾х鍏堬級
+        Set<String> authorizedProductionIds = getAuthorizedProductionIds(user.getId(), productionMap);
+
+        // 鏋勫缓浜х嚎鏍戠粨鏋�
+        List<MdcEquipmentTree> treeList = buildProductionTree(new ArrayList<>(authorizedProductionIds), productionMap);
+
+        // 鎵归噺濉厖璁惧鏁版嵁
+        fillEquipmentData(treeList, user);
+
+        return treeList;
+    }
+
+    /**
+     * 鑾峰彇鎵�鏈夋湁鏁堜骇绾垮苟寤虹珛ID鏄犲皠
+    */
+    private Map<String, MdcProduction> getValidProductions() {
+        List<MdcProduction> productions = mdcProductionService.list(
+                new LambdaQueryWrapper<MdcProduction>()
+                        .eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0)
+                        .orderByAsc(MdcProduction::getProductionOrder)
+        );
+        return productions.stream().collect(Collectors.toMap(MdcProduction::getId, Function.identity()));
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鏉冮檺鐩稿叧鐨勬墍鏈変骇绾縄D锛堝寘鍚眰绾х鍏堬級
+    */
+    private Set<String> getAuthorizedProductionIds(String userId, Map<String, MdcProduction> productionMap) {
+        Set<String> result = new HashSet<>();
+
+        // 鑾峰彇鐩存帴鍏宠仈鐨勪骇绾縄D
+        List<String> directProductionIds = Optional.ofNullable(mdcUserProductionService.queryProductionIdsByUserId(userId))
+                .orElse(Collections.emptyList());
+
+        // 閫掑綊鏀堕泦鎵�鏈夊眰绾D
+        directProductionIds.forEach(id -> collectHierarchyIds(id, productionMap, result));
+
+        return result;
+    }
+
+    /**
+    * 閫掑綊鏀堕泦灞傜骇ID锛堝寘鍚嚜韬強鎵�鏈夌鍏堬級
+    */
+    private void collectHierarchyIds(String productionId, Map<String, MdcProduction> productionMap, Set<String> collector) {
+        if (collector.contains(productionId)) return;
+
+        MdcProduction current = productionMap.get(productionId);
+        if (current == null) return;
+
+        collector.add(productionId);
+        if (StringUtils.isNotBlank(current.getParentId())) {
+            collectHierarchyIds(current.getParentId(), productionMap, collector);
+        }
+    }
+
+    /**
+     鏋勫缓浜х嚎鏍戠粨鏋�
+    */
+    private List<MdcEquipmentTree> buildProductionTree(List<String> productionIds, Map<String, MdcProduction> productionMap) {
+        List<MdcProduction> filteredProductions = new ArrayList<>();
+        productionIds.forEach(id -> {
+            MdcProduction production = productionMap.get(id);
+            if (production != null) {
+                filteredProductions.add(production);
+            }
+        });
+        // 鎸夊垱寤烘椂闂村崌搴忔帓搴忥紙绌哄�兼帓鍦ㄦ渶鍚庯級
+        filteredProductions.sort(
+                Comparator.comparing(
+                        MdcProduction::getCreateTime,
+                        Comparator.nullsLast(Comparator.naturalOrder()) // 鑷劧椤哄簭鍗冲崌搴�
+                )
+        );
+        return FindsEquipmentProductionUtil.wrapEquipmentProductionTreeList(filteredProductions);
+    }
+    /**
+    * 鎵归噺濉厖璁惧鏁版嵁
+    */
+    private void fillEquipmentData(List<MdcEquipmentTree> treeList, LoginUser user) {
+        // 鑾峰彇鐢ㄦ埛璁惧鏉冮檺
+        Set<String> deviceIds = getAuthorizedDeviceIds(user.getId());
+        if (deviceIds.isEmpty()) return;
+
+        // 鎵归噺鑾峰彇鎵�鏈夌浉鍏宠澶�
+        Map<String, List<MdcEquipment>> equipmentMap = getEquipmentMap(user, deviceIds);
+
+        // 鎵归噺鑾峰彇鐢ㄦ埛淇℃伅
+        Map<String, String> userRealNameMap = getUserRealNameMapping(equipmentMap.values());
+
+        // 濉厖璁惧鏁版嵁鍒版爲鑺傜偣
+        populateEquipmentNodes(treeList, equipmentMap, userRealNameMap);
+    }
+
+    /**
+     * 鑾峰彇鎺堟潈璁惧ID闆嗗悎
+    */
+    private Set<String> getAuthorizedDeviceIds(String userId) {
+        return super.list(new QueryWrapper<DevicePermission>().select("device_id").eq("user_id", userId))
+                .stream()
+                .map(DevicePermission::getDeviceId)
+                .collect(Collectors.toSet());
+    }
+
+    /**
+     * 鎵归噺鑾峰彇璁惧鏁版嵁骞舵寜浜х嚎鍒嗙粍
+    */
+    private Map<String, List<MdcEquipment>> getEquipmentMap(LoginUser user, Set<String> deviceIds) {
+        List<String> productionIds=Arrays.asList(user.getProductionIds().split(","));
+        return mdcEquipmentMapper.queryByDepartIdsAndType(productionIds, new ArrayList<>(deviceIds))
+                .stream()
+                .collect(Collectors.groupingBy(MdcEquipment::getProductionId));
+    }
+
+
+    /*** 鎵归噺鑾峰彇鐢ㄦ埛鐪熷疄濮撳悕鏄犲皠
+    */
+    private Map<String, String> getUserRealNameMapping(Collection<List<MdcEquipment>> equipmentLists) {
+        Set<String> userNames = equipmentLists.stream()
+                .flatMap(List::stream)
+                .flatMap(e -> Stream.of(e.getCreateBy(), e.getUpdateBy()))
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toSet());
+
+        return sysUserService.getUserRealNamesByUserNames(new ArrayList<>(userNames));
+    }
+
+    /**
+     * 濉厖璁惧鑺傜偣鏁版嵁
+    */
+    private void populateEquipmentNodes(List<MdcEquipmentTree> nodes,
+                                        Map<String, List<MdcEquipment>> equipmentMap,
+                                        Map<String, String> userRealNameMap) {
+        for (MdcEquipmentTree node : nodes) {
+            if (!isProductionNode(node)) continue;
+
+            List<MdcEquipment> equipments = equipmentMap.getOrDefault(node.getKey(), Collections.emptyList());
+            List<MdcEquipmentTree> equipmentNodes = convertToEquipmentNodes(equipments, userRealNameMap, node.getKey());
+
+            node.getChildren().addAll(equipmentNodes);
+            node.setLeaf(equipmentNodes.isEmpty());
+
+            // 閫掑綊澶勭悊瀛愯妭鐐�
+            populateEquipmentNodes(node.getChildren(), equipmentMap, userRealNameMap);
+        }
+    }
+
+/**
+        * 杞崲璁惧鏁版嵁涓烘爲鑺傜偣
+ */
+    private List<MdcEquipmentTree> convertToEquipmentNodes(List<MdcEquipment> equipments,
+                                                           Map<String, String> userRealNameMap,
+                                                           String parentId) {
+        return equipments.stream().map(e -> {
+            // 鏇存柊鐢ㄦ埛鏄剧ず鍚嶇О
+            Optional.ofNullable(e.getCreateBy()).ifPresent(name ->
+                    e.setCreateBy(userRealNameMap.getOrDefault(name, name)));
+            Optional.ofNullable(e.getUpdateBy()).ifPresent(name ->
+                    e.setUpdateBy(userRealNameMap.getOrDefault(name, name)));
+
+            MdcEquipmentTree node = new MdcEquipmentTree().convert(e);
+            node.setParentId(parentId);
+            node.setEntity(e);
+            node.setType(2); // 璁惧鑺傜偣绫诲瀷
+            return node;
+        }).collect(Collectors.toList());
+    }
+
+/**
+        * 鍒ゆ柇鏄惁涓轰骇绾胯妭鐐癸紙鏍规嵁涓氬姟閫昏緫瀹氫箟锛�
+            */
+    private boolean isProductionNode(MdcEquipmentTree node) {
+        return node.getType() == 1; // 鍋囪绫诲瀷1琛ㄧず浜х嚎鑺傜偣
+    }
+
 }

--
Gitblit v1.9.3