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.ApprovalNodeEnabledPatchRequest; import com.sinata.appointment.dto.BookingSettingsSaveRequest; import com.sinata.appointment.dto.BookingSettingsVo; import com.sinata.appointment.dto.ContentSettingsSaveRequest; import com.sinata.appointment.dto.ContentSettingsVo; import com.sinata.appointment.dto.FieldConfigPatchRequest; import com.sinata.appointment.dto.VisitReasonCreateRequest; import com.sinata.appointment.dto.VisitReasonListVo; import com.sinata.appointment.dto.VisitReasonUpdateRequest; import com.sinata.appointment.dto.VisitorCompetentDeptSaveRequest; import com.sinata.appointment.dto.VisitorCompetentDeptVo; import com.sinata.appointment.entity.BizApprovalNodeConfig; import com.sinata.appointment.entity.BizFieldConfig; import com.sinata.appointment.entity.BizVisitReason; import com.sinata.appointment.service.ConfigApplicationService; 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.List; import lombok.RequiredArgsConstructor; 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; @Tag(name = "系统配置") @RestController @RequestMapping("/api/config") @RequiredArgsConstructor public class ConfigController { private final ConfigApplicationService configApplicationService; @GetMapping("/visit-reasons") @SaCheckPermission( value = {"config:visit-reasons:page", "appointments:page"}, mode = SaMode.OR) public Result> listReasons() { return ResultUtil.data(configApplicationService.listVisitReasons()); } @Operation(summary = "保存来访事由") @PostMapping("/visit-reasons") @SaCheckPermission("config:visit-reasons:update") public Result saveReason(@RequestBody BizVisitReason entity) { configApplicationService.saveVisitReason(entity); return ResultUtil.success(); } @Operation(summary = "来访事由管理-分页") @GetMapping("/visit-reasons/manage") @SaCheckPermission("config:visit-reasons:page") public Result> pageVisitReasons( @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size) { return ResultUtil.page(configApplicationService.pageVisitReasons(page, size)); } @Operation(summary = "来访事由管理-新增") @PostMapping("/visit-reasons/manage") @SaCheckPermission("config:visit-reasons:create") public Result createVisitReason(@Valid @RequestBody VisitReasonCreateRequest request) { configApplicationService.createVisitReason(request); return ResultUtil.success(); } @Operation(summary = "来访事由管理-编辑") @PutMapping("/visit-reasons/manage/{id}") @SaCheckPermission("config:visit-reasons:update") public Result updateVisitReason(@PathVariable Long id, @Valid @RequestBody VisitReasonUpdateRequest request) { configApplicationService.updateVisitReason(id, request); return ResultUtil.success(); } @Operation(summary = "来访事由管理-删除") @DeleteMapping("/visit-reasons/manage/{id}") @SaCheckPermission("config:visit-reasons:delete") public Result deleteVisitReason( @PathVariable Long id, @RequestParam @NotBlank(message = "uuid 不能为空") String uuid) { configApplicationService.deleteVisitReason(id, uuid); return ResultUtil.success(); } @GetMapping("/fields") @SaCheckPermission("config:booking-settings:page") public Result> listFields() { return ResultUtil.data(configApplicationService.listFieldConfigs()); } @Operation(summary = "保存字段配置") @PostMapping("/fields") @SaCheckPermission("config:booking-settings:update") public Result saveField(@RequestBody BizFieldConfig entity) { configApplicationService.saveFieldConfig(entity); return ResultUtil.success(); } @Operation(summary = "更新预约字段是否启用/是否必填(须 uuid;受访人、来访时间不可关闭)") @PatchMapping("/fields/{id}") @SaCheckPermission("config:booking-settings:update") public Result patchField(@PathVariable Long id, @Valid @RequestBody FieldConfigPatchRequest request) { configApplicationService.patchFieldConfig(id, request); return ResultUtil.success(); } @Operation(summary = "读取预约策略(时段、节假日、道闸)") @GetMapping("/booking-settings") @SaCheckPermission("config:booking-settings:page") public Result getBookingSettings() { return ResultUtil.data(configApplicationService.getBookingSettings()); } @Operation(summary = "保存预约策略") @PutMapping("/booking-settings") @SaCheckPermission("config:booking-settings:update") public Result saveBookingSettings(@Valid @RequestBody BookingSettingsSaveRequest request) { configApplicationService.saveBookingSettings(request); return ResultUtil.success(); } @Operation(summary = "读取内容设置") @GetMapping("/content-settings") @SaCheckPermission("config:content-settings:page") public Result getContentSettings() { return ResultUtil.data(configApplicationService.getContentSettings()); } @Operation(summary = "保存内容设置") @PutMapping("/content-settings") @SaCheckPermission("config:content-settings:update") public Result saveContentSettings(@Valid @RequestBody ContentSettingsSaveRequest request) { configApplicationService.saveContentSettings(request); return ResultUtil.success(); } @GetMapping("/approval-nodes") @SaCheckPermission("config:approval-settings:page") public Result> listNodes() { return ResultUtil.data(configApplicationService.listApprovalNodes()); } @Operation(summary = "保存审批节点配置") @PostMapping("/approval-nodes") @SaCheckPermission("config:approval-settings:update") public Result saveNode(@RequestBody BizApprovalNodeConfig entity) { configApplicationService.saveApprovalNode(entity); return ResultUtil.success(); } @Operation(summary = "更新审批节点是否开启(须 uuid)") @PatchMapping("/approval-nodes/{id}/enabled") @SaCheckPermission("config:approval-settings:update") public Result patchApprovalNodeEnabled( @PathVariable Long id, @Valid @RequestBody ApprovalNodeEnabledPatchRequest request) { configApplicationService.updateApprovalNodeEnabled(id, request.getUuid(), request.getEnabled()); return ResultUtil.success(); } @Operation(summary = "读取访客主管部门配置") @GetMapping("/visitor-competent-dept") @SaCheckPermission("config:approval-settings:page") public Result getVisitorCompetentDept() { VisitorCompetentDeptVo vo = new VisitorCompetentDeptVo(); vo.setDeptId(configApplicationService.getVisitCompetentDeptId()); return ResultUtil.data(vo); } @Operation(summary = "保存访客主管部门(传 deptId=null 清空)") @PutMapping("/visitor-competent-dept") @SaCheckPermission("config:approval-settings:update") public Result saveVisitorCompetentDept(@RequestBody VisitorCompetentDeptSaveRequest request) { configApplicationService.saveVisitCompetentDept(request.getDeptId()); return ResultUtil.success(); } }