using AgriculturalPlatform.Api.Data; using AgriculturalPlatform.Api.Dtos; using AgriculturalPlatform.Api.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace AgriculturalPlatform.Api.Controllers; [ApiController] [Route("api/products")] [Authorize] public class ProductsController(AppDbContext db) : ControllerBase { /// 品种列表(可选品类/关键字) [HttpGet] public async Task List(string? category, string? keyword) { var query = db.Products.AsQueryable(); if (!string.IsNullOrWhiteSpace(category)) query = query.Where(p => p.Category == category); if (!string.IsNullOrWhiteSpace(keyword)) query = query.Where(p => p.Name.Contains(keyword) || p.Category.Contains(keyword)); var items = await query.OrderBy(p => p.Category).ThenBy(p => p.Name).ToListAsync(); return Ok(items.ToDtos()); } /// 品类列表(筛选用) [HttpGet("categories")] public async Task Categories() { var items = await db.Products.Select(p => p.Category).Distinct().OrderBy(c => c).ToListAsync(); return Ok(items); } [HttpPost] public async Task> Create(ProductSaveRequest req) { if (await db.Products.AnyAsync(p => p.Name == req.Name)) return BadRequest(new { message = "品种名称已存在" }); var product = new Product { Name = req.Name, Category = req.Category, Unit = req.Unit, Spec = req.Spec, Price = req.Price }; if (Enum.TryParse(req.Status, out var status)) product.Status = status; db.Products.Add(product); await db.SaveChangesAsync(); return Ok(product.ToDto()); } [HttpPut("{id:int}")] public async Task> Update(int id, ProductSaveRequest req) { var product = await db.Products.FindAsync(id); if (product is null) return NotFound(); if (req.Name != product.Name && await db.Products.AnyAsync(p => p.Name == req.Name)) return BadRequest(new { message = "品种名称已存在" }); product.Name = req.Name; product.Category = req.Category; product.Unit = req.Unit; product.Spec = req.Spec; product.Price = req.Price; if (Enum.TryParse(req.Status, out var status)) product.Status = status; await db.SaveChangesAsync(); return Ok(product.ToDto()); } [HttpDelete("{id:int}")] public async Task Delete(int id) { var product = await db.Products.FindAsync(id); if (product is null) return NotFound(); if (await db.PurchaseOrders.AnyAsync(p => p.ProductId == id)) return BadRequest(new { message = "该品种已有收购记录,无法删除" }); db.Products.Remove(product); await db.SaveChangesAsync(); return Ok(new { message = "删除成功" }); } }