using AgriculturalPlatform.Api.Data; 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/admin")] [Authorize] public class AdminController(AppDbContext db, CurrentUserService currentUser) : ControllerBase { /// /// 创建当日演示数据:随机生成 20-60 条蚕茧收购单(已完成) /// 等级为「正茧 / 双宫 / 黄斑 / 血茧」之一,其中 95% 概率为正茧。 /// [HttpPost("demo-data")] public async Task CreateDemoData() { var rnd = Random.Shared; var now = DateTime.Now; var todayStart = now.Date; // 1. 品种:蚕茧(不存在则自动创建) var cocoon = await db.Products.FirstOrDefaultAsync(p => p.Name == "蚕茧"); if (cocoon is null) { cocoon = new Product { Name = "蚕茧", Category = "经济作物", Unit = "公斤", Spec = "鲜茧含水率≤15%", Price = 30m, CreatedAt = now }; db.Products.Add(cocoon); await db.SaveChangesAsync(); } // 2. 农户(活跃) var farmerIds = await db.Farmers .Where(f => f.Status == FarmerStatus.Active) .Select(f => f.Id).ToListAsync(); if (farmerIds.Count == 0) return BadRequest(new { message = "暂无农户数据,请先在「农户管理」中创建农户" }); // 3. 收购组织:优先当前用户所属组织(保证数据可见),否则随机 var cu = currentUser.Get(); int orgId; if (cu?.OrgId is { } oid && await db.Organizations.AnyAsync(o => o.Id == oid)) orgId = oid; else { var orgIds = await db.Organizations.Select(o => o.Id).ToListAsync(); if (orgIds.Count == 0) return BadRequest(new { message = "暂无组织数据,请先在「组织管理」中创建组织" }); orgId = orgIds[rnd.Next(orgIds.Count)]; } // 4. 随机生成 20-60 条 var count = rnd.Next(20, 61); var baseSeq = await db.PurchaseOrders.CountAsync(x => x.CreatedAt >= todayStart && x.CreatedAt < todayStart.AddDays(1)); var grades = new[] { "双宫", "黄斑", "血茧" }; var orders = new List(); for (var i = 0; i < count; i++) { // 等级:95% 正茧,其余在双宫/黄斑/血茧中随机 var grade = rnd.Next(100) < 95 ? "正茧" : grades[rnd.Next(grades.Length)]; // 单价(元/公斤)按等级定价 var unitPrice = grade switch { "正茧" => rnd.Next(2800, 3601) / 100m, // 28.00 - 36.00 "双宫" => rnd.Next(1800, 2401) / 100m, // 18.00 - 24.00 "黄斑" => rnd.Next(1000, 1501) / 100m, // 10.00 - 15.00 _ => rnd.Next(500, 901) / 100m // 血茧 5.00 - 9.00 }; // 重量:净重 15-150kg,皮重 3-9kg var net = rnd.Next(1500, 15000) / 100m; var tare = rnd.Next(300, 900) / 100m; // 时间:今日 06:00-22:00 随机进场 var weighIn = todayStart.AddHours(rnd.Next(6, 22)).AddMinutes(rnd.Next(0, 60)); var weighOut = weighIn.AddMinutes(rnd.Next(5, 25)); orders.Add(new PurchaseOrder { OrderNo = $"CG{todayStart:yyyyMMdd}-{baseSeq + i + 1:D4}", FarmerId = farmerIds[rnd.Next(farmerIds.Count)], ProductId = cocoon.Id, PurchaserOrgId = orgId, Grade = grade, Unit = "公斤", UnitPrice = unitPrice, GrossWeight = net + tare, TareWeight = tare, NetWeight = net, Amount = Math.Round(net * unitPrice, 2), WeighCount = 2, Status = PurchaseStatus.Completed, OperatorId = cu?.Id, WeighInAt = weighIn, WeighOutAt = weighOut, CreatedAt = weighIn, UpdatedAt = weighOut, Notes = "演示数据" }); } db.PurchaseOrders.AddRange(orders); await db.SaveChangesAsync(); return Ok(new { created = orders.Count, from = todayStart, to = now }); } }