package com.yunhai.userbase.controller.api; import com.yunhai.platform.utils.exception.DException; import com.yunhai.platform.utils.exception.ErrorCode; import com.yunhai.userbase.common.annotation.OperationLog; import com.yunhai.userbase.common.validation.ValidationGroups; import com.yunhai.userbase.config.Config; import com.yunhai.userbase.model.BasePageQuery; import com.yunhai.userbase.model.BasePageResult; import com.yunhai.userbase.model.sysuser.BatchChangeStatusRequest; import com.yunhai.userbase.model.sysuser.BatchDeleteRequest; import com.yunhai.userbase.model.sysuser.BatchImportResult; import com.yunhai.userbase.model.sysuser.ChangeGroupsRequest; import com.yunhai.userbase.model.sysuser.ChangeSortNoRequest; import com.yunhai.userbase.model.sysuser.SysUserQuery; import com.yunhai.userbase.model.sysuser.SysUserRequest; import com.yunhai.userbase.model.sysuser.SysUserVo; import com.yunhai.userbase.service.ISysUserService; import com.yunhai.userbase.utils.PageUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author chenx * @date 2026/7/20 16:14 * @description 组用户管理 */ @RestController @RequestMapping(value = Config.API_PATH + "/sysuser/") public class SysUserController { @Autowired private ISysUserService sysUserService; @OperationLog("新增用户") @PostMapping("Add") public Integer add(@RequestBody @Validated(ValidationGroups.Create.class) SysUserRequest request) { List data=new ArrayList<>(); return sysUserService.add(request); } @OperationLog("编辑用户") @PostMapping("Edit/{id}") public void edit(@PathVariable Integer id, @RequestBody @Validated(ValidationGroups.Update.class) SysUserRequest request) { sysUserService.edit(id, request); } /** * 将用户从指定组中移除;若该用户无其它组关联则级联删除用户。 */ @OperationLog("从组中删除用户") @PostMapping("DeleteFromGroup/{userId}/{groupId}") public void deleteFromGroup(@PathVariable Integer userId, @PathVariable Integer groupId) { sysUserService.deleteFromGroup(userId, groupId); } /** * 批量从指定组中移除用户;无其它组关联者级联删除用户。 */ @OperationLog("批量从组中删除用户") @PostMapping("BatchDelete") public void batchDelete(@RequestBody @Validated BatchDeleteRequest request) { sysUserService.batchDeleteFromGroup(request.getUserIds(), request.getGroupId()); } /** 禁用用户(disabled=true) */ @OperationLog("禁用用户") @PostMapping("Disable/{id}") public void disable(@PathVariable Integer id) { sysUserService.changeStatus(id, true); } /** 启用用户(disabled=false) */ @OperationLog("启用用户") @PostMapping("Enable/{id}") public void enable(@PathVariable Integer id) { sysUserService.changeStatus(id, false); } /** 批量设置用户状态 */ @OperationLog("批量设置用户状态") @PostMapping("BatchChangeStatus") public void batchChangeStatus(@RequestBody @Validated BatchChangeStatusRequest request) { sysUserService.batchChangeStatus(request.getUserIds(), request.getDisabled()); } @GetMapping("/List") public BasePageResult list(SysUserQuery query, BasePageQuery pageQuery) { // 排序字段在关联表,无法走 Pageable.sort,统一由 Service.Specification 控制 // (根节点按 id 升序,具体组按组内 sort_no 升序)。此处不传 Sort,避免覆盖 Spec 的 orderBy。 return PageUtils.toResult(sysUserService.list(query, PageUtils.toPageable(pageQuery, null))); } /** 调整用户在某组内的排序号(sort_no):1~999,可空表示清除 */ @OperationLog("设置用户组内排序号") @PostMapping("ChangeSortNo/{userId}") public void changeSortNo(@PathVariable Integer userId, @RequestBody @Validated ChangeSortNoRequest request) { sysUserService.changeSortNo(userId, request.getGroupId(), request.getSortNo()); } @OperationLog("调整组") @PostMapping("ChangeGroups") public void changeGroups(@RequestBody @Validated ChangeGroupsRequest request) { sysUserService.changeGroups(request.getUserIds(), request.getGroupIds()); } @GetMapping("Groups/{userId}") public List getUserGroups(@PathVariable Integer userId) { return sysUserService.findGroupIdsByUserId(userId); } @OperationLog("批量导入用户") @PostMapping("BatchImport") public BatchImportResult batchImport(@RequestParam("file") MultipartFile file) { return sysUserService.batchImport(file); } /** * 下载用户批量导入模板(真实 .xlsx):平铺当前组及子孙组,仅填充组名(路径)与组id;其余列留空供填写。 */ @GetMapping("DownloadTemplate") public void downloadTemplate(@RequestParam(value = "groupId", required = false) Integer groupId, HttpServletResponse response) throws IOException { sysUserService.downloadImportTemplate(groupId, response); } /** * 导出组下所有用户(含子组)为 Excel;与导入模板同构,末尾追加用户id列。 * 前端直接跳转此地址触发浏览器下载。 */ @GetMapping("Export") public void export(@RequestParam(value = "groupId", required = false) Integer groupId, @RequestParam(value = "withSub", defaultValue = "1") Integer withSub, @RequestParam(value = "name", required = false) String name, HttpServletResponse response) throws IOException { sysUserService.exportUsers(groupId, withSub, name, response); } }