4.4 KiB
东方水利制造进度驾驶舱
工业制造订单进度大屏,前端采用 React + Vite + TypeScript,后端采用 ASP.NET Core 8 + EF Core + SQL Server + SignalR。
目录
src/:驾驶舱前端。server/DongfangHydro.Dashboard.Api/:REST API、SignalR Hub、EF Core 数据模型与迁移。server/DongfangHydro.Dashboard.Tests/:聚合规则与 API 集成测试。server/docker-compose.yml:本地 SQL Server 2022 开发实例。
数据库连接
正式连接串通过环境变量提供,不需要修改源码:
$env:ConnectionStrings__DashboardDb='Server=YOUR_SERVER;Database=YOUR_DATABASE;User Id=YOUR_USER;Password=YOUR_PASSWORD;TrustServerCertificate=True'
$env:Database__AutoMigrate='true'
$env:Database__Seed='true'
首次连接正式库时,建议先保留 Database__Seed=false,确认迁移成功后再决定是否写入演示数据。已有业务数据库也可以只使用本项目表,不会修改其他表。
当前 InitialCreate 是在尚未接入任何正式 SQL Server 实例时生成的首次迁移。如果目标库已由其他版本创建过同名表,请先核对迁移历史,不要直接开启自动迁移。
本地也可以启动 Docker SQL Server:
docker compose -f .\server\docker-compose.yml up -d
启动前先设置强密码:$env:MSSQL_SA_PASSWORD='YOUR_STRONG_LOCAL_PASSWORD'。使用 Docker 数据库时,再把 ConnectionStrings__DashboardDb 设置为 Server=localhost,1433;... 的连接串;端口仅绑定本机回环地址。
启动后端
本机未全局安装 .NET 时,可使用本项目开发时安装的用户级 SDK:
& "$env:USERPROFILE\.dotnet\dotnet.exe" tool restore
& "$env:USERPROFILE\.dotnet\dotnet.exe" run --project .\server\DongfangHydro.Dashboard.Api --urls http://localhost:5080
后端默认地址:http://localhost:5080,健康检查:GET /health,SignalR:/hubs/dashboard。
导入 Excel BOM
先将 ConnectionStrings:DashboardDb 配置在环境变量或 .NET User Secrets 中。只读校验不会连接数据库:
& "$env:USERPROFILE\.dotnet\dotnet.exe" run --project .\server\DongfangHydro.Dashboard.Api -- import-bom --file "C:\path\bom.xlsx" --validate-only
校验通过后执行正式导入:
& "$env:USERPROFILE\.dotnet\dotnet.exe" run --project .\server\DongfangHydro.Dashboard.Api -- import-bom --file "C:\path\bom.xlsx" --purge-demo
导入以定额编号识别同一订单,在一个 SQL 事务中替换原订单及其 BOM、材料定额、趋势和风险数据。--purge-demo 只删除标记为 demo 的订单,不影响其他真实订单。重复导入同一文件不会累积重复节点。
同一定额编号且文件哈希未变化时,命令默认跳过替换,以免清空后续报工进度。只有确认需要重建时才追加 --force;强制导入会重置该订单的进度、趋势和风险数据。
解析器保留来源工作表、行号、原序号、规格、材质、数量、单重、总重和备注。负数量与 /、95L、21件 等源表文本通过“原文 + 可计算数值”双字段保存,不会被静默改写。
启动前端
npm install
npm run dev
如后端不是 http://localhost:5080,在本地 .env 中设置:
VITE_DASHBOARD_API_URL=http://your-api-host:port
后端不可用时,前端保留最后一次订单快照;成功连接后会通过 REST 获取完整数据,并通过 SignalR 接收增量更新。
主要接口
GET /api/dashboard/overviewGET /api/orders?keyword=&status=&lineId=&page=1&pageSize=20GET /api/orders/{orderId}GET /api/orders/{orderId}/treeGET /api/orders/{orderId}/trendGET /api/orders/{orderId}/material-quotas?category=&keyword=&page=1&pageSize=50GET /api/risk-eventsGET /api/delay-topPATCH /api/nodes/{nodeId}/progress
更新进度时应携带节点返回的 version 作为 expectedVersion;并发修改冲突会返回 409 Conflict,调用方重新获取节点后再提交。
第一版按既定范围不包含登录和权限模块。正式部署前应放在受控内网或带鉴权的反向代理之后,写接口不要直接暴露到公网。
验证
npm test
npm run lint
npm run build
& "$env:USERPROFILE\.dotnet\dotnet.exe" test .\server\DongfangHydro.Dashboard.Tests\DongfangHydro.Dashboard.Tests.csproj