diff --git a/src/main/java/com/xdap/self_development/controller/DataEntryEngineModelController.java b/src/main/java/com/xdap/self_development/controller/DataEntryEngineModelController.java index 424c58c..f97f0f1 100644 --- a/src/main/java/com/xdap/self_development/controller/DataEntryEngineModelController.java +++ b/src/main/java/com/xdap/self_development/controller/DataEntryEngineModelController.java @@ -128,9 +128,11 @@ public class DataEntryEngineModelController { * @return 分页查询结果 */ @GetMapping("/selectVersionByPage") - public Response selectVersionByConditionPage() { + public Response selectVersionByConditionPage( + @NotBlank(message = "用户不能为空") @RequestParam String userId + ) { PageResultDTO tPageResultDTO = - entryEngineModelService.selectVersionByConditionPage(); + entryEngineModelService.selectVersionByConditionPage(userId); return Response.ok().data(tPageResultDTO); } } diff --git a/src/main/java/com/xdap/self_development/controller/PermissionController.java b/src/main/java/com/xdap/self_development/controller/PermissionController.java index 3132b6b..82998bf 100644 --- a/src/main/java/com/xdap/self_development/controller/PermissionController.java +++ b/src/main/java/com/xdap/self_development/controller/PermissionController.java @@ -3,11 +3,14 @@ package com.xdap.self_development.controller; import com.definesys.mpaas.common.http.Response; import com.xdap.self_development.controller.request.ModelRolesRequest; +import com.xdap.self_development.controller.request.PreAndRolePageRequest; import com.xdap.self_development.controller.request.RolePerJoinRequest; import com.xdap.self_development.controller.request.UserRoleBindingRequest; +import com.xdap.self_development.domain.dto.PageResultDTO; import com.xdap.self_development.domain.pojo.ModelRolesPojo; import com.xdap.self_development.domain.view.MenuListView; import com.xdap.self_development.domain.view.MenuParamView; +import com.xdap.self_development.domain.view.RoleInfoView; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.service.ModelMenuPermissionService; import com.xdap.self_development.service.ModelRoleService; @@ -15,6 +18,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotBlank; import java.util.HashMap; import java.util.List; @@ -191,4 +195,24 @@ public class PermissionController { return Response.ok().data(map); } + /** + * 根据条件获取权限和角色 + * + * @param request 条件 + * @return 前置角色和当前角色映射 + */ + @PostMapping("/getPreAndRoleByCondition") + public Response getPreAndRoleByCondition( + @RequestBody PreAndRolePageRequest request + ) { + PageResultDTO result = modelRoleService.getPreAndRoleByCondition(request); + return Response.ok().data(result); + } + + @GetMapping("/exportPreAndRole") + public void exportPreAndRole( + HttpServletResponse response + ) { + modelRoleService.writePreAndRole(response); + } } diff --git a/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java b/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java index 8f69997..c3d790c 100644 --- a/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java +++ b/src/main/java/com/xdap/self_development/controller/form/ParameterForm.java @@ -66,7 +66,6 @@ public class ParameterForm { /** * 部门 */ - @NotBlank(message = "部门不能为空") private String department; /** diff --git a/src/main/java/com/xdap/self_development/controller/request/PreAndRolePageRequest.java b/src/main/java/com/xdap/self_development/controller/request/PreAndRolePageRequest.java new file mode 100644 index 0000000..51126b1 --- /dev/null +++ b/src/main/java/com/xdap/self_development/controller/request/PreAndRolePageRequest.java @@ -0,0 +1,17 @@ +package com.xdap.self_development.controller.request; + +import lombok.Data; + +import javax.validation.constraints.Min; + +@Data +public class PreAndRolePageRequest { + @Min(message = "页码最小为1", value = 1) + private Integer pageNum; + @Min(message = "页大小最小为1", value = 1) + private Integer pageSize; + + private String username = ""; + private String department = ""; + private String roleName = ""; +} diff --git a/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingItem.java b/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingItem.java new file mode 100644 index 0000000..cc5ebea --- /dev/null +++ b/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingItem.java @@ -0,0 +1,11 @@ +package com.xdap.self_development.controller.request; + +import lombok.Data; + +@Data +public class UserRoleBindingItem { + // 用户或部门id + private String userOrDeptId; + // 是否为部门id + private Integer isDept; +} diff --git a/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingRequest.java b/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingRequest.java index 3c44f4f..3eb44c4 100644 --- a/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingRequest.java +++ b/src/main/java/com/xdap/self_development/controller/request/UserRoleBindingRequest.java @@ -8,6 +8,5 @@ import java.util.List; public class UserRoleBindingRequest { //角色ID 用户ID 用户是否是部门0:用户 1部门 private String roleId; - private List userOrDeptIds; - private Integer isDept; + private List userOrDept; } diff --git a/src/main/java/com/xdap/self_development/domain/view/RoleAndPreView.java b/src/main/java/com/xdap/self_development/domain/view/RoleAndPreView.java new file mode 100644 index 0000000..1e15a4f --- /dev/null +++ b/src/main/java/com/xdap/self_development/domain/view/RoleAndPreView.java @@ -0,0 +1,32 @@ +package com.xdap.self_development.domain.view; + +import com.definesys.mpaas.query.annotation.SQL; +import com.definesys.mpaas.query.annotation.SQLQuery; +import lombok.Data; + +@SQLQuery(value = { + @SQL(view = "selectRoleAndPerInfo", + sql = "SELECT r.id AS roleId, r.role_name AS roleName, r.role_name AS role_Name, r.role_code AS roleCode, r.role_description AS roleDescription, dur.user_or_dep AS userOrDep, dur.user_or_dep AS user_Or_Dep , dur.is_dep AS isDep, mp.permission_path AS permissionPath, mp.parameter_per as parameterPer FROM yfsjglpt_model_roles r LEFT JOIN yfsjglpt_model_dep_user_role dur ON r.id = dur.role_id LEFT JOIN yfsjglpt_model_role_permission rp ON dur.role_id = rp.role_id LEFT JOIN yfsjglpt_model_menu_parameter mp ON mp.id = rp.per_id WHERE r.is_enabled = 1 and dur.is_enable = 1 and (rp.is_enable is null or rp.is_enable = 1)") +}) +@Data +public class RoleAndPreView { + // 角色相关 + // 角色Id + private String roleId; + // 角色名称 + private String roleName; + // 角色描述 + private String roleDescription; + + // 关联相关 + // 用户或部门ID + private String userOrDep; + // 是否是部门,0:个人;1:部门 + private Integer isDep; + + // 权限相关 + // 参数权限 + private Integer parameterPer; + // 权限路径 + private String permissionPath; +} diff --git a/src/main/java/com/xdap/self_development/domain/view/RoleInfoView.java b/src/main/java/com/xdap/self_development/domain/view/RoleInfoView.java new file mode 100644 index 0000000..af54e1b --- /dev/null +++ b/src/main/java/com/xdap/self_development/domain/view/RoleInfoView.java @@ -0,0 +1,42 @@ +package com.xdap.self_development.domain.view; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class RoleInfoView { + // 角色Id + @ExcelIgnore + private String roleId; + // 角色名称 + @ExcelProperty("角色名称") + private String roleName; + // 成员姓名 + @ExcelProperty("成员姓名") + private String username; + // 成员工号 + @ExcelProperty("成员工号") + private String userNumber; + // 成员部门 + @ExcelProperty("成员部门") + private String department; + // 角色描述 + @ExcelProperty("角色描述") + private String roleDescription; + + // 成员Id + @ExcelIgnore + private String userId; + + // 成员部门Id + @ExcelIgnore + private String departmentId; + + // 查询权限 + @ExcelProperty("查询权限") + private String queryPerms; + // 编辑权限 + @ExcelProperty("编辑权限") + private String editPerms; +} diff --git a/src/main/java/com/xdap/self_development/domain/view/UserDeptItem.java b/src/main/java/com/xdap/self_development/domain/view/UserDeptItem.java new file mode 100644 index 0000000..aeec110 --- /dev/null +++ b/src/main/java/com/xdap/self_development/domain/view/UserDeptItem.java @@ -0,0 +1,11 @@ +package com.xdap.self_development.domain.view; + +import lombok.Data; + +import java.util.List; + +@Data +public class UserDeptItem { + private String username; + private List departmentIds; +} diff --git a/src/main/java/com/xdap/self_development/service/DataEntryEngineModelService.java b/src/main/java/com/xdap/self_development/service/DataEntryEngineModelService.java index f9f99f9..85f69ed 100644 --- a/src/main/java/com/xdap/self_development/service/DataEntryEngineModelService.java +++ b/src/main/java/com/xdap/self_development/service/DataEntryEngineModelService.java @@ -40,7 +40,7 @@ public interface DataEntryEngineModelService { DataEntryEngineModelPojo selectBymodelId(String modelID); - PageResultDTO selectVersionByConditionPage(); + PageResultDTO selectVersionByConditionPage(String userId); void delete(String modelId); diff --git a/src/main/java/com/xdap/self_development/service/ModelRoleService.java b/src/main/java/com/xdap/self_development/service/ModelRoleService.java index d47c0cf..4b626e6 100644 --- a/src/main/java/com/xdap/self_development/service/ModelRoleService.java +++ b/src/main/java/com/xdap/self_development/service/ModelRoleService.java @@ -2,13 +2,17 @@ package com.xdap.self_development.service; import com.xdap.self_development.controller.request.ModelRolesRequest; +import com.xdap.self_development.controller.request.PreAndRolePageRequest; import com.xdap.self_development.controller.request.RolePerJoinRequest; import com.xdap.self_development.controller.request.UserRoleBindingRequest; +import com.xdap.self_development.domain.dto.PageResultDTO; import com.xdap.self_development.domain.pojo.EngineParamDetailPojo; import com.xdap.self_development.domain.pojo.ModelRolesPojo; import com.xdap.self_development.domain.pojo.ParameterPojo; import com.xdap.self_development.domain.view.MenuParamView; +import com.xdap.self_development.domain.view.RoleInfoView; +import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotBlank; import java.util.HashMap; import java.util.List; @@ -56,4 +60,12 @@ public interface ModelRoleService { Map>> buildPermissionIndex( Set permissions ); + + PageResultDTO getPreAndRoleByCondition(PreAndRolePageRequest request); + + void updateUserRole(UserRoleBindingRequest request, int isDept); + + void writePreAndRole(HttpServletResponse response); + + List getPerAndRole(PreAndRolePageRequest request); } diff --git a/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java index c2e58b3..f10c8a9 100644 --- a/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/DataEntryEngineModelServiceImpl.java @@ -19,13 +19,11 @@ import com.xdap.self_development.domain.dto.PageResultDTO; import com.xdap.self_development.domain.enums.DistributeStatusEnum; import com.xdap.self_development.domain.enums.ParamValueVersionEnum; import com.xdap.self_development.domain.pojo.*; +import com.xdap.self_development.domain.view.MenuParamView; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.exception.ExcelImportException; import com.xdap.self_development.listener.EngineModelListener; -import com.xdap.self_development.service.DataEntryEngineModelService; -import com.xdap.self_development.service.EngineParamDetailService; -import com.xdap.self_development.service.ResponsiblePerService; -import com.xdap.self_development.service.XdapDeptUsersService; +import com.xdap.self_development.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.poi.ss.usermodel.IndexedColors; @@ -65,6 +63,8 @@ public class DataEntryEngineModelServiceImpl implements DataEntryEngineModelServ private EngineParamDetailService engineParamDetailService; @Resource private MpaasQueryFactory sw; + @Resource + private ModelRoleService modelRoleService; private int page = 1; private int size = 10; @@ -303,10 +303,6 @@ public class DataEntryEngineModelServiceImpl implements DataEntryEngineModelServ engineParamDetailPojo.setCreationDate(Timestamp.valueOf(LocalDateTime.now())); engineParamDetailPojo.setIsDistributedRes(Objects.equals(parameter.getParameterSource(), "数据平台手工录入") ? 0 : 2); engineParamDetailPojo.setIsDistributedFilled(Objects.equals(parameter.getParameterSource(), "数据平台手工录入") ? 0 : 2); - //为每个参数生成默认责任人 - List personPojos = responsiblePerService.selectByDepName(parameter.getDepartment()); - if (ObjectUtils.isNotEmpty(personPojos)) { - } engineParamDetailPojos.add(engineParamDetailPojo); } @@ -377,14 +373,45 @@ public class DataEntryEngineModelServiceImpl implements DataEntryEngineModelServ * @return 分页结果DTO */ @Override - public PageResultDTO selectVersionByConditionPage() { + public PageResultDTO selectVersionByConditionPage(String userId) { + //todo + List menuParamViews = modelRoleService.selectPersByUser(userId); + boolean ycFlag = false; + boolean othFlag = false; + + for (MenuParamView item : menuParamViews) { + if (item.getPermissionPath().startsWith("竞品发动机数据") && !item.getPermissionPath().equals("竞品发动机数据审批流程")) { + othFlag = true; + continue; + } + if (item.getPermissionPath().startsWith("玉柴发动机数据") && !item.getPermissionPath().equals("玉柴发动机数据审批流程")) { + ycFlag = true; + continue; + } + if (ycFlag && othFlag) { + break; + } + } + + List list = bd.getBusinessDatabase() .viewQueryMode(true) .view("selectVersionByConditionPage") .doQuery(DataEntryEngineModelDto.class); PageResultDTO pageResultDTO = new PageResultDTO<>(); - pageResultDTO.setList(list); - pageResultDTO.setTotalCount(list.size()); + + boolean finalYcFlag = ycFlag; + boolean finalOthFlag = othFlag; + List collect = list.stream().filter(x -> { + if (finalYcFlag && Objects.equals(x.getYcOrOth(), "玉柴")) { + return true; + } + + return finalOthFlag && Objects.equals(x.getYcOrOth(), "竞品"); + }).collect(Collectors.toList()); + + pageResultDTO.setList(collect); + pageResultDTO.setTotalCount(collect.size()); return pageResultDTO; } diff --git a/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java index c539ee1..6e2876c 100644 --- a/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/EngineParamDetailServiceImpl.java @@ -189,6 +189,10 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { )); } + private static String nvl(Object obj) { + return obj == null ? "" : obj.toString(); + } + public Map> selectParamListByDetails(String modelID, Integer parameterVersion, String userId) { if (parameterVersion == null) { DataEntryEngineModelPojo engineModel = bd.getBusinessDatabase() @@ -199,6 +203,7 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { } parameterVersion = engineModel.getVersionNumber(); } + List pojoList = selectByIsUserId(modelID, parameterVersion, userId); AtomicInteger seq = new AtomicInteger(1); @@ -229,29 +234,37 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { DataEntryEngineModelPojo dataEntryEngineModelPojo = bd.getBusinessDatabase() .eq("id", modelID) .doQueryFirst(DataEntryEngineModelPojo.class); + if (dataEntryEngineModelPojo == null) { + throw new CommonException("未找到机型的数据"); + } //状态代号 - String productNumber = dataEntryEngineModelPojo.getProductNumber(); + String productNumber = nvl(dataEntryEngineModelPojo.getProductNumber()); //板块 - String plate = dataEntryEngineModelPojo.getPlate(); + String plate = nvl(dataEntryEngineModelPojo.getPlate()); //平台 - String platform = dataEntryEngineModelPojo.getPlatform(); + String platform = nvl(dataEntryEngineModelPojo.getPlatform()); //系列 - String series = dataEntryEngineModelPojo.getSeries(); + String series = nvl(dataEntryEngineModelPojo.getSeries()); //细分市场 - String marketSegment = dataEntryEngineModelPojo.getMarketSegment(); + String marketSegment = nvl(dataEntryEngineModelPojo.getMarketSegment()); //项目名称 - String projectName = dataEntryEngineModelPojo.getProjectName(); + String projectName = nvl(dataEntryEngineModelPojo.getProjectName()); //项目编号 - String projectNumber = dataEntryEngineModelPojo.getProjectNumber(); + String projectNumber = nvl(dataEntryEngineModelPojo.getProjectNumber()); //品牌 - String brand = dataEntryEngineModelPojo.getBrand(); + String brand = nvl(dataEntryEngineModelPojo.getBrand()); //排放 - String emission = dataEntryEngineModelPojo.getEmission(); - String burnType = dataEntryEngineModelPojo.getBurnType(); - String engineCapacity = dataEntryEngineModelPojo.getEngineCapacity(); - Date productionDate = dataEntryEngineModelPojo.getProductionDate(); - String manufacturerName = dataEntryEngineModelPojo.getManufacturerName(); - String manufacturerAbbreviation = dataEntryEngineModelPojo.getManufacturerAbbreviation(); + String emission = nvl(dataEntryEngineModelPojo.getEmission()); + String burnType = nvl(dataEntryEngineModelPojo.getBurnType()); + String engineCapacity = nvl(dataEntryEngineModelPojo.getEngineCapacity()); + String productionDateStr; + if (dataEntryEngineModelPojo.getProductionDate() != null) { + productionDateStr = new SimpleDateFormat("yyyy-MM-dd").format(dataEntryEngineModelPojo.getProductionDate()); + } else { + productionDateStr = ""; // 或者设置一个默认值 + } + String manufacturerName = nvl(dataEntryEngineModelPojo.getManufacturerName()); + String manufacturerAbbreviation = nvl(dataEntryEngineModelPojo.getManufacturerAbbreviation()); Set strings = new HashSet<>(); if ("玉柴".equals(dataEntryEngineModelPojo.getYcOrOth())) { strings.add("状态代号:" + productNumber); @@ -260,7 +273,7 @@ public class EngineParamDetailServiceImpl implements EngineParamDetailService { strings.add("品牌:" + brand); strings.add("厂家全称:" + manufacturerName); strings.add("厂家简称:" + manufacturerAbbreviation); - strings.add("生产日期:" + new SimpleDateFormat("yyyy-MM-dd").format(productionDate)); + strings.add("生产日期:" + productionDateStr); } strings.add("产品型号:" + dataEntryEngineModelPojo.getModelName()); strings.add("板块:" + plate); diff --git a/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java index 4bb5965..f37f22c 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ModelRoleServiceImpl.java @@ -1,15 +1,21 @@ package com.xdap.self_development.service.impl; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.definesys.mpaas.query.MpaasQuery; import com.xdap.api.moudle.department.pojo.entity.XdapDepartments; +import com.xdap.api.moudle.department.pojo.entity.XdapDeptUsers; import com.xdap.api.moudle.user.pojo.XdapUsers; import com.xdap.self_development.common.BusinessDatabase; -import com.xdap.self_development.controller.request.ModelRolesRequest; -import com.xdap.self_development.controller.request.RolePerJoinRequest; -import com.xdap.self_development.controller.request.UserRoleBindingRequest; +import com.xdap.self_development.controller.request.*; +import com.xdap.self_development.domain.dto.PageResultDTO; import com.xdap.self_development.domain.enums.ParamPermissionEnum; import com.xdap.self_development.domain.pojo.*; import com.xdap.self_development.domain.view.MenuParamView; +import com.xdap.self_development.domain.view.RoleAndPreView; +import com.xdap.self_development.domain.view.RoleInfoView; +import com.xdap.self_development.domain.view.UserDeptItem; import com.xdap.self_development.exception.CommonException; import com.xdap.self_development.service.ModelRoleService; import com.xdap.self_development.service.XdapDeptUsersService; @@ -20,6 +26,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.text.Collator; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -40,6 +51,9 @@ public class ModelRoleServiceImpl implements ModelRoleService { @Resource private XdapDeptUsersService xdapDeptUsersService; + @Resource + private ModelRoleService modelRoleService; + /** * 添加角色 * 根据请求参数添加新角色 @@ -274,38 +288,146 @@ public class ModelRoleServiceImpl implements ModelRoleService { } + private static List processPermissions(List perms) { + if (perms == null || perms.isEmpty()) { + return new ArrayList<>(); + } + + class PathInfo { + final String pathWithoutTrailingSlash; + final boolean hasTrailingSlash; + + PathInfo(String originalPath) { + this.hasTrailingSlash = originalPath.endsWith("/"); + this.pathWithoutTrailingSlash = hasTrailingSlash ? originalPath.substring(0, originalPath.length() - 1) : originalPath; + } + + String getOriginalPath() { + return pathWithoutTrailingSlash + (hasTrailingSlash ? "/" : ""); + } + } + + List pathInfos = perms.stream() + .filter(Objects::nonNull) + .map(PathInfo::new) + .collect(Collectors.toList()); + + Set permSetWithoutTrailingSlash = pathInfos.stream() + .map(info -> info.pathWithoutTrailingSlash) + .collect(Collectors.toSet()); + + List filteredPathInfos = pathInfos.stream() + .filter(info -> { + String currentPath = info.pathWithoutTrailingSlash; + int lastSlashIndex = currentPath.lastIndexOf('/'); + if (lastSlashIndex > 0) { + String parentPath = currentPath.substring(0, lastSlashIndex); + return !permSetWithoutTrailingSlash.contains(parentPath); + } + return true; + }) + .collect(Collectors.toList()); + + Map> groupedByParent = filteredPathInfos.stream() + .filter(info -> info.pathWithoutTrailingSlash.indexOf('/') >= 0) + .collect(Collectors.groupingBy(info -> { + String path = info.pathWithoutTrailingSlash; + int lastSlashIndex = path.lastIndexOf('/'); + return path.substring(0, lastSlashIndex); + })); + + List topLevelPerms = filteredPathInfos.stream() + .filter(info -> info.pathWithoutTrailingSlash.indexOf('/') < 0) + .map(info -> { + String formattedPath = info.pathWithoutTrailingSlash.replace('/', '-'); + return formattedPath + (info.hasTrailingSlash ? "/" : ""); + }) + .collect(Collectors.toList()); + + List result = new ArrayList<>(); + + for (Map.Entry> groupEntry : groupedByParent.entrySet()) { + String parentPath = groupEntry.getKey(); + List childInfos = groupEntry.getValue(); + + boolean anyHasTrailingSlash = childInfos.stream().anyMatch(info -> info.hasTrailingSlash); + + List leafNames = childInfos.stream() + .filter(info -> !info.hasTrailingSlash) + .map(info -> { + String path = info.pathWithoutTrailingSlash; + int lastSlashIndex = path.lastIndexOf('/'); + return path.substring(lastSlashIndex + 1); + }) + .collect(Collectors.toList()); + + String formattedParentPath = parentPath.replace('/', '-'); + + String finalPermString; + if (anyHasTrailingSlash) { + finalPermString = formattedParentPath + "/"; + } else { + if (!leafNames.isEmpty()) { + String joinedLeafNames = String.join("、", leafNames); + finalPermString = formattedParentPath + "-" + joinedLeafNames; + } else { + finalPermString = formattedParentPath + "/"; + } + } + result.add(finalPermString); + } + + result.addAll(topLevelPerms); + + Collections.sort(result); + + return result; + } + + private static RoleInfoView getRoleInfoView(Map.Entry> entry) { + List views = entry.getValue(); + + if (views == null || views.isEmpty()) { + return null; + } + + RoleInfoView firstView = views.get(0); + + List allEditPerms = views.stream() + .map(RoleInfoView::getEditPerms) + .filter(p -> p != null && !p.isEmpty()) + .collect(Collectors.toList()); + + List allQueryPerms = views.stream() + .map(RoleInfoView::getQueryPerms) + .filter(p -> p != null && !p.isEmpty()) + .collect(Collectors.toList()); + + List processedEditPerms = processPermissions(allEditPerms); + List processedQueryPerms = processPermissions(allQueryPerms); + + String combinedEditPerms = String.join(",\n", processedEditPerms); + String combinedQueryPerms = String.join(",\n", processedQueryPerms); + + firstView.setEditPerms(combinedEditPerms); + firstView.setQueryPerms(combinedQueryPerms); + + return firstView; + } + /** * 用户角色绑定 * 将用户或部门与角色进行绑定 * - * @param userRoleBindingRequest 用户角色绑定请求 + * @param request 用户角色绑定请求 */ @Override @Transactional - public void userRoleBinding(UserRoleBindingRequest userRoleBindingRequest) { - //将角色绑定的老版本人员置为未启用 - String roleId = userRoleBindingRequest.getRoleId(); - Integer isDept = userRoleBindingRequest.getIsDept(); - if (ObjectUtils.isNotEmpty(roleId)) { - businessDatabase.getBusinessDatabase() - .update("is_enable", 0) - .eq("role_id", roleId) - .eq("is_dep", isDept) - .doUpdate(ModelDepUserRolePojo.class); - } - for (String userOrDeptId : userRoleBindingRequest.getUserOrDeptIds()) { - ModelDepUserRolePojo modelDepUserRolePojo = new ModelDepUserRolePojo(); - modelDepUserRolePojo.setRoleId(roleId); - modelDepUserRolePojo.setUserOrDep(userOrDeptId); - modelDepUserRolePojo.setIsEnable(1); - if (isDept != 0 && isDept != 1) { - throw new CommonException("用户定位异常,非用户或部门"); - } - modelDepUserRolePojo.setIsDep(isDept); - modelDepUserRolePojo.setCreationDate(new Date()); - businessDatabase.getBusinessDatabase() - .doInsert(modelDepUserRolePojo); - } + public void userRoleBinding(UserRoleBindingRequest request) { + // 更新用户 + modelRoleService.updateUserRole(request, 0); + // 更新部门 + modelRoleService.updateUserRole(request, 1); } @@ -486,4 +608,274 @@ public class ModelRoleServiceImpl implements ModelRoleService { } return index; } + + @Override + public void updateUserRole(UserRoleBindingRequest request, int isDept) { + String roleId = request.getRoleId(); + // 获取目前已绑定的id + List userOrDepartRoleIds = new ArrayList<>(); + List userOrDepartRoles = businessDatabase.getBusinessDatabase() + .eq("is_enable", 1) + .eq("role_id", roleId) + .eq("is_dep", isDept) + .doQuery(ModelDepUserRolePojo.class); + if (!userOrDepartRoles.isEmpty()) { + userOrDepartRoleIds.addAll(userOrDepartRoles.stream().map(ModelDepUserRolePojo::getUserOrDep).collect(Collectors.toList())); + } + + // 获取传入的用户id + List userRolesReq = request.getUserOrDept().stream() + .filter(item -> item.getIsDept() == isDept) + .collect(Collectors.toList()); + + // 找出需要需要禁用和新增的用户id + List userToAdd = new ArrayList<>(); + for (UserRoleBindingItem item : userRolesReq) { + if (userOrDepartRoleIds.contains(item.getUserOrDeptId())) { + userOrDepartRoleIds.remove(item.getUserOrDeptId()); + } else { + userToAdd.add(item.getUserOrDeptId()); + } + } + + // 更新用户 + if (!userOrDepartRoleIds.isEmpty()) { + businessDatabase.getBusinessDatabase() + .in("user_or_dep", userOrDepartRoleIds) + .eq("is_dep", isDept) + .update("is_enable", 0) + .eq("role_id", roleId) + .doUpdate(ModelDepUserRolePojo.class); + } + + // 新增用户 + if (!userToAdd.isEmpty()) { + for (String userOrDeptId : userToAdd) { + // 检查当前用户是否已经被禁用 + ModelDepUserRolePojo unableUser = businessDatabase.getBusinessDatabase() + .eq("user_or_dep", userOrDeptId) + .eq("is_enable", 0) + .eq("role_id", roleId) + .eq("is_dep", isDept) + .doQueryFirst(ModelDepUserRolePojo.class); + if (unableUser == null) { + ModelDepUserRolePojo modelDepUserRolePojo = new ModelDepUserRolePojo(); + modelDepUserRolePojo.setRoleId(roleId); + modelDepUserRolePojo.setUserOrDep(userOrDeptId); + modelDepUserRolePojo.setIsEnable(1); + modelDepUserRolePojo.setIsDep(isDept); + modelDepUserRolePojo.setCreationDate(new Date()); + businessDatabase.getBusinessDatabase() + .doInsert(modelDepUserRolePojo); + } else { + businessDatabase.getBusinessDatabase() + .eq("id", unableUser.getId()) + .update("is_enable", 1) + .doUpdate(ModelDepUserRolePojo.class); + } + } + } + } + + @Override + public void writePreAndRole(HttpServletResponse response) { + String fileName = "系统权限导出_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss")); + try { + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + encodedFileName + ".xlsx"); + response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0); + + PreAndRolePageRequest request = new PreAndRolePageRequest(); + List result = modelRoleService.getPerAndRole(request); + + EasyExcel.write(response.getOutputStream(), RoleInfoView.class) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .sheet("系统权限") + .doWrite(result); + + } catch (Exception e) { + throw new CommonException("导出Excel失败: " + e.getMessage()); + } + + } + + @Override + public PageResultDTO getPreAndRoleByCondition(PreAndRolePageRequest request) { + List result = modelRoleService.getPerAndRole(request); + PageResultDTO page = new PageResultDTO<>(); + if (result.isEmpty()) { + page.setTotalCount(0); + page.setList(new ArrayList<>()); + return page; + } + + int totalElements = result.size(); + int totalPages = (int) Math.ceil((double) totalElements / request.getPageSize()); + if (request.getPageNum() > totalPages) { + request.setPageNum(totalPages); + } + int fromIndex = (request.getPageNum() - 1) * request.getPageSize(); + int toIndex = Math.min(fromIndex + request.getPageSize(), totalElements); + + List finalResult = new ArrayList<>(result.subList(fromIndex, toIndex)); + page.setList(finalResult); + page.setTotalCount(result.size()); + + return page; + } + + @Override + public List getPerAndRole(PreAndRolePageRequest request) { + Set deptOrUsers = new HashSet<>(); + List userDeparts = new ArrayList<>(); + // 按用户名查询 + if (!request.getUsername().isEmpty()) { + List xdapUsers = businessDatabase.getSystemDatabase() + .like("username", request.getUsername()) + .doQuery(XdapUsers.class); + if (!xdapUsers.isEmpty()) { + deptOrUsers.addAll( + xdapUsers.stream().map(XdapUsers::getId).collect(Collectors.toList()) + ); + xdapUsers.forEach(user -> { + UserDeptItem item = new UserDeptItem(); + item.setUsername(user.getUsername()); + List deptUsers = businessDatabase.getSystemDatabase() + .eq("user_id", user.getId()) + .doQuery(XdapDeptUsers.class); + if (!deptUsers.isEmpty()) { + deptOrUsers.addAll( + deptUsers.stream().map(XdapDeptUsers::getDepartmentId).collect(Collectors.toList()) + ); + item.setDepartmentIds(deptUsers.stream().map(XdapDeptUsers::getDepartmentId).collect(Collectors.toList())); + } + userDeparts.add(item); + }); + } + } + + // 按部门名查询 + if (!request.getDepartment().isEmpty()) { + List xdapDepartments = businessDatabase.getSystemDatabase() + .like("name", request.getDepartment()) + .doQuery(XdapDepartments.class); + if (!xdapDepartments.isEmpty()) { + deptOrUsers.addAll( + xdapDepartments.stream().map(XdapDepartments::getId).collect(Collectors.toSet()) + ); + } + } + + // 查询所有用户的角色和权限 + List roleAndPreViews = new ArrayList<>(); + MpaasQuery query = businessDatabase.getBusinessDatabase() + .viewQueryMode(true) + .view("selectRoleAndPerInfo") + .like("role_name", request.getRoleName()); + // 根据部门名和用户名查角色 + if (!deptOrUsers.isEmpty()) { + query.in("userOrDep", deptOrUsers); + roleAndPreViews.addAll( + query.doQuery(RoleAndPreView.class) + ); + } else { + if (request.getUsername().isEmpty() && request.getDepartment().isEmpty()) { + roleAndPreViews.addAll( + query.doQuery(RoleAndPreView.class) + ); + } + } + + // 查询用户和部门并构建临时返回 + List resultTemp = new ArrayList<>(); + roleAndPreViews.forEach(roleAndPreView -> { + RoleInfoView view = new RoleInfoView(); + if (roleAndPreView.getIsDep() == 0) { + XdapUsers user = businessDatabase.getSystemDatabase() + .eq("id", roleAndPreView.getUserOrDep()) + .doQueryFirst(XdapUsers.class); + if (user == null) { + view.setUsername("未知用户-" + roleAndPreView.getUserOrDep()); + } else { + view.setUsername(user.getUsername()); + view.setUserNumber(user.getUserNumber()); + view.setUserId(user.getId()); + } + } else if (roleAndPreView.getIsDep() == 1) { + XdapDepartments department = businessDatabase.getSystemDatabase() + .eq("id", roleAndPreView.getUserOrDep()) + .doQueryFirst(XdapDepartments.class); + if (department == null) { + view.setDepartment("未知部门-" + roleAndPreView.getUserOrDep()); + } else { + view.setDepartment(department.getName()); + view.setDepartmentId(department.getId()); + if (!userDeparts.isEmpty()) { + String usernames = userDeparts.stream() + .filter(userDepart -> userDepart.getDepartmentIds() != null) + .filter(userDepart -> userDepart.getDepartmentIds().contains(department.getId())) + .map(UserDeptItem::getUsername) + .collect(Collectors.joining("、")); + view.setUsername(usernames); + } + } + } + + view.setRoleId(roleAndPreView.getRoleId()); + view.setRoleName(roleAndPreView.getRoleName()); + view.setRoleDescription(roleAndPreView.getRoleDescription()); + + if (roleAndPreView.getParameterPer() != null) { + if (roleAndPreView.getParameterPer() == 1) { + view.setQueryPerms(roleAndPreView.getPermissionPath()); + } else if (roleAndPreView.getParameterPer() == 2) { + view.setEditPerms(roleAndPreView.getPermissionPath()); + } + } + + resultTemp.add(view); + }); + + // 构建聚合返回 + List result = new ArrayList<>(); + Map> userGroup = resultTemp.stream() + .filter(item -> + item.getUserId() != null && !item.getUserId().isEmpty()) + .collect(Collectors.groupingBy(item -> item.getRoleId() + "_" + item.getUserId())); + + Map> deptGroup = resultTemp.stream() + .filter(item -> + item.getDepartmentId() != null && !item.getDepartmentId().isEmpty()) + .collect(Collectors.groupingBy(item -> item.getRoleId() + "_" + item.getDepartmentId())); + + for (Map.Entry> entry : userGroup.entrySet()) { + RoleInfoView view = getRoleInfoView(entry); + result.add(view); + } + + for (Map.Entry> entry : deptGroup.entrySet()) { + RoleInfoView view = getRoleInfoView(entry); + result.add(view); + } + + if (result.isEmpty()) { + return new ArrayList<>(); + } + + result.forEach(item -> { + if (Objects.equals(item.getRoleName(), "超级管理员")) { + item.setEditPerms("全部权限"); + item.setQueryPerms("全部权限"); + } + }); + + + result.sort(Comparator.comparing(RoleInfoView::getRoleName, Collator.getInstance(Locale.CHINESE))); + + return result; + } } diff --git a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java index 6cf2688..1e86902 100644 --- a/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/ParameterServiceImpl.java @@ -87,8 +87,11 @@ public class ParameterServiceImpl implements ParameterService { public TemplateInfoView maintenanceParameters(UpdateParameterForm form) { // 公式格式检查 for (ParameterForm parameter : form.getParameterForms()) { + if (parameter.getOperation() == null || parameter.getOperation().isEmpty()) { + continue; + } - if ("数据平台手工录入".equals(parameter.getParameterSource()) && parameter.getDepartment() == null) { + if ("数据平台手工录入".equals(parameter.getParameterSource()) && (parameter.getDepartment() == null || parameter.getDepartment().isEmpty())) { throw new CommonException(String.format("参数'%s'部门不能为空", parameter.getParameterName())); } if (parameter.getPartsName() == null || parameter.getPartsName().isEmpty()) { diff --git a/src/main/java/com/xdap/self_development/service/impl/XdapDeptUsersServiceImpl.java b/src/main/java/com/xdap/self_development/service/impl/XdapDeptUsersServiceImpl.java index 191f9e0..ee8f8be 100644 --- a/src/main/java/com/xdap/self_development/service/impl/XdapDeptUsersServiceImpl.java +++ b/src/main/java/com/xdap/self_development/service/impl/XdapDeptUsersServiceImpl.java @@ -217,8 +217,9 @@ public class XdapDeptUsersServiceImpl implements XdapDeptUsersService { if (depts.isEmpty() || commonDept == null) { return userInfoView; } + List deptIds = depts.stream().map(XdapDeptUsers::getDepartmentId).collect(Collectors.toList()); List xdapDepartments = bd.getSystemDatabase() - .in("id", depts) + .in("id", deptIds) .eq("parent_id", commonDept.getId()) .doQuery(XdapDepartments.class); if (xdapDepartments.isEmpty()) {