build / build-push (push) Successful in 13m48s
- AppIconKeyService/AppIconEntryVo(新):icon_key/icon_color 资产库键值读取 - UserController:getUserApp 返回体加图标键注入(withIconKeys) - UserSettingsController:用户设置应用列表注入 iconKey/iconColor(未配置 null 走原 img 回退) - UsedAppController/UsedAppServiceImpl:常用应用列表同口径注入 依据:根目录《AppIcon资产库落地-执行报告-20261004.md》P2 数据侧/管理端
164 lines
6.9 KiB
Java
164 lines
6.9 KiB
Java
package com.yunhai.userhome.controller.api;
|
||
|
||
import com.yunhai.platform.utils.model.BoaApp;
|
||
import com.yunhai.platform.utils.model.BoaAppType;
|
||
import com.yunhai.platform.utils.model.BoaUser;
|
||
import com.yunhai.userhome.config.Config;
|
||
import com.yunhai.userhome.entity.UsedApp;
|
||
import com.yunhai.userhome.model.AppIconEntryVo;
|
||
import com.yunhai.userhome.model.SetType;
|
||
import com.yunhai.userhome.service.AppIconKeyService;
|
||
import com.yunhai.userhome.service.AppRemoteService;
|
||
import com.yunhai.userhome.service.UsedAppService;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.web.bind.annotation.GetMapping;
|
||
import org.springframework.web.bind.annotation.PostMapping;
|
||
import org.springframework.web.bind.annotation.RequestBody;
|
||
import org.springframework.web.bind.annotation.RequestMapping;
|
||
import org.springframework.web.bind.annotation.RequestParam;
|
||
import org.springframework.web.bind.annotation.RestController;
|
||
|
||
import java.util.ArrayList;
|
||
import java.util.Date;
|
||
import java.util.HashMap;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
import java.util.stream.Collectors;
|
||
|
||
/**
|
||
* 常用应用接口(CAS 登录态,路径 {@code /{platform}/usedapp/}),对齐旧 UserHome契约
|
||
*/
|
||
@RestController
|
||
@RequestMapping(value = Config.API_PATH + "/usedapp/")
|
||
public class UsedAppController {
|
||
|
||
@Autowired
|
||
private UsedAppService usedAppService;
|
||
|
||
@Autowired
|
||
private AppRemoteService appRemoteService;
|
||
|
||
@Autowired
|
||
private AppIconKeyService appIconKeyService;
|
||
|
||
/**
|
||
* 取当前角色生效的常用应用(BoaApp 详情,按 appIds 顺序)。
|
||
*
|
||
* @param roleType 角色类型
|
||
* @param schId 学校ID(0 时按用户主学校/主归属组推断)
|
||
* @param isSch 是否学校级(超管设置学校常用时 true,isSch 时 uid=schId)
|
||
*/
|
||
@GetMapping("getUsedApp")
|
||
public List<BoaApp> getUsedApp(BoaUser authUserWithDept, Integer roleType, Integer schId,
|
||
@RequestParam(name = "isSch", defaultValue = "false") Boolean isSch) {
|
||
if (schId == null || schId == 0) {
|
||
schId = resolveSchId(authUserWithDept);
|
||
}
|
||
Integer uid = authUserWithDept.getId();
|
||
if (authUserWithDept.getType() != null && authUserWithDept.getType() == 1) {
|
||
isSch = false; // 超管设置学校常用时走用户维度
|
||
}
|
||
if (isSch) {
|
||
uid = schId;
|
||
}
|
||
return usedAppService.getUsedAppList(schId, uid, roleType, authUserWithDept);
|
||
}
|
||
|
||
/**
|
||
* 覆盖式保存常用应用(≤8 由前端控制)。
|
||
* 参数:appIds(逗号分隔)、type(0系统/1学校/2用户)、roleType、schId;超管强制 type=0。
|
||
*/
|
||
@PostMapping("saveUsedApp")
|
||
public void saveUsedApp(BoaUser authUserWithDept, @RequestBody Map<String, Object> params) {
|
||
String appIds = params.get("appIds") == null ? "" : String.valueOf(params.get("appIds"));
|
||
Integer type = params.get("type") == null ? SetType.USER.id()
|
||
: Integer.valueOf(String.valueOf(params.get("type")));
|
||
Integer roleType = params.get("roleType") == null ? -1
|
||
: Integer.valueOf(String.valueOf(params.get("roleType")));
|
||
Integer schId = params.get("schId") == null ? 0
|
||
: Integer.valueOf(String.valueOf(params.get("schId")));
|
||
if (schId == 0) {
|
||
schId = resolveSchId(authUserWithDept);
|
||
}
|
||
|
||
UsedApp usedApp = new UsedApp();
|
||
usedApp.setAppIds(appIds);
|
||
usedApp.setType(SetType.byId(type));
|
||
usedApp.setRoleType(roleType);
|
||
usedApp.setCDate(new Date());
|
||
usedApp.setCId(authUserWithDept.getId());
|
||
usedApp.setSchId(schId);
|
||
usedApp.setSetId(usedApp.getType() == SetType.SCHOOL ? schId : authUserWithDept.getId());
|
||
if (authUserWithDept.getType() != null && authUserWithDept.getType() == 1) {
|
||
// 超管保存 → 系统级
|
||
usedApp.setType(SetType.BASE);
|
||
usedApp.setSetId(authUserWithDept.getId());
|
||
}
|
||
usedAppService.save(usedApp);
|
||
}
|
||
|
||
/** 用户级常用(type=USER, roleType=-1)精简映射(id/name/icon/url)。 */
|
||
@GetMapping("getUsedAppById")
|
||
public List<Map<String, Object>> getUsedAppById(BoaUser authUserWithDept) {
|
||
return usedAppService.getUsedAppMapList(authUserWithDept, authUserWithDept.getId());
|
||
}
|
||
|
||
/** 用户级保存常用(type=USER, roleType=-1)。 */
|
||
@PostMapping("saveUsedAppById")
|
||
public void saveUsedAppById(BoaUser authUserWithDept, @RequestBody Map<String, Object> params) {
|
||
String appIds = params.get("appIds") == null ? "" : String.valueOf(params.get("appIds"));
|
||
UsedApp usedApp = new UsedApp();
|
||
usedApp.setAppIds(appIds);
|
||
usedApp.setType(SetType.USER);
|
||
usedApp.setRoleType(-1);
|
||
usedApp.setCDate(new Date());
|
||
usedApp.setCId(authUserWithDept.getId());
|
||
usedApp.setSetId(authUserWithDept.getId());
|
||
usedAppService.saveUserId(usedApp);
|
||
}
|
||
|
||
/** 按 appIds(逗号分隔)取应用精简映射(id/name/icon/url/iconKey/iconColor),在全集中查找。 */
|
||
@GetMapping("getAppByIds")
|
||
public List<Map<String, Object>> getAppByIds(BoaUser authUserWithDept, String appIds) {
|
||
List<Map<String, Object>> list = new ArrayList<>();
|
||
if (appIds == null || appIds.trim().isEmpty()) {
|
||
return list;
|
||
}
|
||
List<BoaApp> appList = appRemoteService.getUserApps(authUserWithDept).stream()
|
||
.filter(t -> t.getApps() != null)
|
||
.flatMap(t -> t.getApps().stream())
|
||
.collect(Collectors.toList());
|
||
for (String appId : appIds.split(",")) {
|
||
try {
|
||
Integer id = Integer.parseInt(appId.trim());
|
||
appList.stream().filter(a -> id.equals(a.getId())).findFirst().ifPresent(app -> {
|
||
Map<String, Object> m = new HashMap<>();
|
||
m.put("id", app.getId());
|
||
m.put("name", app.getName());
|
||
m.put("icon", app.getIcon());
|
||
m.put("url", app.getWebAddr());
|
||
// 矢量图标键(AppIcon 通道;未配置为 null,前端按空走原 img 回退)
|
||
AppIconEntryVo iconEntry = appIconKeyService.byId(app.getId());
|
||
m.put("iconKey", iconEntry == null ? null : iconEntry.getIconKey());
|
||
m.put("iconColor", iconEntry == null ? null : iconEntry.getIconColor());
|
||
list.add(m);
|
||
});
|
||
} catch (NumberFormatException ignore) {
|
||
// 脏数据容错
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
|
||
/** schId=0 时推断:主学校 → 主归属组(bureau)→ 0。 */
|
||
private Integer resolveSchId(BoaUser user) {
|
||
if (user.getSchool() != null) {
|
||
return user.getSchool().getId();
|
||
}
|
||
if (user.getBureau() != null) {
|
||
return user.getBureau().getId();
|
||
}
|
||
return 0;
|
||
}
|
||
}
|