using AgriculturalPlatform.Api.Data;
using AgriculturalPlatform.Api.Dtos;
using AgriculturalPlatform.Api.Models;
using AgriculturalPlatform.Api.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace AgriculturalPlatform.Api.Controllers;
[ApiController]
[Route("api/orgs")]
[Authorize]
public class OrgsController(AppDbContext db, DataScopeService scope, CurrentUserService currentUser) : ControllerBase
{
/// 组织列表(按数据权限过滤)
[HttpGet]
public async Task List(string? type, string? keyword)
{
var visible = await scope.GetVisibleOrgIdsAsync(currentUser.Get());
var query = db.Organizations.Include(o => o.Parent).AsQueryable();
if (visible is not null)
query = query.Where(o => visible.Contains(o.Id));
if (!string.IsNullOrWhiteSpace(type) && Enum.TryParse(type, out var orgType))
query = query.Where(o => o.Type == orgType);
if (!string.IsNullOrWhiteSpace(keyword))
query = query.Where(o => o.Name.Contains(keyword) || o.ContactPerson.Contains(keyword) || o.Phone.Contains(keyword));
var items = await query.OrderBy(o => o.Type).ThenBy(o => o.Id).ToListAsync();
return Ok(items.ToDtos());
}
/// 组织详情
[HttpGet("{id:int}")]
public async Task> Get(int id)
{
var org = await db.Organizations.Include(o => o.Parent).FirstOrDefaultAsync(o => o.Id == id);
if (org is null) return NotFound();
return Ok(org.ToDto());
}
/// 新增组织
[HttpPost]
public async Task> Create(OrgSaveRequest req)
{
if (!Enum.TryParse(req.Type, out var orgType))
return BadRequest(new { message = "组织类型不正确" });
var org = new Organization
{
Type = orgType,
Name = req.Name,
ParentId = req.ParentId,
ContactPerson = req.ContactPerson,
Phone = req.Phone,
Address = req.Address,
TaxNo = req.TaxNo,
IsActive = req.IsActive
};
db.Organizations.Add(org);
await db.SaveChangesAsync();
return Ok((await db.Organizations.Include(o => o.Parent).FirstAsync(o => o.Id == org.Id)).ToDto());
}
/// 修改组织
[HttpPut("{id:int}")]
public async Task> Update(int id, OrgSaveRequest req)
{
var org = await db.Organizations.FindAsync(id);
if (org is null) return NotFound();
if (Enum.TryParse(req.Type, out var orgType)) org.Type = orgType;
org.Name = req.Name;
org.ParentId = req.ParentId;
org.ContactPerson = req.ContactPerson;
org.Phone = req.Phone;
org.Address = req.Address;
org.TaxNo = req.TaxNo;
org.IsActive = req.IsActive;
await db.SaveChangesAsync();
return Ok((await db.Organizations.Include(o => o.Parent).FirstAsync(o => o.Id == org.Id)).ToDto());
}
/// 删除组织(存在关联时禁止删除)
[HttpDelete("{id:int}")]
public async Task Delete(int id)
{
var org = await db.Organizations.FindAsync(id);
if (org is null) return NotFound();
if (await db.Organizations.AnyAsync(o => o.ParentId == id))
return BadRequest(new { message = "该组织下存在下级组织,无法删除" });
if (await db.PurchaseOrders.AnyAsync(p => p.PurchaserOrgId == id))
return BadRequest(new { message = "该组织已有收购业务,无法删除" });
if (await db.Users.AnyAsync(u => u.OrgId == id))
return BadRequest(new { message = "该组织下存在用户,无法删除" });
db.Organizations.Remove(org);
await db.SaveChangesAsync();
return Ok(new { message = "删除成功" });
}
}