AdminMessageController.java 3.12 KB
package com.diligrp.rider.controller;

import com.diligrp.rider.common.exception.BizException;
import com.diligrp.rider.common.result.Result;
import com.diligrp.rider.entity.RiderMessageTemplate;
import com.diligrp.rider.service.AdminMessageService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 管理端消息接口
 */
@RestController
@RequestMapping("/api/admin/message")
@RequiredArgsConstructor
public class AdminMessageController {

    private final AdminMessageService messageService;

    @Data
    static class MessageSendDTO {
        private Long cityId;
        private Long riderId;
        private Integer type;
        private String title;
        private String content;
        private String bizType;
        private Long bizId;
    }

    @Data
    static class MessageBroadcastDTO {
        private Long cityId;
        private Integer type;
        private String title;
        private String content;
    }

    /**
     * 发送消息给指定骑手
     */
    @PostMapping("/send")
    public Result<Void> send(@RequestBody MessageSendDTO dto, HttpServletRequest request) {
        Long cityId = resolveCityId(dto.getCityId(), request);
        messageService.sendToRider(cityId, dto.getRiderId(), dto.getType(), dto.getTitle(), dto.getContent(), dto.getBizType(), dto.getBizId());
        return Result.success();
    }

    /**
     * 群发消息(城市内所有骑手)
     */
    @PostMapping("/broadcast")
    public Result<Void> broadcast(@RequestBody MessageBroadcastDTO dto, HttpServletRequest request) {
        Long cityId = resolveCityId(dto.getCityId(), request);
        messageService.broadcastToCity(cityId, dto.getType(), dto.getTitle(), dto.getContent());
        return Result.success();
    }

    /**
     * 查询消息列表(管理端)
     */
    @GetMapping("/list")
    public Result<Map<String, Object>> list(
            @RequestParam(required = false) Long cityId,
            @RequestParam(required = false) Long riderId,
            @RequestParam(required = false) Integer type,
            @RequestParam(defaultValue = "1") Integer page,
            HttpServletRequest request) {
        Long scopedCityId = resolveCityId(cityId, request);
        return Result.success(messageService.listMessages(scopedCityId, riderId, type, page));
    }

    /**
     * 获取模板列表
     */
    @GetMapping("/templates")
    public Result<List<RiderMessageTemplate>> templates() {
        return Result.success(messageService.listTemplates());
    }

    /**
     * 解析城市ID:分站管理员固定使用账号绑定城市,平台管理员必须显式选择租户。
     */
    private Long resolveCityId(Long requestedCityId, HttpServletRequest request) {
        if ("substation".equals(request.getAttribute("role"))) {
            return (Long) request.getAttribute("cityId");
        }
        if (requestedCityId == null || requestedCityId < 1) {
            throw new BizException("请选择租户");
        }
        return requestedCityId;
    }
}