lyh
2025-07-11 fd57c8510934444df5320029653d530a1abeff67
修改查询
已重命名1个文件
已添加1个文件
已修改7个文件
644 ■■■■■ 文件已修改
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/TechnologyStatusEnum.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/SecondMaintenanceOrderGenerateJob.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java 490 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/rule/WorkShopOrgCodeProRule.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/BaseFactoryServiceImpl.java 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-eam-common/src/main/java/org/jeecg/modules/eam/constant/TechnologyStatusEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package org.jeecg.modules.eam.constant;
public enum TechnologyStatusEnum {
    QUALIFIED, //合格
    RESTRICTED, //限用
    PROHIBITED, //禁用
    ;
}
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/EamEquipmentController.java
@@ -238,7 +238,9 @@
                        baseFactoryService.factoryDataNameByOrgCode(eamEquipmentDto.getZxfactoryOrgCode())
                                +"/"+ baseFactoryService.factoryDataNameByOrgCode(eamEquipmentDto.getFactoryOrgCode()));
            }
            if (eamEquipmentDto.getEquipmentWeight()!=null){
            eamEquipmentDto.setEquipmentWeightStr(eamEquipmentDto.getEquipmentWeight().toEngineeringString());
            }
            eamEquipmentDtos.add(eamEquipmentDto);
        });
        // Step.3 AutoPoi å¯¼å‡ºExcel
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/job/SecondMaintenanceOrderGenerateJob.java
@@ -113,9 +113,9 @@
                for (EamMaintenanceStandardDetail msd : standardDetailList) {
                    EamSecondMaintenanceOrderDetail sod = new EamSecondMaintenanceOrderDetail();
                    sod.setItemCode(msd.getItemCode());
                    sod.setItemCategory(msd.getItemPart());
                    sod.setItemName(msd.getItemName());
                    sod.setItemDemand(msd.getItemDemand());
                    sod.setItemPart(msd.getItemPart());
                    sod.setMaintenanceResult(msd.getItemDemand());
                    tableDetailList.add(sod);
                }
//                List<EamSecondMaintenanceOrderDetail> collect = standardDetailList.stream().map(EamSecondMaintenanceOrderDetail::new).collect(Collectors.toList());
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/request/EamSecondMaintenanceRequest.java
@@ -41,12 +41,6 @@
    /**保养人*/
    @ApiModelProperty(value = "保养人")
    private String operator;
    /**保养图片*/
    @ApiModelProperty(value = "保养图片")
    private String imageFiles;
    /**保养图片*/
    @ApiModelProperty(value = "保养图片")
    private List<FileUploadResult> imageFilesResult;
    /**备注*/
    @ApiModelProperty(value = "备注")
    private String remark;
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamMaintenanceStandardServiceImpl.java
@@ -554,31 +554,31 @@
            // 1. æå–设备信息
            EamMaintenanceStandard eamMaintenanceStandard = extractDeviceInfo(sheet);
            if (eamMaintenanceStandard == null) {
            if (eamMaintenanceStandard == null || eamMaintenanceStandard.getEquipmentId() == null) {
                return Result.error("设备信息提取失败");
            } else {
                if (eamMaintenanceStandard.getEquipmentId() == null) {
                    return Result.error("设备信息提取失败");
                }
            }
            eamMaintenanceStandard.setStandardName(name);
            EamMaintenanceStandard exist = checkDuplicate(eamMaintenanceStandard.getEquipmentId(), eamMaintenanceStandard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.START.name());
            // æ£€æŸ¥é‡å¤
            EamMaintenanceStandard exist = checkDuplicate(eamMaintenanceStandard.getEquipmentId(),
                    eamMaintenanceStandard.getMaintenanceCategory(), MaintenanceStandardStatusEnum.START.name());
            if (exist != null) {
                return Result.error(name + ": è®¾å¤‡æ ‡å‡†å·²å­˜åœ¨ï¼Œä¸èƒ½é‡å¤æ·»åŠ ");
            }
            eamMaintenanceStandardMapper.insert(eamMaintenanceStandard);
            // 2. æå–每日点检项目
            List<EamMaintenanceStandardDetail> dailyDetails = extractDailyItems(sheet, eamMaintenanceStandard);
            Map<Integer, String> rowErrors = new HashMap<>();
            // 2. æå–每日点检项目(优化空行和结束标记处理)
            List<EamMaintenanceStandardDetail> dailyDetails = extractDailyItems(sheet, eamMaintenanceStandard, rowErrors);
            if (dailyDetails.isEmpty()) {
                return Result.error("未找到每日点检项目");
            }
            // 3. æå–周保养项目
            List<EamMaintenanceStandardDetail> weeklyDetails = extractWeeklyItems(sheet, eamMaintenanceStandard);
            List<EamMaintenanceStandardDetail> weeklyDetails = extractWeeklyItems(sheet, eamMaintenanceStandard, rowErrors);
            if (weeklyDetails.isEmpty()) {
                return Result.error("未找到周保养项目");
            }
@@ -592,14 +592,11 @@
                eamMaintenanceStandardDetailService.saveBatch(allDetails);
            }
            SysParams sysParams = sysParamsService.getSysPramBySettingKey("maintenance_import_type");
            if (sysParams != null) {
                if (sysParams.getSettingValue().equals("1")) {
                    //触发保养流程
            SysParams sysParams = sysParamsService.getSysPramBySettingKey("maintenance_import_type");
            if (sysParams != null && sysParams.getSettingValue().equals("1")) {
                    eamMaintenanceStandard.setStandardStatus(MaintenanceStandardStatusEnum.WAIT_SUBMIT.name());
                    eamMaintenanceStandardMapper.updateById(eamMaintenanceStandard);
                }
            } else {
                return Result.error("未找到保养流程导入相关配置,请联系管理员");
            }
@@ -728,171 +725,6 @@
    }
    /**
     * æå–每日点检项目
     */
    private List<EamMaintenanceStandardDetail> extractDailyItems(Sheet sheet, EamMaintenanceStandard standard) {
        return extractItems(sheet, standard, "点检项目", "完成数据/要求", "DAY_INSPECTION");
    }
    /**
     * æå–周保养项目
     */
    private List<EamMaintenanceStandardDetail> extractWeeklyItems(Sheet sheet, EamMaintenanceStandard standard) {
        return extractItems(sheet, standard, "周保养项目", "检查标准", "WEEK_INSPECTION");
    }
    /**
     * é€šç”¨é¡¹ç›®æå–方法
     */
    private List<EamMaintenanceStandardDetail> extractItems(Sheet sheet, EamMaintenanceStandard standard,
                                                            String primaryHeader, String secondaryHeader,
                                                            String itemCategory) {
        int[] section = findTableSection(sheet, primaryHeader, secondaryHeader);
        if (section == null) {
            return Collections.emptyList();
        }
        List<EamMaintenanceStandardDetail> details = new ArrayList<>();
        for (int rowIdx = section[0]; rowIdx <= section[1]; rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            if (row == null || isEmptyRow(row)) {
                continue;
            }
            // ç¡®ä¿ç¬¬ä¸€åˆ—是序号(数字)
            Cell seqCell = row.getCell(0);
            if (seqCell == null || seqCell.getCellType() != CellType.NUMERIC) {
                continue;
            }
            // åˆ›å»ºé¡¹ç›®è¯¦æƒ…
            EamMaintenanceStandardDetail detail = new EamMaintenanceStandardDetail();
            detail.setStandardId(standard.getId());
            detail.setItemCode(Integer.parseInt(getCellStringValue(row.getCell(0))));
            detail.setItemName(getCellStringValue(row.getCell(1)));
            detail.setItemCategory(itemCategory);
            // æ ¹æ®é¡¹ç›®ç±»åž‹è®¾ç½®éœ€æ±‚字段
            if ("DAY_INSPECTION".equals(itemCategory)) {
                detail.setItemDemand(getCellStringValue(row.getCell(2)));
            } else if ("WEEK_INSPECTION".equals(itemCategory)) {
                detail.setItemDemand(getCellStringValue(row.getCell(2)));
            }
            details.add(detail);
        }
        return details;
    }
    /**
     * æŸ¥æ‰¾è¡¨æ ¼åŒºåŸŸ
     */
    private int[] findTableSection(Sheet sheet, String primaryHeader, String secondaryHeader) {
        for (int rowIdx = 0; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            if (row == null) continue;
            if (isHeaderRow(row, primaryHeader, secondaryHeader)) {
                int startRow = rowIdx + 1;
                int endRow = findDataEnd(sheet, startRow);
                return new int[]{startRow, endRow};
            }
        }
        return null;
    }
    /**
     * æ£€æŸ¥æ˜¯å¦ä¸ºè¡¨å¤´è¡Œ
     */
    private boolean isHeaderRow(Row row, String header1, String header2) {
        boolean foundHeader1 = false;
        boolean foundHeader2 = false;
        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
            Cell cell = row.getCell(colIdx);
            if (cell == null) continue;
            String cellValue = getCellStringValue(cell);
            if (cellValue.contains(header1)) foundHeader1 = true;
            if (cellValue.contains(header2)) foundHeader2 = true;
        }
        return foundHeader1 && foundHeader2;
    }
    /**
     * æŸ¥æ‰¾æ•°æ®ç»“束位置
     */
    private int findDataEnd(Sheet sheet, int startRow) {
        for (int rowIdx = startRow; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            if (row == null) return rowIdx - 1;
            // æ£€æŸ¥æ˜¯å¦ç»“束标志行(如签字行)
            if (isSignatureRow(row)) {
                return rowIdx - 1;
            }
            // æ£€æŸ¥æ˜¯å¦æ–°çš„表头开始
            if (isNewHeaderStart(row)) {
                return rowIdx - 1;
            }
        }
        return sheet.getLastRowNum();
    }
    /**
     * è¯†åˆ«ç­¾å­—行特征
     */
    private boolean isSignatureRow(Row row) {
        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
            Cell cell = row.getCell(colIdx);
            if (cell == null) continue;
            String value = getCellStringValue(cell);
            if (value.contains("签字") || value.contains("责任人") ||
                    value.contains("执行") || value.contains("确认")) {
                return true;
            }
        }
        return false;
    }
    /**
     * è¯†åˆ«æ–°è¡¨å¤´å¼€å§‹
     */
    private boolean isNewHeaderStart(Row row) {
        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
            Cell cell = row.getCell(colIdx);
            if (cell == null) continue;
            String value = getCellStringValue(cell);
            if ("序号".equals(value) || "点检项目".equals(value) || "周保养项目".equals(value)) {
                return true;
            }
        }
        return false;
    }
    /**
     * æ£€æŸ¥è¡Œæ˜¯å¦ä¸ºç©º
     */
    private boolean isEmptyRow(Row row) {
        if (row == null) return true;
        for (int colIdx = 0; colIdx < row.getLastCellNum(); colIdx++) {
            Cell cell = row.getCell(colIdx);
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                String value = getCellStringValue(cell);
                if (StringUtils.isNotBlank(value)) {
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * ä½¿ç”¨æ­£åˆ™æå–字段
     */
    private String extractField(String text, String regex) {
@@ -903,10 +735,139 @@
    }
    /**
     * èŽ·å–å•å…ƒæ ¼å­—ç¬¦ä¸²å€¼
            * æå–每日点检项目
     */
    private List<EamMaintenanceStandardDetail> extractDailyItems(Sheet sheet, EamMaintenanceStandard standard, Map<Integer, String> rowErrors) {
        // ä½¿ç”¨å¤šå…³é”®è¯åŒ¹é…
        String[] primaryHeaders = {"点检项目", "日常点检", "每日检查"};
        String[] secondaryHeaders = {"完成数据/要求", "检查标准", "要求"};
        return extractItems(sheet, standard, primaryHeaders, secondaryHeaders, "DAY_INSPECTION", rowErrors);
    }
    /**
            * æå–周保养项目
     */
    private List<EamMaintenanceStandardDetail> extractWeeklyItems(Sheet sheet, EamMaintenanceStandard standard, Map<Integer, String> rowErrors) {
        // ä½¿ç”¨å¤šå…³é”®è¯åŒ¹é…
        String[] primaryHeaders = {"周保养项目", "周保养", "每周保养"};
        String[] secondaryHeaders = {"检查标准", "保养要求", "标准"};
        return extractItems(sheet, standard, primaryHeaders, secondaryHeaders, "WEEK_INSPECTION", rowErrors);
    }
    /**
     * æ ¸å¿ƒæ”¹è¿›ï¼šä¼˜åŒ–表格区域识别和数据提取
    */
    private List<EamMaintenanceStandardDetail> extractItems(Sheet sheet,
                                                            EamMaintenanceStandard standard,
                                                            String[] primaryHeaders,
                                                            String[] secondaryHeaders,
                                                            String itemCategory,
                                                            Map<Integer, String> rowErrors) {
        // 1. å®šä½è¡¨æ ¼åŒºåŸŸï¼ˆç²¾ç¡®åŒ¹é…è¡¨å¤´ï¼‰
        int startRow = findHeaderRow(sheet, primaryHeaders, secondaryHeaders);
        if (startRow == -1) {
            rowErrors.put(-1, "未找到" + Arrays.toString(primaryHeaders) + "表头区域");
            return Collections.emptyList();
        }
        int endRow = findDataEnd(sheet, startRow + 1, "周保养项目");
        // æå–日志(实际使用时可以去掉)
        System.out.println("提取区域: " + (startRow + 1) + "行到" + (endRow + 1) + "行");
        // 2. æå–数据行
        List<EamMaintenanceStandardDetail> details = new ArrayList<>();
        for (int rowIdx = startRow + 1; rowIdx <= endRow; rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            if (row == null) continue;
            try {
                // åºå·åˆ—处理
                Cell seqCell = row.getCell(0);
                if (seqCell == null || seqCell.getCellType() == CellType.BLANK) {
                    continue;
                }
                // èŽ·å–åºå·å€¼ï¼ˆæ”¯æŒæ•°å­—å’Œæ–‡æœ¬æ ¼å¼ï¼‰
                int seqValue = 0;
                try {
                    if (seqCell.getCellType() == CellType.NUMERIC) {
                        seqValue = (int) seqCell.getNumericCellValue();
                    } else if (seqCell.getCellType() == CellType.STRING) {
                        seqValue = Integer.parseInt(seqCell.getStringCellValue().trim());
                    }
                } catch (NumberFormatException e) {
                    rowErrors.put(rowIdx + 1, "序号格式错误");
                    continue;
                }
                // é¡¹ç›®åç§°åˆ—(第二列)
                Cell nameCell = row.getCell(1);
                if (nameCell == null || nameCell.getCellType() == CellType.BLANK) {
                    continue;
                }
                String itemName = getCellStringValue(nameCell).trim();
                // è¦æ±‚/标准列(第三列)
                String demand = "";
                if (row.getLastCellNum() >= 3) {
                    Cell demandCell = row.getCell(2);
                    if (demandCell != null) {
                        demand = getCellStringValue(demandCell).trim();
                    }
                }
                // åˆ›å»ºè¯¦æƒ…对象
                EamMaintenanceStandardDetail detail = new EamMaintenanceStandardDetail();
                detail.setStandardId(standard.getId());
                detail.setItemCode(seqValue);
                detail.setItemName(itemName);
                detail.setItemDemand(demand);
                detail.setItemCategory(itemCategory);
                details.add(detail);
            } catch (Exception e) {
                rowErrors.put(rowIdx + 1, "解析错误: " + e.getMessage());
            }
        }
        return details;
    }
    /**
     * èŽ·å–è¡Œä¸­æ‰€æœ‰å•å…ƒæ ¼çš„å­—ç¬¦ä¸²å€¼
     */
    private List<String> getRowStringValues(Row row) {
        List<String> values = new ArrayList<>();
        if (row == null) return values;
        for (int cellIdx = 0; cellIdx < row.getLastCellNum(); cellIdx++) {
            Cell cell = row.getCell(cellIdx);
            if (cell != null) {
                values.add(getCellStringValue(cell));
            } else {
                values.add(""); // å¯¹äºŽç©ºå•元格添加空字符串
            }
        }
        return values;
    }
    /**
     * èŽ·å–å•å…ƒæ ¼å­—ç¬¦ä¸²å€¼ï¼ˆå¢žå¼ºå…¬å¼å¤„ç†ï¼‰
     */
    private String getCellStringValue(Cell cell) {
        if (cell == null) return "";
        if (cell == null) {
            return "";
        }
        // ä¿æŒä¸å˜ï¼Œä½†æ·»åŠ æ•°å­—ç±»åž‹å¤„ç†
        if (cell.getCellType() == CellType.NUMERIC) {
            // æ•´æ•°å¤„理
            double num = cell.getNumericCellValue();
            if (num == (int) num) {
                return String.valueOf((int) num);
            }
            return String.valueOf(num);
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue().trim();
@@ -918,22 +879,117 @@
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return handleFormulaCell(cell);
                return getFormulaCellValue(cell);
            default:
                return "";
        }
    }
    /**
     * å¤„理公式单元格
     * ç²¾ç¡®æŸ¥æ‰¾è¡¨å¤´è¡Œ
     */
    private String handleFormulaCell(Cell cell) {
    private int findHeaderRow(Sheet sheet, String[] primaryHeaders, String[] secondaryHeaders) {
        for (int rowIdx = 0; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            if (row == null) continue;
            String rowText = getRowStringValues(row).stream().collect(Collectors.joining());
            // æ£€æŸ¥ä¸»æ ‡é¢˜å’Œå‰¯æ ‡é¢˜
            boolean hasPrimary = false;
            boolean hasSecondary = false;
            for (String header : primaryHeaders) {
                if (rowText.contains(header)) {
                    hasPrimary = true;
                    break;
                }
            }
            for (String header : secondaryHeaders) {
                if (rowText.contains(header)) {
                    hasSecondary = true;
                    break;
                }
            }
            if (hasPrimary && hasSecondary) {
                return rowIdx;
            }
        }
        return -1;
    }
    /**
     * æŸ¥æ‰¾æ•°æ®ç»“束位置(根据您的Excel结构优化)
     */
    private int findDataEnd(Sheet sheet, int startRow, String nextSectionKeyword) {
        int consecutiveEmptyRows = 0;
        final int MAX_EMPTY_ROWS = 3;
        for (int rowIdx = startRow; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            // å…³é”®æ”¹è¿›1:空行处理
            if (isEssentiallyEmpty(row)) {
                consecutiveEmptyRows++;
                if (consecutiveEmptyRows >= MAX_EMPTY_ROWS) {
                    return rowIdx - consecutiveEmptyRows;
                }
                continue;
            } else {
                consecutiveEmptyRows = 0;
            }
            // å…³é”®æ”¹è¿›2:结束标记检测
            String rowText = getRowStringValues(row).stream().collect(Collectors.joining());
            // æ ¹æ®æ‚¨çš„Excel结构,签字行有特定格式
            if (rowText.contains("维护责任人签字")) {
                return rowIdx - 1;
            }
            // æ£€æµ‹ä¸‹ä¸€ä¸ªåŒºåŸŸçš„开始(如周保养项目)
            if (StringUtils.isNotBlank(nextSectionKeyword) &&
                    rowText.contains(nextSectionKeyword)) {
                return rowIdx - 1;
            }
        }
        return sheet.getLastRowNum();
    }
    /**
     * åˆ¤æ–­æ¡ä»¶ï¼šå‰ä¸¤åˆ—为空即视为空行
     */
    private boolean isEssentiallyEmpty(Row row) {
        if (row == null) return true;
        // æ£€æŸ¥åºå·åˆ—
        Cell indexCell = row.getCell(0);
        if (indexCell != null && indexCell.getCellType() != CellType.BLANK) {
            return false;
        }
        // æ£€æŸ¥é¡¹ç›®åç§°åˆ—
        Cell nameCell = row.getCell(1);
        if (nameCell != null && nameCell.getCellType() != CellType.BLANK) {
            return false;
        }
        return true;
    }
    /**
            * èŽ·å–å…¬å¼å•å…ƒæ ¼å€¼
     */
    private String getFormulaCellValue(Cell cell) {
        try {
            FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
            Workbook workbook = cell.getSheet().getWorkbook();
            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
            CellValue cellValue = evaluator.evaluate(cell);
            if (cellValue == null) return "";
            if (cellValue == null) {
                return "";
            }
            switch (cellValue.getCellType()) {
                case STRING:
                    return cellValue.getStringValue();
@@ -945,9 +1001,67 @@
                    return "";
            }
        } catch (Exception e) {
            log.warn("解析公式单元格失败");
            return "";
        }
    }
    private int findDataEnd(Sheet sheet, int startRow) {
        int consecutiveEmptyRows = 0;
        final int MAX_EMPTY_ROWS = 2;
        boolean foundData = false;
        for (int rowIdx = startRow; rowIdx <= sheet.getLastRowNum(); rowIdx++) {
            Row row = sheet.getRow(rowIdx);
            // å…³é”®ä¼˜åŒ–1:先检查是否为空行
            if (isEmptyRow(row)) {
                consecutiveEmptyRows++;
                if (consecutiveEmptyRows >= MAX_EMPTY_ROWS) {
                    return foundData ? rowIdx - consecutiveEmptyRows : startRow;
                }
                continue;
            } else {
                consecutiveEmptyRows = 0;
            }
            // å…³é”®ä¼˜åŒ–2:严格限定结束标记的识别条件
            if (isStrongEndMarker(row)) {
                return foundData ? rowIdx - 1 : startRow;
            }
            // å…³é”®ä¼˜åŒ–3:标记已找到有效数据
            foundData = true;
        }
        return sheet.getLastRowNum();
    }
    // å¢žå¼ºç‰ˆç»“束标记识别
    private boolean isStrongEndMarker(Row row) {
        String rowText = String.join("", getRowStringValues(row)).toLowerCase();
        return
                // ç²¾ç¡®åŒ¹é…ç­¾å­—特征(出现在行首)
                (rowText.startsWith("维护责任人签字") ||
                        rowText.startsWith("执行人签字")) ||
                        // ç²¾ç¡®åŒ¹é…æ–°æ¿å—标题
                        rowText.matches("^\\s*周保养项目\\s*$") ||
                        rowText.contains("年度保养项目");
    }
    // ç©ºè¡Œæ£€æµ‹ä¼˜åŒ–(允许部分列为空)
    private boolean isEmptyRow(Row row) {
        if (row == null) return true;
        // åªæ£€æŸ¥å‰3列(序号列+项目名+要求)
        for (int cellIdx = 0; cellIdx < Math.min(3, row.getLastCellNum()); cellIdx++) {
            Cell cell = row.getCell(cellIdx);
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                return false;
            }
        }
        return true;
    }
    /*导入点检文件Excel--------------------------结束*/
    /*导入二保三保文件Excel--------------------------开始*/
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/EamSecondMaintenanceOrderServiceImpl.java
@@ -3,12 +3,12 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.flowable.engine.TaskService;
@@ -33,6 +33,10 @@
import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
import org.jeecg.modules.flowable.service.IFlowDefinitionService;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.system.entity.BaseFactory;
import org.jeecg.modules.system.entity.BaseFactoryUser;
import org.jeecg.modules.system.service.IBaseFactoryService;
import org.jeecg.modules.system.service.IBaseFactoryUserService;
import org.jeecg.modules.system.service.ISysUserService;
import org.jeecg.modules.system.vo.UserSelector;
import org.springframework.beans.factory.annotation.Autowired;
@@ -66,7 +70,10 @@
    private TaskService taskService;
    @Autowired
    private IFlowTaskService flowTaskService;
    @Autowired
    private IBaseFactoryUserService baseFactoryUserService;
    @Autowired
    private IBaseFactoryService baseFactoryService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
@@ -84,13 +91,21 @@
        if (sysUser == null) {
            return page;
        }
        if (StringUtils.isNotBlank(sysUser.getEquipmentIds())) {
        if (StringUtils.isNotBlank(sysUser.getEamEquipmentIds())) {
            //选择了设备,根据设备id过滤设备
            List<String> equipArr = Arrays.asList(sysUser.getEquipmentIds().split(","));
            List<String> equipArr = Arrays.asList(sysUser.getEamEquipmentIds().split(","));
            queryWrapper.in("e.equipment_code", equipArr);
        } else {
            //没有选择设备,根据车间过滤设备
            queryWrapper.exists("select 1 from mdc_user_production t where t.user_id={0} and t.pro_id=e.org_id ", sysUser.getId());
            //没有选择设备,根据中心过滤设备
            List<BaseFactoryUser> baseFactoryUserList=baseFactoryUserService.
                    list(new LambdaQueryWrapper<BaseFactoryUser>().eq(BaseFactoryUser::getUserId,sysUser.getId()));
            if(!CollectionUtils.isEmpty(baseFactoryUserList)){
                Set<String> factoryIds = baseFactoryUserList.stream().map(BaseFactoryUser::getFactoryId).collect(Collectors.toSet());
                Set<String> factoryCode= baseFactoryService.listByIds(factoryIds).stream().map(BaseFactory::getOrgCode).collect(Collectors.toSet());
                queryWrapper.in("e.factory_org_code", factoryCode);
            } else {
                return page;
            }
        }
        //查询条件过滤
        if (query != null) {
@@ -370,17 +385,6 @@
                //设置entity
                entity.setMaintenanceStatus(SecondMaintenanceStatusEnum.WAIT_CONFIRM.name());
                entity.setActualEndTime(new Date());
                //处理附件
                if (CollectionUtil.isNotEmpty(request.getImageFilesResult())) {
                    List<FileUploadResult> fileUploadResultList = request.getImageFilesResult();
                    ObjectMapper mapper = new ObjectMapper();
                    try {
                        String referenceFile = mapper.writeValueAsString(fileUploadResultList);
                        entity.setImageFiles(referenceFile);
                    } catch (JsonProcessingException e) {
                        log.error("JSON转换失败:" + e.getMessage(), e);
                    }
                }
                //处理详情
                if (CollectionUtil.isNotEmpty(request.getTableDetailList())) {
                    secondMaintenanceOrderDetailService.updateBatchById(request.getTableDetailList());
@@ -403,10 +407,7 @@
                request.setComment(request.getConfirmComment());
                //设置entity
                entity.setMaintenanceStatus(SecondMaintenanceStatusEnum.WAIT_LEADER_CONFIRM.name());
                entity.setConfirmUser(user.getUsername());
                entity.setConfirmComment(request.getConfirmComment());
                entity.setConfirmTime(new Date());
                entity.setConfirmDealType(request.getConfirmDealType());
                if (CommonConstant.HAS_CANCLE.equals(request.getConfirmDealType())) {
                    //驳回
                    userApprovalList = new ArrayList<>();
@@ -427,9 +428,6 @@
                request.setComment(request.getLeaderConfirmComment());
                //设置entity
                entity.setMaintenanceStatus(SecondMaintenanceStatusEnum.COMPLETE.name());
                entity.setConfirmLeader(user.getUsername());
                entity.setLeaderConfirmComment(request.getLeaderConfirmComment());
                entity.setLeaderConfirmTime(new Date());
                //更新设备保养状态
                eamEquipmentExtendService.updateEquipmentMaintenanceStatus(entity.getEquipmentId(), EquipmentMaintenanceStatus.NORMAL.name());
                break;
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/rule/WorkShopOrgCodeProRule.java
ÎļþÃû´Ó lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/util/WorkShopOrgCodeProRule.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package org.jeecg.modules.system.util;
package org.jeecg.modules.system.rule;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/BaseFactoryServiceImpl.java
@@ -122,87 +122,47 @@
        String[] levels = path.split("/");
        int depth = levels.length;
        // æ”¯æŒå¤šç§æ ¼å¼ï¼šä¸­å¿ƒ/工区、中心/工段、中心/工区/工段
        // æ”¯æŒæ ¼å¼ï¼šä¸­å¿ƒ/工区、中心/工段、中心/工区/工段
        if (depth < 2 || depth > 3) {
            return null;
        }
        // ä»Žåº•层开始查询:最后一级可能是工区或工段
        String lastName = levels[depth - 1];
        BaseFactory lastLevel = searchForLastLevel(lastName);
        if (lastLevel == null) return null;
        // ä»Žé¡¶å±‚开始查询 - ç¬¬1级:中心节点
        BaseFactory center = findFactory(levels[0], 1, null);
        if (center == null) return null;
        return validatePath(levels, lastLevel);
        // ç¬¬2级查询:工区或工段
        BaseFactory secondLevel;
        if (depth == 2) {
            // å…¼å®¹æ–¹æ¡ˆï¼šä¼˜å…ˆæŸ¥å·¥æ®µå†æŸ¥å·¥åŒº
            secondLevel = findFactory(levels[1], 3, center.getId());
            if (secondLevel == null) {
                secondLevel = findFactory(levels[1], 2, center.getId());
    }
    private BaseFactory validatePath(String[] levels, BaseFactory lastLevel) {
        if (levels.length == 2) {
            // ä¸­å¿ƒ/工区 æˆ– ä¸­å¿ƒ/工段
            BaseFactory center = findParentCenter(lastLevel);
            if (center != null &&
                    center.getFactoryName().equals(levels[0]) &&
                    ("1").equals(center.getFactoryCategory())) {
                return lastLevel;
            }
            return secondLevel; // å¯èƒ½ä¸ºnull
        } else {
            // ä¸­å¿ƒ/工区/工段
            if (!("3").equals(lastLevel.getFactoryCategory())) return null;
            // ç¬¬2级必须是工区
            BaseFactory workArea = findFactory(levels[1], 2, center.getId());
            if (workArea == null) return null;
            BaseFactory workArea = getById(lastLevel.getParentId());
            if (workArea == null ||
                    !("2").equals(workArea.getFactoryCategory())) return null;
            BaseFactory center = getById(workArea.getParentId());
            if (center == null ||
                    !("1").equals(center.getFactoryCategory())) return null;
            if (workArea.getFactoryName().equals(levels[1]) &&
                    center.getFactoryName().equals(levels[0])) {
                return lastLevel;
            // ç¬¬3级:工段
            return findFactory(levels[2], 3, workArea.getId());
            }
        }
        return null;
    }
    private BaseFactory searchForLastLevel(String name) {
        // å…ˆå°è¯•查询工段(类别3)
        BaseFactory workshop = findFactory(name, 3, null);
        if (workshop != null) return workshop;
        // å¦‚果没有找到工段,尝试查询工区(类别2)
        return findFactory(name, 2, null);
    }
    private BaseFactory findParentCenter(BaseFactory entity) {
        if (("1").equals(entity.getFactoryCategory())) {
            return entity; // æœ¬èº«å°±æ˜¯ä¸­å¿ƒ
        }
        BaseFactory parent = getById(entity.getParentId());
        if (parent == null) return null;
        if (("1").equals(parent.getFactoryCategory())) {
            return parent; // ç›´æŽ¥çˆ¶çº§æ˜¯ä¸­å¿ƒ
        }
        // å¦‚果父级不是中心,尝试找父级的父级
        return getById(parent.getParentId());
    }
    // ä¿æŒä¸å˜
    private BaseFactory searchByCodeOrName(String keyword) {
        // ä½¿ç”¨åˆ†é¡µæ–¹å¼å…¼å®¹SQL Server
        LambdaQueryWrapper<BaseFactory> query = new LambdaQueryWrapper<>();
        query.and(q -> q.eq(BaseFactory::getFactoryName, keyword)
                .or()
                .like(BaseFactory::getFactoryCode, keyword));
        // ä½¿ç”¨åˆ†é¡µæŸ¥è¯¢èŽ·å–ç¬¬ä¸€æ¡è®°å½•
        Page<BaseFactory> page = new Page<>(1, 1);
        Page<BaseFactory> resultPage = baseMapper.selectPage(page, query);
        return resultPage.getRecords().isEmpty() ? null : resultPage.getRecords().get(0);
    }
    // ä¿æŒä¸å˜
    private BaseFactory findFactory(String name, Integer category, String parentId) {
        LambdaQueryWrapper<BaseFactory> query = new LambdaQueryWrapper<>();
        query.eq(BaseFactory::getFactoryName, name);
@@ -210,17 +170,11 @@
        if (category != null) query.eq(BaseFactory::getFactoryCategory, category);
        if (parentId != null) query.eq(BaseFactory::getParentId, parentId);
        // ä½¿ç”¨åˆ†é¡µæ–¹å¼å…¼å®¹SQL Server
        Page<BaseFactory> page = new Page<>(1, 1);
        Page<BaseFactory> resultPage = baseMapper.selectPage(page, query);
        return resultPage.getRecords().isEmpty() ? null : resultPage.getRecords().get(0);
    }
    private BaseFactory getById(String id) {
        if (StringUtils.isBlank(id)) return null;
        return baseMapper.selectById(id);
    }
    /**
     * saveProductionData å¯¹åº” add ä¿å­˜ç”¨æˆ·åœ¨é¡µé¢æ·»åŠ çš„æ–°çš„è®¾å¤‡è½¦é—´ç®¡ç†å¯¹è±¡æ•°æ®
lxzn-module-system/lxzn-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java
@@ -796,7 +796,7 @@
            if (CollectionUtil.isNotEmpty(factoryIds)) {
                String factory = String.join(",", factoryIds);
                String inClause = "(" + factory + ")";
                queryWrapper.exists("select 1 from eam_base_factory_user t where t.user_id=sys_user.id and t.factory_id in {0}", inClause);
                queryWrapper.exists("select 1 from eam_base_factory_user t where t.user_id=sys_user.id and t.factory_id in "+inClause);
            } else {
                return Collections.emptyList();
            }