hyingbo
2025-05-27 3a740faa161ec976986c0735ba18837f570a525f
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentServiceImpl.java
@@ -8,8 +8,8 @@
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.enums.MessageSplitTypeEnum;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.mdc.dto.MdcEquDepDto;
import org.jeecg.modules.mdc.dto.MdcEquProDto;
@@ -22,17 +22,17 @@
import org.jeecg.modules.mdc.util.DateUtils;
import org.jeecg.modules.mdc.util.FindsEquipmentDepartUtil;
import org.jeecg.modules.mdc.util.FindsEquipmentProductionUtil;
import org.jeecg.modules.mdc.vo.MdcEquipmentDepVo;
import org.jeecg.modules.mdc.vo.MdcEquipmentProVo;
import org.jeecg.modules.mdc.vo.MdcEquipmentVo;
import org.jeecg.modules.mdc.vo.WorkshopEquipmentVo;
import org.jeecg.modules.mdc.vo.*;
import org.jeecg.modules.system.entity.MdcEquipmentDepart;
import org.jeecg.modules.system.entity.MdcProduction;
import org.jeecg.modules.system.entity.MdcProductionEquipment;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.mapper.MdcEquipmentDepartMapper;
import org.jeecg.modules.system.mapper.MdcProductionEquipmentMapper;
import org.jeecg.modules.system.service.*;
import org.jeecg.modules.system.service.IMdcProductionService;
import org.jeecg.modules.system.service.IMdcUserProductionService;
import org.jeecg.modules.system.service.ISysDepartService;
import org.jeecg.modules.system.service.ISysUserDepartService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -82,10 +82,16 @@
    private IEquipmentBaseInfoService equipmentBaseInfoService;
    @Resource
    private ISysDictService sysDictService;
    private ISysBaseAPI sysBaseApi;
    @Resource
    private ISysBaseAPI sysBaseApi;
    private IMdcAlarmInfoService mdcAlarmInfoService;
    @Resource
    private IMdcEquipmentThresholdService mdcEquipmentThresholdService;
    @Resource
    private IMdcOverrunAlarmService mdcOverrunAlarmService;
    @Override
@@ -222,7 +228,7 @@
    }
    @Override
    public List<MdcEquipmentTree> loadTreeListByDepart(String userId) {
    public List<MdcEquipmentTree> loadTreeListByDepart(String userId, String key) {
        //获取所有部门数据
        List<SysDepart> departList = sysDepartService.list(new LambdaQueryWrapper<SysDepart>().eq(SysDepart::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(SysDepart::getDepartOrder));
        //根据用户ID获取拥有的部门id集合
@@ -239,7 +245,7 @@
        //组装部门设备树
        List<MdcEquipmentTree> treeList = FindsEquipmentDepartUtil.wrapEquipmentDepartTreeList(list);
        //填充设备数据
        FillEquipmentByDepart(treeList);
        FillEquipmentByDepart(treeList, key);
        return treeList;
    }
@@ -248,9 +254,9 @@
     *
     * @param treeList
     */
    private void FillEquipmentByDepart(List<MdcEquipmentTree> treeList) {
    private void FillEquipmentByDepart(List<MdcEquipmentTree> treeList, String key) {
        for (MdcEquipmentTree mdcEquipmentTree : treeList) {
            List<MdcEquipment> equipmentList = this.baseMapper.queryByDepartId(mdcEquipmentTree.getKey());
            List<MdcEquipment> equipmentList = this.baseMapper.queryByDepartId(mdcEquipmentTree.getKey(), key);
            if (equipmentList != null && !equipmentList.isEmpty()) {
                for (MdcEquipment mdcEquipment : equipmentList) {
                    MdcEquipmentTree tree = new MdcEquipmentTree().convert(mdcEquipment);
@@ -260,7 +266,7 @@
                mdcEquipmentTree.setLeaf(false);
            }
            if (!mdcEquipmentTree.getChildren().isEmpty()) {
                FillEquipmentByDepart(mdcEquipmentTree.getChildren());
                FillEquipmentByDepart(mdcEquipmentTree.getChildren(), key);
            }
        }
    }
@@ -287,7 +293,7 @@
    @Override
    public List<MdcEquipmentTree> loadTreeListByProduction(String userId) {
    public List<MdcEquipmentTree> loadTreeListByProduction(String userId, String key) {
        //获取所有产线数据
        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder));
        //根据用户id获取拥有的产线信息集合
@@ -304,7 +310,7 @@
        //组装产线设备树
        List<MdcEquipmentTree> treeList = FindsEquipmentProductionUtil.wrapEquipmentProductionTreeList(list);
        //填充设备数据
        FillEquipmentByProduction(treeList);
        FillEquipmentByProduction(treeList, key);
        return treeList;
    }
@@ -369,7 +375,11 @@
        mdcEquipmentDto.setDataFlag(Integer.parseInt(CommonConstant.STATUS_1));
        ControlSystem controlSystem = controlSystemService.getByDriveType(mdcEquipmentDto.getDriveType());
        // 查询设备状态
        Integer oporation = equipmentLogService.selectEquipmentOporation(mdcEquipment.getEquipmentId());
        EquipmentLog equipmentLog = equipmentLogService.selectEquipmentOporation(mdcEquipment.getEquipmentId());
        if (equipmentLog == null) {
            return mdcEquipmentDto;
        }
        Integer oporation = equipmentLog.getOporation();
        if (controlSystem != null) {
            //获取工作数据并初始化
@@ -413,15 +423,19 @@
                        } else if ("ZUOLAN".equals(mdcEquipment.getDriveType()) && "spindlespeed".equals(englishName) && oporation == 3) {
                            // ZUOLAN设备主轴转速字段spindlespeed
                            value = String.valueOf(((new Random().nextInt(35)) + 1) * 100);
                            mdcEquipmentDto.setSpindlespeed(value);
                        } else if ("ZUOLAN".equals(mdcEquipment.getDriveType()) && "spindleload".equals(englishName) && oporation == 3) {
                            // ZUOLAN设备主轴负荷字段spindleload
                            value = String.valueOf(Integer.valueOf(new Random().nextInt(21)));
                            mdcEquipmentDto.setSpindleload(value);
                        } else if ("ZUOLAN".equals(mdcEquipment.getDriveType()) && "spindlebeilv".equals(englishName) && oporation == 3) {
                            // ZUOLAN设备主轴倍率字段spindlebeilv
                            value = String.valueOf((new Random().nextInt(13)) * 10);
                            mdcEquipmentDto.setSpindlebeilv(value);
                        } else if ("ZUOLAN".equals(mdcEquipment.getDriveType()) && "feedbeilv".equals(englishName) && oporation == 3) {
                            // ZUOLAN设备进给倍率字段feedbeilv
                            value = String.valueOf((new Random().nextInt(13)) * 10);
                            mdcEquipmentDto.setFeedbeilv(value);
                        } else if ("spindle_current".equals(englishName)) {
                            // 其他设备电流字段
                            String devicePower = mdcEquipment.getDevicePower();
@@ -439,6 +453,21 @@
                                value = String.valueOf(mdcTorqueConfig.getTorqueValue());
                            } else {
                                value = "0";
                            }
                        } else if ("alarm".equals(englishName)) {
                            if (oporation == 22) {
                                value = equipmentLog.getAlarm();
                            } else {
                                value = "无";
                            }
                        } else if ("alarmContent".equals(englishName)) {
                            if (oporation == 22) {
                                List<MdcAlarmInfo> mdcAlarmInfo = mdcAlarmInfoService.list(new LambdaQueryWrapper<MdcAlarmInfo>().eq(MdcAlarmInfo::getDriveType, mdcEquipment.getDriveType()).eq(MdcAlarmInfo::getAlarmCode, equipmentLog.getAlarm()).eq(MdcAlarmInfo::getIsUse, 0));
                                if (mdcAlarmInfo != null && !mdcAlarmInfo.isEmpty()) {
                                    value = mdcAlarmInfo.get(0).getAlarmContent();
                                }
                            } else {
                                value = "无";
                            }
                        } else {
                            value = result == null ? null : result.toString();
@@ -608,9 +637,9 @@
    /**
     * 产线设备树填充设备数据
     */
    private void FillEquipmentByProduction(List<MdcEquipmentTree> treeList) {
    private void FillEquipmentByProduction(List<MdcEquipmentTree> treeList, String key) {
        for (MdcEquipmentTree mdcEquipmentTree : treeList) {
            List<MdcEquipment> equipmentList = this.baseMapper.queryByProductionId(mdcEquipmentTree.getKey());
            List<MdcEquipment> equipmentList = this.baseMapper.queryByProductionId(mdcEquipmentTree.getKey(), key);
            if (equipmentList != null && !equipmentList.isEmpty()) {
                for (MdcEquipment mdcEquipment : equipmentList) {
                    MdcEquipmentTree tree = new MdcEquipmentTree().convert(mdcEquipment);
@@ -620,7 +649,7 @@
                mdcEquipmentTree.setLeaf(false);
            }
            if (!mdcEquipmentTree.getChildren().isEmpty()) {
                FillEquipmentByProduction(mdcEquipmentTree.getChildren());
                FillEquipmentByProduction(mdcEquipmentTree.getChildren(), key);
            }
        }
    }
@@ -700,70 +729,185 @@
    }
    @Override
    public List<String> listEquipmentId(String equipmentType, List<String> equipmentIdList) {
        List<MdcEquipment> list = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentType, equipmentType).in(MdcEquipment::getEquipmentId, equipmentIdList));
    public List<String> listEquipmentId(MdcEfficiencyReportQueryVo vo) {
        LambdaQueryWrapper<MdcEquipment> queryWrapper = new LambdaQueryWrapper<>();
        if (vo.getEquipmentIdList() != null && !vo.getEquipmentIdList().isEmpty()) {
            queryWrapper.in(MdcEquipment::getEquipmentId, vo.getEquipmentIdList());
        }
        if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
            queryWrapper.in(MdcEquipment::getEquipmentType, Arrays.asList(vo.getEquipmentType().split(",")));
        }
        if (StringUtils.isNotEmpty(vo.getDeviceLevel())) {
            queryWrapper.in(MdcEquipment::getDeviceLevel, Arrays.asList(vo.getDeviceLevel().split(",")));
        }
        if (StringUtils.isNotEmpty(vo.getDriveType())) {
            queryWrapper.in(MdcEquipment::getDriveType, Arrays.asList(vo.getDriveType().split(",")));
        }
        if (StringUtils.isNotEmpty(vo.getDeviceCategory())) {
            queryWrapper.in(MdcEquipment::getDeviceCategory, Arrays.asList(vo.getDeviceCategory().split(",")));
        }
        if (vo.getDeviceImportanceLevel() != null) {
            queryWrapper.eq(MdcEquipment::getDeviceImportanceLevel, vo.getDeviceImportanceLevel());
        }
        List<MdcEquipment> list = super.list(queryWrapper);
//        List<MdcEquipment> list = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentType, equipmentType).in(MdcEquipment::getEquipmentId, equipmentIdList));
        return list.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
    }
    @Override
    public IPage<MdcEquipment> pageList(Page<MdcEquipment> page, MdcEquipmentVo mdcEquipment, HttpServletRequest req) {
        if (StringUtils.isNotBlank(mdcEquipment.getProductionName())) {
            // 递归查询所有子节点
            List<String> productionIds = mdcProductionService.recursionChildren(mdcEquipment.getProductionName());
            mdcEquipment.setProductionIds(productionIds);
        }
        return this.baseMapper.pageList(page, mdcEquipment);
    }
    /**
     * 监控设备转速任务
     * 监控设备运行参数任务
     */
    @Override
    public void monitoringSpeedProcess() {
        List<MdcEquipment> equipmentList = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getDriveType, "FANUC"));
//        List<MdcEquipment> equipmentList = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getDriveType, "FANUC"));
        List<MdcEquipment> equipmentList = super.list();
        //List<MdcEquipment> equipmentList = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140198"));
        // 获取字典数据
        List<DictModel> dictModelList = sysDictService.queryEnableDictItemsByCode(CommonConstant.DICT_OPERATING_SPEED_RANGE);
        Integer range = 0;
        if (dictModelList != null && !dictModelList.isEmpty()) {
            range = Integer.valueOf(dictModelList.get(0).getValue());
        }
        Map<String, String> proNamesByEquipmentIds = this.getProNamesByEquipmentIds(equipmentList.stream().map(MdcEquipment::getId).collect(Collectors.toList()));
        for (MdcEquipment mdcEquipment : equipmentList) {
            String saveTableName = mdcEquipment.getSaveTableName();
            //查询单表数据
            MdcEquipmentDto mdcEquipmentDto = this.baseMapper.getWorkLineLast(saveTableName);
            if (mdcEquipmentDto != null) {
                MessageDTO messageDTO = new MessageDTO();
                messageDTO.setTitle("设备运行转速报警!");
                messageDTO.setCategory("预警消息");
                messageDTO.setFromUser("admin");
                messageDTO.setToUser("admin");
                Integer spindlespeed = Integer.valueOf(mdcEquipmentDto.getSpindlespeed());
                Integer actualspindlespeed = Integer.valueOf(mdcEquipmentDto.getActualspindlespeed());
                if (range.equals(0)) {
                    if (spindlespeed > actualspindlespeed) {
                        // 实际值大于设定值   高
                        messageDTO.setContent("设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备运行转速高报警!");
                        sysBaseApi.sendSysAnnouncement(messageDTO);
                    } else if (spindlespeed < actualspindlespeed) {
                        // 实际值小于设定值   低
                        messageDTO.setContent("设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备运行转速低报警!");
                        sysBaseApi.sendSysAnnouncement(messageDTO);
                    }
                } else {
                    int max = actualspindlespeed + actualspindlespeed * (range / 100);
                    int min = actualspindlespeed - actualspindlespeed * (range / 100);
                    if (spindlespeed > max || spindlespeed < min) {
                        if (spindlespeed > actualspindlespeed) {
                            // 实际值大于设定值   高
                            messageDTO.setContent("设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备运行转速高报警!");
            String productionName = proNamesByEquipmentIds.get(mdcEquipment.getId());
            List<MdcEquipmentThreshold> mdcEquipmentThresholdList = mdcEquipmentThresholdService.list(new LambdaQueryWrapper<MdcEquipmentThreshold>().eq(MdcEquipmentThreshold::getControlSystemType, mdcEquipment.getDriveType()));
            if (mdcEquipmentThresholdList != null && !mdcEquipmentThresholdList.isEmpty()) {
                String saveTableName = mdcEquipment.getSaveTableName();
                StringBuilder builder = new StringBuilder();
                for (MdcEquipmentThreshold mdcEquipmentThreshold : mdcEquipmentThresholdList) {
                    builder.append(",").append(mdcEquipmentThreshold.getEnglishName()).append(" as \"").append(mdcEquipmentThreshold.getEnglishName()).append("\"  ");
                }
                Map<String, Object> param = new HashMap<>();
                param.put("columns", builder.toString());
                param.put("tableName", saveTableName);
                Map<String, Object> map = new HashMap<>();
                try {
                    map = this.baseMapper.getWorkLineLast(param);
                } catch (Exception e) {
                    log.error("查询单表数据出差!", e);
                }
                if (!map.isEmpty()) {
                    for (MdcEquipmentThreshold mdcEquipmentThreshold : mdcEquipmentThresholdList) {
                        Integer actualValue = Integer.valueOf(map.get(mdcEquipmentThreshold.getEnglishName()).toString());
                        Integer max = mdcEquipmentThreshold.getMaxThreshold();
                        Integer min = mdcEquipmentThreshold.getMinThreshold();
                        MessageDTO messageDTO = new MessageDTO();
                        messageDTO.setTitle("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备" + mdcEquipmentThreshold.getChineseName() + "报警!");
                        messageDTO.setCategory(CommonConstant.MSG_CATEGORY_2);
                        messageDTO.setMessageType(MessageSplitTypeEnum.deviceRunError.getType());
                        messageDTO.setFromUser("admin");
                        messageDTO.setToUser("admin");
                        MdcOverrunAlarm mdcOverrunAlarm = new MdcOverrunAlarm();
                        mdcOverrunAlarm.setEquipmentId(mdcEquipment.getEquipmentId());
                        mdcOverrunAlarm.setSetValue(min + "-" + max);
                        mdcOverrunAlarm.setRealValue(actualValue.toString());
                        if (actualValue > max) {
                            // 高
                            messageDTO.setContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备" + mdcEquipmentThreshold.getChineseName() + "高报警!");
                            sysBaseApi.sendSysAnnouncement(messageDTO);
                        } else if (spindlespeed < actualspindlespeed) {
                            // 实际值小于设定值   低
                            messageDTO.setContent("设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备运行转速低报警!");
                            mdcOverrunAlarm.setAlarmContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备" + mdcEquipmentThreshold.getChineseName() + "高报警!");
                            mdcOverrunAlarmService.save(mdcOverrunAlarm);
                        } else if (actualValue < min) {
                            // 低
                            messageDTO.setContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备" + mdcEquipmentThreshold.getChineseName() + "低报警!");
                            sysBaseApi.sendSysAnnouncement(messageDTO);
                            mdcOverrunAlarm.setAlarmContent("【设备异常提醒】" + productionName + "车间设备编号为 [" + mdcEquipment.getEquipmentId() + "] 的设备" + mdcEquipmentThreshold.getChineseName() + "低报警!");
                            mdcOverrunAlarmService.save(mdcOverrunAlarm);
                        }
                    }
                }
            }
        }
    }
    /**
     * 导出list
     *
     * @param mdcEquipment
     * @return
     */
    @Override
    public List<MdcEquipment> exportXlsList(MdcEquipmentVo mdcEquipment) {
        if (StringUtils.isNotBlank(mdcEquipment.getProductionName())) {
            // 递归查询所有子节点
            List<String> productionIds = mdcProductionService.recursionChildren(mdcEquipment.getProductionName());
            mdcEquipment.setProductionIds(productionIds);
        }
        return this.baseMapper.exportXlsList(mdcEquipment);
    }
    /**
     * 通过车间ids获取设备树
     *
     * @param ids
     * @return
     */
    @Override
    public List<MdcEquipmentTree> loadTreeListByProductionIds(String ids) {
        List<String> productionIds = Arrays.asList(ids.split(","));
        //获取所有产线数据
        List<MdcProduction> productionList = mdcProductionService.list(new LambdaQueryWrapper<MdcProduction>().eq(MdcProduction::getDelFlag, CommonConstant.DEL_FLAG_0.toString()).orderByAsc(MdcProduction::getProductionOrder));
        List<String> allProductionIds = new ArrayList<>();
        //找到所有产线id的上级id
        if (!productionIds.isEmpty()) {
            for (String productionId : productionIds) {
                this.getAllProductionIds(productionList, productionId, allProductionIds);
            }
        }
        //过滤产线数据
        List<MdcProduction> list = productionList.stream().filter((MdcProduction mdcProduction) -> allProductionIds.contains(mdcProduction.getId())).collect(Collectors.toList());
        //组装产线设备树
        List<MdcEquipmentTree> treeList = FindsEquipmentProductionUtil.wrapEquipmentProductionTreeList(list);
        //填充设备数据
        FillEquipmentByProduction(treeList, null);
        return treeList;
    }
    /**
     * 查询单表数据
     *
     * @param tableName
     * @return
     */
    @Override
    public MdcEquipmentDto getWorkLineLast(String tableName) {
        try {
            return this.baseMapper.findWorkLineLast(tableName);
        } catch (Exception e) {
            return null;
        }
    }
    @Override
    public List<String> listEquipmentIdShift(MdcEfficiencyReportShiftQueryVo vo) {
        LambdaQueryWrapper<MdcEquipment> queryWrapper = new LambdaQueryWrapper<>();
        if (vo.getEquipmentIdList() != null && !vo.getEquipmentIdList().isEmpty()) {
            queryWrapper.in(MdcEquipment::getEquipmentId, vo.getEquipmentIdList());
        }
        if (StringUtils.isNotEmpty(vo.getEquipmentType())) {
            queryWrapper.in(MdcEquipment::getEquipmentType, Arrays.asList(vo.getEquipmentType().split(",")));
        }
        if (StringUtils.isNotEmpty(vo.getDeviceLevel())) {
            queryWrapper.in(MdcEquipment::getDeviceLevel, Arrays.asList(vo.getDeviceLevel().split(",")));
        }
        if (StringUtils.isNotEmpty(vo.getDriveType())) {
            queryWrapper.in(MdcEquipment::getDriveType, Arrays.asList(vo.getDriveType().split(",")));
        }
        if (StringUtils.isNotEmpty(vo.getDeviceCategory())) {
            queryWrapper.in(MdcEquipment::getDeviceCategory, Arrays.asList(vo.getDeviceCategory().split(",")));
        }
        if (vo.getDeviceImportanceLevel() != null) {
            queryWrapper.eq(MdcEquipment::getDeviceImportanceLevel, vo.getDeviceImportanceLevel());
        }
        List<MdcEquipment> list = super.list(queryWrapper);
//        List<MdcEquipment> list = super.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentType, equipmentType).in(MdcEquipment::getEquipmentId, equipmentIdList));
        return list.stream().map(MdcEquipment::getEquipmentId).collect(Collectors.toList());
    }
}