HomeDataController.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. package jnpf.base.controller;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.google.common.collect.Lists;
  6. import io.swagger.v3.oas.annotations.Operation;
  7. import io.swagger.v3.oas.annotations.tags.Tag;
  8. import jnpf.base.ActionResult;
  9. import jnpf.base.UserInfo;
  10. import jnpf.base.entity.ModuleEntity;
  11. import jnpf.base.entity.SystemEntity;
  12. import jnpf.base.model.base.SystemBaeModel;
  13. import jnpf.base.model.home.ChartModel;
  14. import jnpf.base.model.home.HomeModel;
  15. import jnpf.base.model.home.MenuModel;
  16. import jnpf.base.model.home.TeamWorkModel;
  17. import jnpf.base.model.module.MenuSelectByUseNumVo;
  18. import jnpf.base.model.module.ModuleModel;
  19. import jnpf.base.service.*;
  20. import jnpf.constant.JnpfConst;
  21. import jnpf.flowable.model.task.TaskTo;
  22. import jnpf.flowable.model.template.TemplatePagination;
  23. import jnpf.message.model.message.MessageInfoVO;
  24. import jnpf.message.model.message.NoticeVO;
  25. import jnpf.message.service.MessageService;
  26. import jnpf.permission.model.authorize.AuthorizeVO;
  27. import jnpf.permission.service.AuthorizeService;
  28. import jnpf.permission.service.RoleService;
  29. import jnpf.util.JsonUtil;
  30. import jnpf.util.StringUtil;
  31. import jnpf.util.UserProvider;
  32. import jnpf.util.context.RequestContext;
  33. import jnpf.workflow.service.TaskApi;
  34. import jnpf.workflow.service.TemplateApi;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.web.bind.annotation.GetMapping;
  37. import org.springframework.web.bind.annotation.RequestMapping;
  38. import org.springframework.web.bind.annotation.RestController;
  39. import java.text.SimpleDateFormat;
  40. import java.time.LocalDate;
  41. import java.time.format.DateTimeFormatter;
  42. import java.util.*;
  43. import java.util.stream.Collectors;
  44. import java.util.stream.IntStream;
  45. /**
  46. * 控制台首页数据
  47. *
  48. * @author JNPF开发平台组
  49. * @version v6.0.0
  50. * @copyright 引迈信息技术有限公司
  51. * @date 2025/4/1 11:51:02
  52. */
  53. @Tag(name = "控制台首页数据", description = "HomeDataController")
  54. @RestController
  55. @RequestMapping("/api/system/HomeData")
  56. public class HomeDataController {
  57. private static final String NO1_WELCOME = "welcome";
  58. private static final String NO2_BANNER = "banner";
  59. private static final String NO3_WORK_FLOW = "workFlow";
  60. private static final String NO4_TEAMWORK = "teamwork";
  61. private static final String NO5_NOTICE = "notice";
  62. private static final String NO6_MESSAGE = "message";
  63. private static final String NO7_LATELY_USE = "latelyUse";
  64. private static final String NO8_COMMON_USE = "commonUse";
  65. private static final String NO9_FAVORITES = "favorites";
  66. private static final String N10_SYSTEM = "system";
  67. private static final String NO11_PIE_CHART = "pieChart";
  68. private static final String NO12_COLUMN_CHART = "columnChart";
  69. private static final String NO13_SERVER = "server";
  70. private static final String NO14_HELP = "help";
  71. @Autowired
  72. private TaskApi taskApi;
  73. @Autowired
  74. private TemplateApi templateApi;
  75. @Autowired
  76. private AuthorizeService authorizeService;
  77. @Autowired
  78. private MessageService messageService;
  79. @Autowired
  80. private SystemService systemService;
  81. @Autowired
  82. private RoleService roleService;
  83. @Autowired
  84. private ModuleUseNumService moduleUseNumService;
  85. @Autowired
  86. private ModuleDataService moduleDataService;
  87. @Autowired
  88. private SysconfigService sysConfigApi;
  89. @Autowired
  90. private ModuleService moduleService;
  91. @Operation(summary = "首页数据")
  92. @GetMapping
  93. public ActionResult get() {
  94. UserInfo userInfo = UserProvider.getUser();
  95. List<HomeModel> list = new ArrayList<>();
  96. AuthorizeVO authorize = authorizeService.getAuthorizeByUser(false);
  97. List<SystemEntity> sysListAll = systemService.getList();
  98. List<ModuleEntity> allMenu = moduleService.getList();
  99. Map<String, String> sysMap = sysListAll.stream().collect(Collectors.toMap(SystemEntity::getId, SystemEntity::getEnCode));
  100. List<ModuleModel> moduleList = authorize.getModuleList();
  101. List<String> authMenuList = moduleList.stream().filter(t -> JnpfConst.WEB.equals(t.getCategory()))
  102. .map(ModuleModel::getId).collect(Collectors.toList());
  103. Boolean iaAdmin = userInfo.getIsAdministrator();//超管
  104. Boolean isManageRole = userInfo.getIsManageRole();
  105. Boolean isDevRole = userInfo.getIsDevRole();
  106. boolean isFlowEnabled = Objects.equals(userInfo.getWorkflowEnabled(), 1);
  107. boolean isTeamEnabled = moduleList.stream().anyMatch(t -> JnpfConst.TEAMWORK_MODULE.contains(t.getEnCode()) && JnpfConst.WEB.equals(t.getCategory()));
  108. //1-欢迎语
  109. list.add(new HomeModel(NO1_WELCOME, 1, null));
  110. //2-banner
  111. if (isManageRole || isDevRole || iaAdmin) {
  112. list.add(new HomeModel(NO2_BANNER, 1, null));
  113. } else {
  114. list.add(new HomeModel(NO2_BANNER, 0, null));
  115. }
  116. //3-流程数据
  117. if (isFlowEnabled) {
  118. SystemEntity flowSys = systemService.getInfoByEnCode(JnpfConst.WORK_FLOW_CODE);
  119. List<ModuleModel> flowMenuList = moduleList.stream().filter(t -> t.getSystemId().equals(flowSys.getId())).collect(Collectors.toList());
  120. setFlow(flowMenuList, list);
  121. } else {
  122. list.add(new HomeModel(NO3_WORK_FLOW, 0, null));
  123. }
  124. //4-协作数据
  125. if (isTeamEnabled) {
  126. SystemEntity teamSys = systemService.getInfoByEnCode(JnpfConst.TEAMWORK_CODE);
  127. List<ModuleModel> teamworkList = moduleList.stream().filter(t -> t.getSystemId().equals(teamSys.getId())).collect(Collectors.toList());
  128. setTeamwork(teamworkList, list);
  129. } else {
  130. list.add(new HomeModel(NO4_TEAMWORK, 0, null));
  131. }
  132. //5-公告
  133. List<NoticeVO> noticeList = JsonUtil.getJsonToList(messageService.getNoticeList(new ArrayList<>()), NoticeVO.class);
  134. if (noticeList.size() > 0) {
  135. noticeList = Lists.partition(noticeList, 5).get(0);
  136. }
  137. list.add(new HomeModel(NO5_NOTICE, 1, noticeList));
  138. //6-消息
  139. List<MessageInfoVO> messageList = messageService.getUserMessageList();
  140. list.add(new HomeModel(NO6_MESSAGE, 1, messageList));
  141. //7-最近使用
  142. List<Object> menuNum = new ArrayList<>();
  143. List<MenuSelectByUseNumVo> menuLatelyList = moduleUseNumService.getMenuUseNum(1, authMenuList, allMenu);
  144. for (MenuSelectByUseNumVo item : menuLatelyList) {
  145. MenuModel menuModel = JsonUtil.getJsonToBean(item, MenuModel.class);
  146. setMenuModel(menuModel, sysMap, menuNum);
  147. }
  148. HomeModel latelyModel = HomeModel.builder().code(NO7_LATELY_USE).enable(1).appList(menuNum).flowEnabled(isFlowEnabled).build();
  149. if (isFlowEnabled) {
  150. List<Object> flowNum = new ArrayList<>(templateApi.getMenuUseNum(1, authorize.getFlowIdList()));
  151. latelyModel.setFlowList(flowNum);
  152. }
  153. list.add(latelyModel);
  154. //8-最近常用
  155. List<Object> menuUseNum = new ArrayList<>();
  156. List<MenuSelectByUseNumVo> menuComList = moduleUseNumService.getMenuUseNum(0, authMenuList, allMenu);
  157. for (MenuSelectByUseNumVo item : menuComList) {
  158. MenuModel menuModel = JsonUtil.getJsonToBean(item, MenuModel.class);
  159. setMenuModel(menuModel, sysMap, menuUseNum);
  160. }
  161. HomeModel commonUseModel = HomeModel.builder().code(NO8_COMMON_USE).enable(1).appList(menuUseNum).flowEnabled(isFlowEnabled).build();
  162. if (isFlowEnabled) {
  163. List<Object> flowUseNum = new ArrayList<>(templateApi.getMenuUseNum(0, authorize.getFlowIdList()));
  164. commonUseModel.setFlowList(flowUseNum);
  165. }
  166. list.add(commonUseModel);
  167. //9-我的收藏
  168. List<Object> favoritesMenuNum = new ArrayList<>();
  169. List<ModuleModel> favoritesList = moduleDataService.getFavoritesList(moduleList);
  170. for (ModuleModel item : favoritesList) {
  171. MenuModel menuModel = JsonUtil.getJsonToBean(item, MenuModel.class);
  172. setMenuModel(menuModel, sysMap, favoritesMenuNum);
  173. }
  174. HomeModel favoritesModel = HomeModel.builder().code(NO9_FAVORITES).enable(1).appList(favoritesMenuNum).flowEnabled(isFlowEnabled).build();
  175. if (isFlowEnabled || iaAdmin) {
  176. TemplatePagination pagination = new TemplatePagination();
  177. pagination.setPageSize(10000);
  178. pagination.setCategory("commonFlow");
  179. pagination.setIsLaunch(1);
  180. pagination.setAuthorize(authorize);
  181. List<Object> favoritesNum = new ArrayList<>(templateApi.getCommonList(pagination));
  182. favoritesModel.setFlowList(favoritesNum);
  183. }
  184. list.add(favoritesModel);
  185. //10-我的应用
  186. List<SystemBaeModel> systemList = authorize.getSystemList().stream().filter(t -> !Objects.equals(t.getIsMain(), 1)).collect(Collectors.toList());
  187. list.add(new HomeModel(N10_SYSTEM, 1, systemList));
  188. if (isManageRole || iaAdmin) {
  189. //11-饼图
  190. Map<String, Integer> roleCount = roleService.roleUserCount();
  191. List<ChartModel> roleCountList = roleCount.entrySet().stream().map(entry -> new ChartModel(entry.getKey(), entry.getValue())).collect(Collectors.toList());
  192. list.add(new HomeModel(NO11_PIE_CHART, 1, roleCountList));
  193. //12-柱形图
  194. setColumnChart(list);
  195. //13-服务器信息
  196. list.add(new HomeModel(NO13_SERVER, 1, null));
  197. } else {
  198. list.add(new HomeModel(NO11_PIE_CHART, 0, null));
  199. list.add(new HomeModel(NO12_COLUMN_CHART, 0, null));
  200. list.add(new HomeModel(NO13_SERVER, 0, null));
  201. }
  202. String help = sysConfigApi.getValueByKey(NO14_HELP);
  203. if (StringUtil.isNotBlank(help)) {
  204. JSONObject jsonObject = JSON.parseObject(help);
  205. list.add(new HomeModel(NO14_HELP, 1, jsonObject.get("java")));
  206. } else {
  207. list.add(new HomeModel(NO14_HELP, 0, null));
  208. }
  209. return ActionResult.success(list);
  210. }
  211. @Operation(summary = "首页数据")
  212. @GetMapping("/app")
  213. public ActionResult getApp() {
  214. List<HomeModel> list = new ArrayList<>();
  215. AuthorizeVO authorize = authorizeService.getAuthorize(false, RequestContext.getAppCode(), 0, false);
  216. List<SystemEntity> sysListAll = systemService.getList();
  217. List<ModuleEntity> allMenu = moduleService.getList();
  218. Map<String, String> sysMap = sysListAll.stream().collect(Collectors.toMap(SystemEntity::getId, SystemEntity::getEnCode));
  219. List<ModuleModel> moduleList = authorize.getModuleList();
  220. List<String> authMenuList = moduleList.stream().filter(t -> JnpfConst.APP.equals(t.getCategory()))
  221. .map(ModuleModel::getId).collect(Collectors.toList());
  222. boolean isFlowEnabled = moduleList.stream().anyMatch(t -> JnpfConst.MODULE_CODE.contains(t.getEnCode()) && JnpfConst.APP.equals(t.getCategory()));
  223. //7-最近使用
  224. List<Object> menuNum = new ArrayList<>();
  225. List<MenuSelectByUseNumVo> menuLatelyList = moduleUseNumService.getMenuUseNum(1, authMenuList, allMenu);
  226. for (MenuSelectByUseNumVo item : menuLatelyList) {
  227. MenuModel menuModel = JsonUtil.getJsonToBean(item, MenuModel.class);
  228. setMenuModel(menuModel, sysMap, menuNum);
  229. }
  230. HomeModel latelyModel = HomeModel.builder().code(NO7_LATELY_USE).enable(1).appList(menuNum).flowEnabled(isFlowEnabled).build();
  231. List<Object> flowNum = new ArrayList<>(templateApi.getMenuUseNum(1, authorize.getFlowIdList()));
  232. latelyModel.setFlowList(flowNum);
  233. list.add(latelyModel);
  234. //8-最近常用
  235. List<Object> menuUseNum = new ArrayList<>();
  236. List<MenuSelectByUseNumVo> menuComList = moduleUseNumService.getMenuUseNum(0, authMenuList, allMenu);
  237. for (MenuSelectByUseNumVo item : menuComList) {
  238. MenuModel menuModel = JsonUtil.getJsonToBean(item, MenuModel.class);
  239. setMenuModel(menuModel, sysMap, menuUseNum);
  240. }
  241. HomeModel commonUseModel = HomeModel.builder().code(NO8_COMMON_USE).enable(1).appList(menuUseNum).flowEnabled(isFlowEnabled).build();
  242. List<Object> flowUseNum = new ArrayList<>(templateApi.getMenuUseNum(0, authorize.getFlowIdList()));
  243. commonUseModel.setFlowList(flowUseNum);
  244. list.add(commonUseModel);
  245. //9-我的收藏
  246. List<Object> favoritesMenuNum = new ArrayList<>();
  247. List<ModuleModel> favoritesList = moduleDataService.getFavoritesList(moduleList);
  248. for (ModuleModel item : favoritesList) {
  249. MenuModel menuModel = JsonUtil.getJsonToBean(item, MenuModel.class);
  250. setMenuModel(menuModel, sysMap, favoritesMenuNum);
  251. }
  252. HomeModel favoritesModel = HomeModel.builder().code(NO9_FAVORITES).enable(1).appList(favoritesMenuNum).flowEnabled(isFlowEnabled).build();
  253. SystemEntity infoByEnCode = systemService.getInfoByEnCode(RequestContext.getAppCode());
  254. TemplatePagination pagination = new TemplatePagination();
  255. pagination.setPageSize(10000);
  256. pagination.setCategory("commonFlow");
  257. pagination.setIsLaunch(1);
  258. pagination.setSystemId(infoByEnCode.getId());
  259. List<Object> favoritesNum = new ArrayList<>(templateApi.getCommonList(pagination));
  260. favoritesModel.setFlowList(favoritesNum);
  261. list.add(favoritesModel);
  262. return ActionResult.success(list);
  263. }
  264. /**
  265. * 菜单信息补充
  266. *
  267. * @param menuModel
  268. * @param sysMap
  269. * @param list
  270. */
  271. private static void setMenuModel(MenuModel menuModel, Map<String, String> sysMap, List<Object> list) {
  272. JSONObject propertyJSON = JSONObject.parseObject(Optional.of(menuModel.getPropertyJson()).orElse("{}"));
  273. menuModel.setIconBackground(propertyJSON.getString("iconBackgroundColor"));
  274. List<String> appComModule = new ArrayList<>();
  275. appComModule.addAll(JnpfConst.APP_CONFIG_MODULE);
  276. appComModule.addAll(JnpfConst.ONLINE_DEV_MODULE);
  277. if (StringUtil.isEmpty(menuModel.getSystemCode())) {
  278. menuModel.setSystemCode(sysMap.get(menuModel.getSystemId()));
  279. }
  280. if (appComModule.contains(menuModel.getEnCode())) {
  281. menuModel.setIsBackend(1);
  282. } else {
  283. menuModel.setIsBackend(0);
  284. }
  285. list.add(menuModel);
  286. }
  287. /**
  288. * 柱形图数据
  289. *
  290. * @param list
  291. */
  292. private void setColumnChart(List<HomeModel> list) {
  293. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  294. List<String> dateList = IntStream.rangeClosed(0, 30)
  295. .mapToObj(i -> LocalDate.now().minusDays(30 - i))
  296. .map(formatter::format)
  297. .collect(Collectors.toList());
  298. List<String> category = dateList.stream().map(t -> t.substring(5)).collect(Collectors.toList());
  299. List<SystemEntity> allSysList = systemService.getList();
  300. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  301. Map<String, List<SystemEntity>> createDate = allSysList.stream()
  302. .collect(Collectors.groupingBy(obj -> sdf.format(obj.getCreatorTime())));
  303. Map<String, List<SystemEntity>> updateDate = allSysList.stream()
  304. .collect(Collectors.groupingBy(obj -> Optional.ofNullable(obj.getLastModifyTime()).map(sdf::format).orElse("N/A")));
  305. List<Integer> createData = new ArrayList<>();
  306. List<Integer> updateData = new ArrayList<>();
  307. for (String t : dateList) {
  308. createData.add(CollectionUtil.isEmpty(createDate.get(t)) ? 0 : createDate.get(t).size());
  309. updateData.add(CollectionUtil.isEmpty(updateDate.get(t)) ? 0 : updateDate.get(t).size());
  310. }
  311. List<ChartModel> listChart = new ArrayList<>();
  312. ChartModel createModel = new ChartModel();
  313. createModel.setName("创建");
  314. createModel.setData(createData);
  315. createModel.setCategory(category);
  316. listChart.add(createModel);
  317. ChartModel updateModel = new ChartModel();
  318. updateModel.setName("修改");
  319. updateModel.setData(updateData);
  320. updateModel.setCategory(category);
  321. listChart.add(updateModel);
  322. list.add(new HomeModel(NO12_COLUMN_CHART, 1, listChart));
  323. }
  324. /**
  325. * 添加流程数据
  326. *
  327. * @param moduleList
  328. * @param list
  329. */
  330. private void setFlow(List<ModuleModel> moduleList, List<HomeModel> list) {
  331. List<TeamWorkModel> flowData = new ArrayList<>();
  332. List<ModuleModel> flowMenu = moduleList.stream().filter(t -> JnpfConst.MODULE_CODE.contains(t.getEnCode())
  333. && !JnpfConst.WORK_FLOW_CODE.equals(t.getEnCode())).collect(Collectors.toList());
  334. if (CollectionUtil.isNotEmpty(flowMenu)) {
  335. TaskTo flowModel = new TaskTo();
  336. flowModel.setModuleList(moduleList);
  337. TaskTo taskTo = taskApi.getFlowTodoCount(flowModel);
  338. for (ModuleModel menu : flowMenu) {
  339. TeamWorkModel model = JsonUtil.getJsonToBean(menu, TeamWorkModel.class);
  340. switch (menu.getEnCode()) {
  341. case JnpfConst.WORK_FLOWLAUNCH:
  342. model.setCount(taskTo.getFlowLaunch());
  343. break;
  344. case JnpfConst.WORK_FLOWSIGN:
  345. model.setCount(taskTo.getFlowToSign());
  346. break;
  347. case JnpfConst.WORK_FLOWTODO:
  348. model.setCount(taskTo.getFlowTodo());
  349. break;
  350. case JnpfConst.WORK_FLOWDOING:
  351. model.setCount(taskTo.getFlowDoing());
  352. break;
  353. case JnpfConst.WORK_FLOWDONE:
  354. model.setCount(taskTo.getFlowDone());
  355. break;
  356. case JnpfConst.WORK_FLOWCIRCULATE:
  357. model.setCount(taskTo.getFlowCirculate());
  358. break;
  359. default:
  360. break;
  361. }
  362. flowData.add(model);
  363. }
  364. list.add(new HomeModel(NO3_WORK_FLOW, 1, flowData));
  365. } else {
  366. list.add(new HomeModel(NO3_WORK_FLOW, 0, flowData));
  367. }
  368. }
  369. /**
  370. * 添加协作数据
  371. *
  372. * @param moduleList
  373. * @param list
  374. */
  375. private void setTeamwork(List<ModuleModel> moduleList, List<HomeModel> list) {
  376. List<TeamWorkModel> teamworkData = new ArrayList<>();
  377. List<ModuleModel> flowMenu = moduleList.stream().filter(t -> JnpfConst.TEAMWORK_MODULE.contains(t.getEnCode())
  378. && !JnpfConst.TEAMWORK_CODE.equals(t.getEnCode())).collect(Collectors.toList());
  379. if (CollectionUtil.isNotEmpty(flowMenu)) {
  380. teamworkData.addAll(JsonUtil.getJsonToList(flowMenu, TeamWorkModel.class));
  381. list.add(new HomeModel(NO4_TEAMWORK, 1, teamworkData));
  382. } else {
  383. list.add(new HomeModel(NO4_TEAMWORK, 0, teamworkData));
  384. }
  385. }
  386. }