package com.oying.modules.system.rest; import cn.hutool.core.collection.CollectionUtil; import com.oying.modules.system.domain.Dept; import com.oying.modules.system.domain.dto.DeptQueryCriteria; import com.oying.utils.R; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import com.oying.annotation.Log; import com.oying.exception.BadRequestException; import com.oying.modules.system.service.DeptService; import com.oying.utils.PageResult; import com.oying.utils.PageUtil; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.stream.Collectors; /** * @author Z * @date 2019-03-25 */ @RestController @RequiredArgsConstructor @Api(tags = "系统:机构管理") @RequestMapping("/api/dept") public class DeptController { private final DeptService deptService; private static final String ENTITY_NAME = "dept"; @ApiOperation("导出机构数据") @GetMapping(value = "/download") @PreAuthorize("@el.check('dept:list')") public void exportDept(HttpServletResponse response, DeptQueryCriteria criteria) throws Exception { deptService.download(deptService.queryAll(criteria, false), response); } @ApiOperation("查询机构") @GetMapping @PreAuthorize("@el.check('user:list','dept:list')") public ResponseEntity queryDept(DeptQueryCriteria criteria) throws Exception { List depts = deptService.queryAll(criteria, true); return new ResponseEntity<>(R.success(PageUtil.toPage(depts)), HttpStatus.OK); } @ApiOperation("查询机构:根据ID获取同级与上级数据") @PostMapping("/superior") @PreAuthorize("@el.check('user:list','dept:list')") public ResponseEntity getDeptSuperior(@RequestBody List ids, @RequestParam(defaultValue = "false") Boolean exclude) { Set deptSet = new LinkedHashSet<>(); for (Long id : ids) { Dept dept = deptService.findById(id); List depts = deptService.getSuperior(dept, new ArrayList<>()); if (exclude) { for (Dept data : depts) { if (data.getId().equals(dept.getPid())) { data.setSubCount(data.getSubCount() - 1); } } // 编辑机构时不显示自己以及自己下级的数据,避免出现PID数据环形问题 depts = depts.stream().filter(i -> !ids.contains(i.getId())).collect(Collectors.toList()); } deptSet.addAll(depts); } return new ResponseEntity<>(R.success(deptService.buildTree(new ArrayList<>(deptSet))), HttpStatus.OK); } @Log("新增机构") @ApiOperation("新增机构") @PostMapping @PreAuthorize("@el.check('dept:add')") public ResponseEntity createDept(@Validated @RequestBody Dept resources) { if (resources.getId() != null) { throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID"); } deptService.create(resources); return new ResponseEntity<>(R.success(), HttpStatus.CREATED); } @Log("修改机构") @ApiOperation("修改机构") @PutMapping @PreAuthorize("@el.check('dept:edit')") public ResponseEntity updateDept(@Validated(Dept.Update.class) @RequestBody Dept resources) { deptService.update(resources); return new ResponseEntity<>(R.success(), HttpStatus.NO_CONTENT); } @Log("删除机构") @ApiOperation("删除机构") @DeleteMapping @PreAuthorize("@el.check('dept:del')") public ResponseEntity deleteDept(@RequestBody Set ids) { Set depts = new HashSet<>(); for (Long id : ids) { List deptList = deptService.findByPid(id); depts.add(deptService.findById(id)); if (CollectionUtil.isNotEmpty(deptList)) { depts = deptService.getDeleteDepts(deptList, depts); } } // 验证是否被角色或用户关联 deptService.verification(depts); deptService.delete(depts); return new ResponseEntity<>(R.success(),HttpStatus.OK); } }