package com.sinata.appointment.controller; import com.sinata.appointment.common.Result; import com.sinata.appointment.common.ResultUtil; import com.sinata.appointment.dto.MiniAppointmentCreateRequest; import com.sinata.appointment.dto.MiniAppointmentListVo; import com.sinata.appointment.dto.MiniMyAppointmentDetailVo; import com.sinata.appointment.dto.MiniMyVisitorCodeOrderVo; import com.sinata.appointment.dto.MiniVisitRecordListVo; import com.sinata.appointment.service.MiniAppointmentApplicationService; 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.time.LocalDate; import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; 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.bind.annotation.PathVariable; @Tag(name = "小程序预约") @RestController @RequestMapping("/api/mini/appointments") @RequiredArgsConstructor public class MiniAppointmentController { private final MiniAppointmentApplicationService miniAppointmentApplicationService; @Operation(summary = "小程序发起预约") @PostMapping public Result> create(@Valid @RequestBody MiniAppointmentCreateRequest request) { return ResultUtil.data(Map.of("id", miniAppointmentApplicationService.create(request))); } @Operation(summary = "小程序取消预约(预约人可在完成/拒绝前取消)") @PostMapping("/{id}/cancel") public Result cancel( @PathVariable Long id, @RequestParam @NotBlank(message = "uuid 不能为空") String uuid) { miniAppointmentApplicationService.cancelBySubmitter(id, uuid); return ResultUtil.success(); } @Operation(summary = "小程序我的预约详情") @GetMapping("/{id}") public Result detail( @PathVariable Long id, @RequestParam @NotBlank(message = "uuid 不能为空") String uuid) { return ResultUtil.data(miniAppointmentApplicationService.detailMyOrder(id, uuid)); } @Operation(summary = "小程序审批人已处理预约列表(支持状态/姓名关键词/来访日期)") @GetMapping("/mine") public Result> mine( @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size, @RequestParam(required = false) String status, @RequestParam(required = false) String visitedUserNameKeyword, @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate visitDate) { return ResultUtil.page( miniAppointmentApplicationService.pageMine( page, size, status, visitedUserNameKeyword, visitDate)); } @Operation(summary = "小程序来访记录列表(已通过且被访人为当前用户)") @GetMapping("/visit-records") public Result> visitRecords( @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size, @RequestParam(required = false) String visitorNameKeyword, @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate visitDate) { return ResultUtil.page( miniAppointmentApplicationService.pageVisitRecords( page, size, visitorNameKeyword, visitDate)); } @Operation(summary = "小程序我的预约列表(发起人视角)") @GetMapping("/my-orders") public Result> myOrders( @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size, @RequestParam(required = false) String status, @RequestParam(required = false) String keyword) { return ResultUtil.page( miniAppointmentApplicationService.pageMyOrders( page, size, status, keyword)); } @Operation(summary = "小程序首页我的访客码列表") @GetMapping("/my-visitor-codes") public Result> myVisitorCodes() { return ResultUtil.data(miniAppointmentApplicationService.listMyVisitorCodes()); } }