package com.sinata.appointment.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaMode; import com.sinata.appointment.common.Result; import com.sinata.appointment.common.ResultUtil; import com.sinata.appointment.dto.StaffCreateRequest; import com.sinata.appointment.dto.StaffDetailVo; import com.sinata.appointment.dto.StaffImportResultVo; import com.sinata.appointment.dto.StaffListVo; import com.sinata.appointment.dto.StaffStatusPatchRequest; import com.sinata.appointment.dto.StaffUpdateRequest; import com.sinata.appointment.service.StaffManageApplicationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; 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 org.springframework.web.multipart.MultipartFile; @Tag(name = "员工管理") @RestController @RequestMapping("/api/sys/staff") @RequiredArgsConstructor @Validated public class StaffManageController { private final StaffManageApplicationService staffManageApplicationService; @Operation(summary = "分页列表") @GetMapping @SaCheckPermission( value = {"sys:staff:page", "sys:staff-groups:page", "sys:local-units:page"}, mode = SaMode.OR) public Result> page( @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size, @RequestParam(required = false) Long deptId, @RequestParam(required = false) String realName, @RequestParam(required = false) String staffNo, @RequestParam(required = false) String mobile, @RequestParam(required = false) String position, @RequestParam(required = false) Integer status, @RequestParam(required = false) Long excludeStaffGroupId, @RequestParam(required = false) Long staffGroupId) { return ResultUtil.page( staffManageApplicationService.page( page, size, deptId, realName, staffNo, mobile, position, status, excludeStaffGroupId, staffGroupId)); } @Operation(summary = "详情") @GetMapping("/{id}") @SaCheckPermission( value = {"sys:staff:detail", "sys:staff-groups:detail"}, mode = SaMode.OR) public Result detail( @PathVariable Long id, @RequestParam @NotBlank(message = "uuid 不能为空") String uuid) { return ResultUtil.data(staffManageApplicationService.detail(id, uuid)); } @Operation(summary = "新增") @PostMapping @SaCheckPermission("sys:staff:create") public Result> create(@Valid @RequestBody StaffCreateRequest request) { return ResultUtil.data(staffManageApplicationService.create(request)); } @Operation(summary = "编辑") @PutMapping("/{id}") @SaCheckPermission("sys:staff:update") public Result update(@PathVariable Long id, @Valid @RequestBody StaffUpdateRequest request) { staffManageApplicationService.update(id, request); return ResultUtil.success(); } @Operation(summary = "启停") @PatchMapping("/{id}/status") @SaCheckPermission("sys:staff:status") public Result status( @PathVariable Long id, @Valid @RequestBody StaffStatusPatchRequest request) { staffManageApplicationService.patchStatus(id, request); return ResultUtil.success(); } @Operation(summary = "删除") @DeleteMapping("/{id}") @SaCheckPermission("sys:staff:delete") public Result delete( @PathVariable Long id, @RequestParam @NotBlank(message = "uuid 不能为空") String uuid) { staffManageApplicationService.delete(id, uuid); return ResultUtil.success(); } @Operation(summary = "下载 XLSX 导入模板") @GetMapping("/import-template") @SaCheckPermission("sys:staff:import") public ResponseEntity importTemplate() { byte[] body = staffManageApplicationService.importTemplateExcel(); return ResponseEntity.ok() .contentType( MediaType.parseMediaType( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) .header( HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"staff-import-template.xlsx\"") .body(body); } @Operation(summary = "批量导入 XLSX") @PostMapping("/import") @SaCheckPermission("sys:staff:import") public Result importCsv(@RequestParam("file") MultipartFile file) { return ResultUtil.data(staffManageApplicationService.importExcel(file)); } @Operation(summary = "上传员工头像") @PostMapping("/avatar") @SaCheckPermission(value = {"sys:staff:create", "sys:staff:update"}, mode = SaMode.OR) public Result> uploadAvatar(@RequestParam("file") MultipartFile file) { return ResultUtil.data(Map.of("avatarUrl", staffManageApplicationService.uploadAvatar(file))); } }