MesIconsService.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package com.jeesite.modules.mes.service;
  2. import java.text.Collator;
  3. import java.util.LinkedHashMap;
  4. import java.util.List;
  5. import java.util.Locale;
  6. import java.util.Map;
  7. import javax.annotation.Resource;
  8. import org.apache.shiro.subject.Subject;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.transaction.annotation.Transactional;
  12. import com.jeesite.common.cache.CacheUtils;
  13. import com.jeesite.common.collect.ListUtils;
  14. import com.jeesite.common.collect.MapUtils;
  15. import com.jeesite.common.config.Global;
  16. import com.jeesite.common.entity.Page;
  17. import com.jeesite.common.lang.StringUtils;
  18. import com.jeesite.common.service.CrudService;
  19. import com.jeesite.modules.file.entity.FileUpload;
  20. import com.jeesite.modules.file.service.FileUploadService;
  21. import com.jeesite.modules.file.utils.FileUploadUtils;
  22. import com.jeesite.modules.mes.dao.MesIconsDao;
  23. import com.jeesite.modules.mes.entity.MesIcons;
  24. import com.jeesite.modules.mes.entity.MesIconsCategory;
  25. import com.jeesite.modules.sys.utils.UserUtils;
  26. /**
  27. * 功能模块Service
  28. * @author hzd
  29. * @version 2023-07-05
  30. */
  31. @Service
  32. public class MesIconsService extends CrudService<MesIconsDao, MesIcons> {
  33. /** 参数键:PDA 功能模块是否按分类分组(0=扁平 1=分组) */
  34. public static final String CONFIG_ICONS_GROUPED = "mes.icons.grouped";
  35. @Autowired
  36. private MesIconsCategoryService mesIconsCategoryService;
  37. @Resource
  38. private FileUploadService fileUploadService;
  39. /**
  40. * 获取单条数据
  41. * @param mesIcons
  42. * @return
  43. */
  44. @Override
  45. public MesIcons get(MesIcons mesIcons) {
  46. return super.get(mesIcons);
  47. }
  48. /**
  49. * 查询分页数据
  50. * @param mesIcons 查询条件
  51. * @param mesIcons.page 分页对象
  52. * @return
  53. */
  54. @Override
  55. public Page<MesIcons> findPage(MesIcons mesIcons) {
  56. return super.findPage(mesIcons);
  57. }
  58. /**
  59. * 查询列表数据
  60. * @param mesIcons
  61. * @return
  62. */
  63. @Override
  64. public List<MesIcons> findList(MesIcons mesIcons) {
  65. return super.findList(mesIcons);
  66. }
  67. /**
  68. * 保存数据(插入或更新)
  69. * @param mesIcons
  70. */
  71. @Override
  72. @Transactional
  73. public void save(MesIcons mesIcons) {
  74. if (StringUtils.isBlank(mesIcons.getCategoryId())) {
  75. mesIcons.setCategoryId(MesIconsCategory.DEFAULT_ID);
  76. }
  77. super.save(mesIcons);
  78. // 保存上传图片
  79. FileUploadUtils.saveFileUpload(mesIcons, mesIcons.getId(), "mesIcons_image");
  80. CacheUtils.put("mes_icons","icons","");
  81. }
  82. /**
  83. * 更新状态
  84. * @param mesIcons
  85. */
  86. @Override
  87. @Transactional
  88. public void updateStatus(MesIcons mesIcons) {
  89. super.updateStatus(mesIcons);
  90. CacheUtils.put("mes_icons","icons","");
  91. }
  92. /**
  93. * 删除数据
  94. * @param mesIcons
  95. */
  96. @Override
  97. @Transactional
  98. public void delete(MesIcons mesIcons) {
  99. super.delete(mesIcons);
  100. CacheUtils.put("mes_icons","icons","");
  101. }
  102. /**
  103. * PDA 功能模块列表(分组 / 扁平由参数设置 mes.icons.grouped 控制)
  104. * @param mesIcons 查询条件
  105. * @param host 图片 URL 前缀
  106. */
  107. public List<Map<String, Object>> findIconsData(MesIcons mesIcons, String host) {
  108. return findIconsData(mesIcons, host, isIconsGroupedEnabled());
  109. }
  110. /**
  111. * 是否启用按分类分组(参数设置:mes.icons.grouped,1=分组,0=扁平)
  112. */
  113. public boolean isIconsGroupedEnabled() {
  114. return "1".equals(Global.getConfig(CONFIG_ICONS_GROUPED, "1"));
  115. }
  116. /**
  117. * PDA 功能模块列表
  118. * @param grouped true=按分类分组,false=扁平列表(兼容旧版)
  119. */
  120. private List<Map<String, Object>> findIconsData(MesIcons mesIcons, String host, boolean grouped) {
  121. List<MesIcons> list = findList(mesIcons);
  122. Subject subject = UserUtils.getSubject();
  123. if (!grouped) {
  124. return buildFlatIcons(list, host, subject);
  125. }
  126. return buildGroupedIcons(list, host, subject);
  127. }
  128. /**
  129. * 扁平列表(旧版格式)
  130. */
  131. private List<Map<String, Object>> buildFlatIcons(List<MesIcons> list, String host, Subject subject) {
  132. List<Map<String, Object>> mapList = ListUtils.newArrayList();
  133. for (MesIcons mi : list) {
  134. if (subject.isPermitted(mi.getAuth())) {
  135. mapList.add(buildModuleMap(mi, host));
  136. }
  137. }
  138. return mapList;
  139. }
  140. /**
  141. * 按分类分组列表(新版格式)
  142. */
  143. private List<Map<String, Object>> buildGroupedIcons(List<MesIcons> list, String host, Subject subject) {
  144. MesIconsCategory categoryQuery = new MesIconsCategory();
  145. categoryQuery.setStatus(MesIconsCategory.STATUS_NORMAL);
  146. List<MesIconsCategory> categories = mesIconsCategoryService.findList(categoryQuery);
  147. Map<String, List<Map<String, Object>>> grouped = new LinkedHashMap<>();
  148. for (MesIconsCategory category : categories) {
  149. grouped.put(category.getId(), ListUtils.newArrayList());
  150. }
  151. for (MesIcons mi : list) {
  152. if (!subject.isPermitted(mi.getAuth())) {
  153. continue;
  154. }
  155. String categoryId = resolveCategoryId(mi.getCategoryId(), grouped);
  156. grouped.computeIfAbsent(categoryId, k -> ListUtils.newArrayList()).add(buildModuleMap(mi, host));
  157. }
  158. List<Map<String, Object>> result = ListUtils.newArrayList();
  159. for (MesIconsCategory category : categories) {
  160. List<Map<String, Object>> children = grouped.get(category.getId());
  161. if (ListUtils.isEmpty(children)) {
  162. continue;
  163. }
  164. sortChildrenByTitle(children);
  165. Map<String, Object> categoryMap = MapUtils.newHashMap();
  166. categoryMap.put("categoryId", category.getId());
  167. categoryMap.put("title", category.getTitle());
  168. categoryMap.put("sort", category.getSortOrder() != null ? category.getSortOrder() : 0);
  169. categoryMap.put("children", children);
  170. result.add(categoryMap);
  171. }
  172. return result;
  173. }
  174. /**
  175. * children 按 title 字典序排列(中文按拼音)
  176. */
  177. private void sortChildrenByTitle(List<Map<String, Object>> children) {
  178. if (ListUtils.isEmpty(children) || children.size() <= 1) {
  179. return;
  180. }
  181. Collator collator = Collator.getInstance(Locale.CHINA);
  182. collator.setStrength(Collator.PRIMARY);
  183. children.sort((a, b) -> collator.compare(
  184. StringUtils.defaultString((String) a.get("title")),
  185. StringUtils.defaultString((String) b.get("title"))));
  186. }
  187. /**
  188. * 解析模块所属分类,无效分类归入「其他」
  189. */
  190. private String resolveCategoryId(String categoryId, Map<String, List<Map<String, Object>>> grouped) {
  191. if (StringUtils.isNotBlank(categoryId) && grouped.containsKey(categoryId)) {
  192. return categoryId;
  193. }
  194. return MesIconsCategory.DEFAULT_ID;
  195. }
  196. /**
  197. * 构建单个功能模块数据
  198. */
  199. private Map<String, Object> buildModuleMap(MesIcons mi, String host) {
  200. Map<String, Object> map = MapUtils.newHashMap();
  201. map.put("title", mi.getTitle());
  202. map.put("mode", mi.getMode());
  203. map.put("img", buildModuleImageUrl(mi.getId(), host));
  204. return map;
  205. }
  206. /**
  207. * 获取模块图标完整 URL
  208. */
  209. private String buildModuleImageUrl(String bizKey, String host) {
  210. FileUpload fu = new FileUpload();
  211. fu.setBizKey(bizKey);
  212. fu.setBizType("mesIcons_image");
  213. List<FileUpload> finfo = fileUploadService.findList(fu);
  214. if (ListUtils.isNotEmpty(finfo)) {
  215. return host + finfo.get(0).getFileUrl();
  216. }
  217. return host;
  218. }
  219. }