package com.jeesite.modules.mes.service; import java.text.Collator; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.annotation.Resource; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.jeesite.common.cache.CacheUtils; import com.jeesite.common.collect.ListUtils; import com.jeesite.common.collect.MapUtils; import com.jeesite.common.config.Global; import com.jeesite.common.entity.Page; import com.jeesite.common.lang.StringUtils; import com.jeesite.common.service.CrudService; import com.jeesite.modules.file.entity.FileUpload; import com.jeesite.modules.file.service.FileUploadService; import com.jeesite.modules.file.utils.FileUploadUtils; import com.jeesite.modules.mes.dao.MesIconsDao; import com.jeesite.modules.mes.entity.MesIcons; import com.jeesite.modules.mes.entity.MesIconsCategory; import com.jeesite.modules.sys.utils.UserUtils; /** * 功能模块Service * @author hzd * @version 2023-07-05 */ @Service public class MesIconsService extends CrudService { /** 参数键:PDA 功能模块是否按分类分组(0=扁平 1=分组) */ public static final String CONFIG_ICONS_GROUPED = "mes.icons.grouped"; @Autowired private MesIconsCategoryService mesIconsCategoryService; @Resource private FileUploadService fileUploadService; /** * 获取单条数据 * @param mesIcons * @return */ @Override public MesIcons get(MesIcons mesIcons) { return super.get(mesIcons); } /** * 查询分页数据 * @param mesIcons 查询条件 * @param mesIcons.page 分页对象 * @return */ @Override public Page findPage(MesIcons mesIcons) { return super.findPage(mesIcons); } /** * 查询列表数据 * @param mesIcons * @return */ @Override public List findList(MesIcons mesIcons) { return super.findList(mesIcons); } /** * 保存数据(插入或更新) * @param mesIcons */ @Override @Transactional public void save(MesIcons mesIcons) { if (StringUtils.isBlank(mesIcons.getCategoryId())) { mesIcons.setCategoryId(MesIconsCategory.DEFAULT_ID); } super.save(mesIcons); // 保存上传图片 FileUploadUtils.saveFileUpload(mesIcons, mesIcons.getId(), "mesIcons_image"); CacheUtils.put("mes_icons","icons",""); } /** * 更新状态 * @param mesIcons */ @Override @Transactional public void updateStatus(MesIcons mesIcons) { super.updateStatus(mesIcons); CacheUtils.put("mes_icons","icons",""); } /** * 删除数据 * @param mesIcons */ @Override @Transactional public void delete(MesIcons mesIcons) { super.delete(mesIcons); CacheUtils.put("mes_icons","icons",""); } /** * PDA 功能模块列表(分组 / 扁平由参数设置 mes.icons.grouped 控制) * @param mesIcons 查询条件 * @param host 图片 URL 前缀 */ public List> findIconsData(MesIcons mesIcons, String host) { return findIconsData(mesIcons, host, isIconsGroupedEnabled()); } /** * 是否启用按分类分组(参数设置:mes.icons.grouped,1=分组,0=扁平) */ public boolean isIconsGroupedEnabled() { return "1".equals(Global.getConfig(CONFIG_ICONS_GROUPED, "1")); } /** * PDA 功能模块列表 * @param grouped true=按分类分组,false=扁平列表(兼容旧版) */ private List> findIconsData(MesIcons mesIcons, String host, boolean grouped) { List list = findList(mesIcons); Subject subject = UserUtils.getSubject(); if (!grouped) { return buildFlatIcons(list, host, subject); } return buildGroupedIcons(list, host, subject); } /** * 扁平列表(旧版格式) */ private List> buildFlatIcons(List list, String host, Subject subject) { List> mapList = ListUtils.newArrayList(); for (MesIcons mi : list) { if (subject.isPermitted(mi.getAuth())) { mapList.add(buildModuleMap(mi, host)); } } return mapList; } /** * 按分类分组列表(新版格式) */ private List> buildGroupedIcons(List list, String host, Subject subject) { MesIconsCategory categoryQuery = new MesIconsCategory(); categoryQuery.setStatus(MesIconsCategory.STATUS_NORMAL); List categories = mesIconsCategoryService.findList(categoryQuery); Map>> grouped = new LinkedHashMap<>(); for (MesIconsCategory category : categories) { grouped.put(category.getId(), ListUtils.newArrayList()); } for (MesIcons mi : list) { if (!subject.isPermitted(mi.getAuth())) { continue; } String categoryId = resolveCategoryId(mi.getCategoryId(), grouped); grouped.computeIfAbsent(categoryId, k -> ListUtils.newArrayList()).add(buildModuleMap(mi, host)); } List> result = ListUtils.newArrayList(); for (MesIconsCategory category : categories) { List> children = grouped.get(category.getId()); if (ListUtils.isEmpty(children)) { continue; } sortChildrenByTitle(children); Map categoryMap = MapUtils.newHashMap(); categoryMap.put("categoryId", category.getId()); categoryMap.put("title", category.getTitle()); categoryMap.put("sort", category.getSortOrder() != null ? category.getSortOrder() : 0); categoryMap.put("children", children); result.add(categoryMap); } return result; } /** * children 按 title 字典序排列(中文按拼音) */ private void sortChildrenByTitle(List> children) { if (ListUtils.isEmpty(children) || children.size() <= 1) { return; } Collator collator = Collator.getInstance(Locale.CHINA); collator.setStrength(Collator.PRIMARY); children.sort((a, b) -> collator.compare( StringUtils.defaultString((String) a.get("title")), StringUtils.defaultString((String) b.get("title")))); } /** * 解析模块所属分类,无效分类归入「其他」 */ private String resolveCategoryId(String categoryId, Map>> grouped) { if (StringUtils.isNotBlank(categoryId) && grouped.containsKey(categoryId)) { return categoryId; } return MesIconsCategory.DEFAULT_ID; } /** * 构建单个功能模块数据 */ private Map buildModuleMap(MesIcons mi, String host) { Map map = MapUtils.newHashMap(); map.put("title", mi.getTitle()); map.put("mode", mi.getMode()); map.put("img", buildModuleImageUrl(mi.getId(), host)); return map; } /** * 获取模块图标完整 URL */ private String buildModuleImageUrl(String bizKey, String host) { FileUpload fu = new FileUpload(); fu.setBizKey(bizKey); fu.setBizType("mesIcons_image"); List finfo = fileUploadService.findList(fu); if (ListUtils.isNotEmpty(finfo)) { return host + finfo.get(0).getFileUrl(); } return host; } }