longz
2026-04-21 c4db0a4526f61758272c92396aa788d84f098102
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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<java.util.List<StaffListVo>> 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 = "详情(须 uuid)")
    @GetMapping("/{id}")
    @SaCheckPermission(
            value = {"sys:staff:detail", "sys:staff-groups:detail"},
            mode = SaMode.OR)
    public Result<StaffDetailVo> 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<Map<String, Object>> create(@Valid @RequestBody StaffCreateRequest request) {
        return ResultUtil.data(staffManageApplicationService.create(request));
    }
 
    @Operation(summary = "编辑")
    @PutMapping("/{id}")
    @SaCheckPermission("sys:staff:update")
    public Result<Void> 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<Void> 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<Void> 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<byte[]> 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<StaffImportResultVo> 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<Map<String, String>> uploadAvatar(@RequestParam("file") MultipartFile file) {
        return ResultUtil.data(Map.of("avatarUrl", staffManageApplicationService.uploadAvatar(file)));
    }
}