AdminRiderController.java 6.59 KB
package com.diligrp.rider.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.diligrp.rider.common.result.Result;
import com.diligrp.rider.dto.AdminRiderAddDTO;
import com.diligrp.rider.entity.Orders;
import com.diligrp.rider.entity.Rider;
import com.diligrp.rider.mapper.OrdersMapper;
import com.diligrp.rider.service.AdminRiderService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/admin/rider")
@RequiredArgsConstructor
public class AdminRiderController {

    private final AdminRiderService adminRiderService;
    private final OrdersMapper ordersMapper;

    /** 手动新增骑手(分站管理员自动绑定本城市) */
    @PostMapping("/add")
    public Result<Void> add(@Valid @RequestBody AdminRiderAddDTO dto, HttpServletRequest request) {
        Long cityId = "substation".equals(request.getAttribute("role"))
                ? (Long) request.getAttribute("cityId")
                : dto.getCityId();
        adminRiderService.add(dto, cityId);
        return Result.success();
    }

    /** 骑手列表(分站管理员仅看本城市,超管看全部) */
    @GetMapping("/list")
    public Result<List<Rider>> list(
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Integer userStatus,
            HttpServletRequest request) {
        Long cityId = "substation".equals(request.getAttribute("role"))
                ? (Long) request.getAttribute("cityId")
                : null;
        return Result.success(adminRiderService.list(keyword, userStatus, cityId));
    }

    /** 指派骑手候选列表 */
    @GetMapping("/order/candidates")
    public Result<List<Rider>> designateCandidates(@RequestParam Long orderId, HttpServletRequest request) {
        Long cityId = "substation".equals(request.getAttribute("role"))
                ? (Long) request.getAttribute("cityId")
                : null;
        return Result.success(adminRiderService.designateCandidates(orderId, cityId));
    }

    /** 审核骑手:status=0拒绝 1通过 */
    @PostMapping("/setStatus")
    public Result<Void> setStatus(@RequestParam Long riderId, @RequestParam int status) {
        adminRiderService.setStatus(riderId, status);
        return Result.success();
    }

    /** 设置骑手等级,levelId 为空时使用默认等级 */
    @PostMapping("/setLevel")
    public Result<Void> setLevel(@RequestParam Long riderId,
                                 @RequestParam(required = false) Long levelId,
                                 HttpServletRequest request) {
        Long cityId = "substation".equals(request.getAttribute("role"))
                ? (Long) request.getAttribute("cityId")
                : null;
        adminRiderService.setLevel(riderId, levelId, cityId);
        return Result.success();
    }

    /** 启用/禁用骑手账号:status=0禁用 1启用 */
    @PostMapping("/setEnableStatus")
    public Result<Void> setEnableStatus(@RequestParam Long riderId, @RequestParam int status) {
        adminRiderService.setEnableStatus(riderId, status);
        return Result.success();
    }

    /** 切换骑手类型:type=1兼职 2全职 */
    @PostMapping("/setType")
    public Result<Void> setType(@RequestParam Long riderId, @RequestParam int type) {
        adminRiderService.setType(riderId, type);
        return Result.success();
    }

    /** 指派骑手接单 */
    @PostMapping("/order/designate")
    public Result<Void> designate(@RequestParam Long orderId, @RequestParam Long riderId) {
        adminRiderService.designate(orderId, riderId);
        return Result.success();
    }

    /** 处理转单申请:trans=1通过 3拒绝 */
    @PostMapping("/order/setTrans")
    public Result<Void> setTrans(@RequestParam Long orderId, @RequestParam int trans) {
        adminRiderService.setTrans(orderId, trans);
        return Result.success();
    }

    /**
     * 订单列表(分站管理员查看本城市订单 / 超管查看所有)
     * 分站管理员:cityId 从 token 自动注入,无需传参
     * 超管:可传 cityId 筛选某城市
     */
    @GetMapping("/order/list")
    public Result<List<Orders>> orderList(
            @RequestParam(required = false) Integer status,
            @RequestParam(required = false) Integer isTrans,
            @RequestParam(required = false) String keyword,
            @RequestParam(defaultValue = "1") int page,
            HttpServletRequest request) {
        Long cityId = (Long) request.getAttribute("cityId");
        String role = (String) request.getAttribute("role");

        LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<Orders>()
                .eq(Orders::getIsDel, 0)
                .orderByDesc(Orders::getId);

        if ("substation".equals(role) && cityId != null) {
            wrapper.eq(Orders::getCityId, cityId);
        }
        if (status != null) wrapper.eq(Orders::getStatus, status);
        if (isTrans != null) wrapper.eq(Orders::getIsTrans, isTrans);
        if (keyword != null && !keyword.isBlank()) {
            wrapper.and(w -> w.like(Orders::getOrderNo, keyword)
                    .or().like(Orders::getOutOrderNo, keyword)
                    .or().like(Orders::getRecipName, keyword)
                    .or().like(Orders::getRecipPhone, keyword));
        }
        int offset = (page - 1) * 20;
        wrapper.last("LIMIT " + offset + ",20");

        return Result.success(ordersMapper.selectList(wrapper));
    }

    /**
     * 配送订单列表(平台管理员查看外部系统推入的订单)
     * 按 appKey / outOrderNo 查询
     */
    @GetMapping("/order/delivery/list")
    public Result<List<Orders>> deliveryOrderList(
            @RequestParam(required = false) String appKey,
            @RequestParam(required = false) String outOrderNo,
            @RequestParam(required = false) Integer status,
            @RequestParam(defaultValue = "1") int page) {
        LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<Orders>()
                .eq(Orders::getIsDel, 0)
                .orderByDesc(Orders::getId);
        if (appKey != null && !appKey.isBlank()) wrapper.eq(Orders::getAppKey, appKey);
        if (outOrderNo != null && !outOrderNo.isBlank()) wrapper.like(Orders::getOutOrderNo, outOrderNo);
        if (status != null) wrapper.eq(Orders::getStatus, status);
        int offset = (page - 1) * 20;
        wrapper.last("LIMIT " + offset + ",20");
        return Result.success(ordersMapper.selectList(wrapper));
    }
}