ProcurementController.java

package org.darkroomlibrary.controller;

import org.darkroomlibrary.aop.NormalizePageQuery;
import org.darkroomlibrary.aop.RequireRole;
import org.darkroomlibrary.domain.type.UserRole;
import org.darkroomlibrary.aop.ManualAudit;
import org.darkroomlibrary.web.response.ApiResponse;
import org.darkroomlibrary.web.dto.query.ProcurementMessagePageQuery;
import org.darkroomlibrary.web.dto.query.ProcurementOrderPageQuery;
import org.darkroomlibrary.web.dto.command.ProcurementAssignDto;
import org.darkroomlibrary.web.dto.command.ProcurementLogisticsUpdateDto;
import org.darkroomlibrary.web.dto.command.ProcurementMessageDto;
import org.darkroomlibrary.web.dto.command.ProcurementMessageReadDto;
import org.darkroomlibrary.web.dto.command.ProcurementOrderCreateDto;
import org.darkroomlibrary.web.dto.command.ProcurementStatusUpdateDto;
import org.darkroomlibrary.web.view.ProcurementMessageView;
import org.darkroomlibrary.web.view.ProcurementOrderView;
import org.darkroomlibrary.service.ProcurementService;
import org.springframework.web.bind.annotation.*;

import jakarta.annotation.Resource;
import java.util.List;
import java.util.Map;
import jakarta.validation.Valid;

/**
 * 采购与物流协作控制器
 */
@RestController
@RequestMapping("/procurement")
public class ProcurementController {

    @Resource
    private ProcurementService procurementService;

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @ManualAudit
    @PostMapping("/save")
    public ApiResponse<Void> save(@Valid @RequestBody ProcurementOrderCreateDto dto) {
        return procurementService.save(dto);
    }

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN})
    @ManualAudit
    @PutMapping("/assignPurchaser")
    public ApiResponse<Void> assignPurchaser(@Valid @RequestBody ProcurementAssignDto dto) {
        return procurementService.assignPurchaser(dto);
    }

    @RequireRole(UserRole.ACQUISITIONS)
    @ManualAudit
    @PutMapping("/claim/{id}")
    public ApiResponse<Void> claim(@PathVariable Integer id) {
        return procurementService.claim(id);
    }

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS})
    @ManualAudit
    @PutMapping("/updateStatus")
    public ApiResponse<Void> updateStatus(@Valid @RequestBody ProcurementStatusUpdateDto dto) {
        return procurementService.updateStatus(dto);
    }

    @RequireRole({UserRole.ACQUISITIONS, UserRole.SUPER_ADMIN})
    @ManualAudit
    @PutMapping("/assignLogistics")
    public ApiResponse<Void> assignLogistics(@Valid @RequestBody ProcurementAssignDto dto) {
        return procurementService.assignLogistics(dto);
    }

    @RequireRole({UserRole.ACQUISITIONS, UserRole.LOGISTICS, UserRole.SUPER_ADMIN})
    @ManualAudit
    @PutMapping("/updateLogistics")
    public ApiResponse<Void> updateLogistics(@Valid @RequestBody ProcurementLogisticsUpdateDto dto) {
        return procurementService.updateLogistics(dto);
    }

    @NormalizePageQuery
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS, UserRole.LOGISTICS})
    @PostMapping("/query")
    public ApiResponse<List<ProcurementOrderView>> query(@RequestBody ProcurementOrderPageQuery dto) {
        return procurementService.query(dto);
    }

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS})
    @GetMapping("/lowStock")
    public ApiResponse<Map<String, Object>> lowStock(@RequestParam(defaultValue = "3") Integer threshold) {
        return procurementService.lowStock(threshold);
    }

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS, UserRole.LOGISTICS})
    @PostMapping("/message/send")
    public ApiResponse<Void> sendMessage(@Valid @RequestBody ProcurementMessageDto dto) {
        return procurementService.sendMessage(dto);
    }

    @NormalizePageQuery
    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS, UserRole.LOGISTICS})
    @PostMapping("/message/query")
    public ApiResponse<List<ProcurementMessageView>> queryMessages(@RequestBody ProcurementMessagePageQuery dto) {
        return procurementService.queryMessages(dto);
    }

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS, UserRole.LOGISTICS})
    @PutMapping("/message/read")
    public ApiResponse<Void> markRead(@Valid @RequestBody ProcurementMessageReadDto dto) {
        return procurementService.markRead(dto);
    }

    @RequireRole({UserRole.ADMIN, UserRole.SUPER_ADMIN, UserRole.ACQUISITIONS, UserRole.LOGISTICS})
    @GetMapping("/message/unread")
    public ApiResponse<Map<String, Object>> unreadCount(@RequestParam(required = false) Integer orderId) {
        return procurementService.unreadCount(orderId);
    }
}