package jnpf.base.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import jnpf.base.entity.ModuleButtonEntity; import jnpf.base.entity.ModuleEntity; import jnpf.base.entity.VisualdevEntity; import jnpf.base.model.button.ButtonListVO; import jnpf.base.model.module.PropertyJsonModel; import jnpf.flowable.TemplateApi; import jnpf.onlinedev.VisualdevOnlineApi; import jnpf.util.JsonUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @Service @RequiredArgsConstructor public class MenuActionCandidateService { private final ModuleService moduleService; private final ModuleButtonService moduleButtonService; private final TemplateApi templateApi; private final VisualdevOnlineApi visualdevApi; public List getCandidates(String menuId, String keyword) { ModuleEntity menu = moduleService.getInfo(menuId); if (menu == null || (!Objects.equals(menu.getType(), 3) && !Objects.equals(menu.getType(), 9))) { return new ArrayList<>(); } PropertyJsonModel property = JsonUtil.getJsonToBean(menu.getPropertyJson(), PropertyJsonModel.class); if (property == null || property.getModuleId() == null || property.getModuleId().isEmpty()) { return new ArrayList<>(); } String formId = Objects.equals(menu.getType(), 9) ? templateApi.getFormByFlowId(property.getModuleId()) : property.getModuleId(); if (formId == null || formId.isEmpty()) { return new ArrayList<>(); } VisualdevEntity form = visualdevApi.getReleaseInfo(formId); if (form == null) { return new ArrayList<>(); } Set associatedCodes = new HashSet<>(); for (ModuleButtonEntity button : moduleButtonService.getListByModuleIds(menuId)) { associatedCodes.add(button.getEnCode()); } String columnData = "App".equalsIgnoreCase(menu.getCategory()) ? form.getAppColumnData() : form.getColumnData(); return extractCandidates(columnData, associatedCodes, keyword); } static List extractCandidates(String columnData, Set associatedCodes, String keyword) { Map candidates = new LinkedHashMap<>(); if (columnData == null || columnData.isEmpty()) { return new ArrayList<>(); } JSONObject columns = JSON.parseObject(columnData); addButtons(candidates, columns.getJSONArray("btnsList"), true, associatedCodes, keyword); addButtons(candidates, columns.getJSONArray("columnBtnsList"), true, associatedCodes, keyword); addButtons(candidates, columns.getJSONArray("customBtnsList"), false, associatedCodes, keyword); return new ArrayList<>(candidates.values()); } private static void addButtons(Map candidates, JSONArray buttons, boolean builtIn, Set associatedCodes, String keyword) { if (buttons == null) { return; } for (int i = 0; i < buttons.size(); i++) { JSONObject button = buttons.getJSONObject(i); if (button == null || Boolean.FALSE.equals(button.getBoolean("show"))) { continue; } String value = button.getString("value"); String name = button.getString("label"); if (value == null || value.isEmpty() || name == null || name.isEmpty()) { continue; } String code = builtIn ? "btn_" + value : value; if (associatedCodes.contains(code) || (keyword != null && !keyword.isEmpty() && !code.contains(keyword) && !name.contains(keyword))) { continue; } ButtonListVO candidate = new ButtonListVO(); candidate.setId(code); candidate.setEnCode(code); candidate.setFullName(name); candidates.putIfAbsent(code, candidate); } } }