package com.ruoyi.basic.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.basic.dto.TemplateInspectionItemDto; import com.ruoyi.common.exception.base.BaseException; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; /** 解析 Luckysheet 原始记录模板中的“检验项”标记。 */ public final class StandardTemplateInspectionItemParser { private static final String INSPECTION_ITEM_MARK = "检验项"; private StandardTemplateInspectionItemParser() { } public static List parse(Integer templateId, Integer templateSort, String thing) { if (!StringUtils.hasText(thing)) { throw new BaseException("原始记录模板内容不能为空"); } JSONArray sheets; try { JSONObject root = JSON.parseObject(thing); sheets = root == null ? null : root.getJSONArray("data"); if (sheets == null) { sheets = JSON.parseArray(thing); } } catch (Exception e) { throw new BaseException("原始记录模板格式错误"); } List result = new ArrayList<>(); Set rows = new HashSet<>(); if (sheets == null) { throw new BaseException("原始记录模板格式错误"); } for (Object sheetObject : sheets) { JSONObject sheet = (JSONObject) sheetObject; JSONArray cells = sheet.getJSONArray("celldata"); if (cells == null) { continue; } for (Object cellObject : cells) { JSONObject cell = (JSONObject) cellObject; JSONObject value = cell.getJSONObject("v"); if (value == null || !isInspectionItem(value)) { continue; } Integer row = cell.getInteger("r"); String item = getCellText(value); if (row == null || !StringUtils.hasText(item)) { throw new BaseException("“检验项”标记所在单元格必须填写检验项名称"); } if (!rows.add(row)) { throw new BaseException("同一模板行只能配置一个“检验项”标记"); } TemplateInspectionItemDto dto = new TemplateInspectionItemDto(); dto.setTemplateId(templateId); dto.setTemplateSort(templateSort); dto.setTemplateRowIndex(row); dto.setInspectionItem(item.trim()); result.add(dto); } } result.sort(Comparator.comparing(TemplateInspectionItemDto::getTemplateRowIndex)); return result; } /** * 读取 Luckysheet 单元格文本,兼容普通文本和 inlineStr 富文本。 */ private static String getCellText(JSONObject value) { String text = value.getString("v"); if (StringUtils.hasText(text)) { return text; } text = value.getString("m"); if (StringUtils.hasText(text)) { return text; } JSONObject cellType = value.getJSONObject("ct"); JSONArray segments = cellType == null ? null : cellType.getJSONArray("s"); if (segments == null || segments.isEmpty()) { return text; } StringBuilder richText = new StringBuilder(); for (Object segmentObject : segments) { if (segmentObject instanceof JSONObject) { String segmentText = ((JSONObject) segmentObject).getString("v"); if (segmentText != null) { richText.append(segmentText); } } } return richText.toString(); } private static boolean isInspectionItem(JSONObject value) { JSONObject ps = value.getJSONObject("ps"); return ps != null && INSPECTION_ITEM_MARK.equals(ps.getString("value")); } }