Skip to content

Resource 资源负载 ​

资源负载 / 泳道视图(新组件,data 族):给定资源与任务(任务带分配的资源),渲染资源泳道(每资源一行,行内显示其被分配的任务条,共享时间轴)与负载直方图(按刻度档统计每资源并行任务数,超过容量高亮)。纯视图层——不做排程/平衡引擎;平衡以纯函数 levelResources() 导出,由宿主决定是否回写。

基础用法 ​

资源泳道 + 负载直方图:resources(含 capacity)+ tasks(含 resources 分配)

  • resources:[{ id, name, capacity? }],capacity = 该资源**每档(period)**可并行任务数(day 档即每天;缺省回落组件属性 capacity,最终 1)。
  • tasks:[{ id, name, start, end, resources?: string[] }],start/end 为 YYYY-MM-DD(仅日精度,end 含当日;带时刻的输入按当日处理),resources 为分配的资源 id 数组;指向不存在资源的分配被忽略。
  • scale:day(默认)/ week / month——决定直方图 period 粒度与刻度文案。
  • 泳道与直方图共享列宽与横向滚动;超载柱加 .over(颜色走 --oas-color-danger);同一资源内互相重叠的任务条按段堆叠显示(互不遮挡,点哪条命中哪条)。
  • 泳道间距 token --oas-resource-lane-gap 由行高与条高派生(--oas-resource-row-height 参与派生;多段轨道实高 = 段数 × 条高 +(段数 + 1)× 间距)。该 token 声明在组件宿主元素上:仅宿主元素级可覆盖——内联 style 或命中宿主元素的 class 规则(e2e 实测:宿主 class 设 --oas-resource-lane-gap:4px → 单段轨道高 36 → 28);:root / 祖先级声明不生效(宿主自身已有声明,继承值被压过)。

负载超载与资源平衡 ​

检测超载(oas-overload)→ 一键平衡:levelResources() 保工期、把超载档内较晚任务整体顺延,宿主回写 tasks

一键平衡

平衡是宿主决策:组件只导出纯函数

ts
import { levelResources } from '@oas-ui/ui'

const moved = levelResources(resources, tasks, { scale: 'day' })
// moved = 被后移的任务(新日期);宿主按 id 合并后写回
el.tasks = tasks.map((t) => moved.find((m) => m.id === t.id) ?? t)

levelResources 保证:每任务工期不变、只后移不前移、确定性(同输入同输出)、迭代至无超载或达 maxIter;不改入参。组件不自动调用。

week 档步进按周 period,而纯函数无 locale 上下文(周起始缺省周一);跨周边界的任务建议显式传 { weekStart: <与页面 locale 一致的值> }(0=周日 … 6=周六),避免与直方图周粒度判定出现边界差。

可读性(opt-in 开关) ​

可读性开关(opt-in):负载柱顶数字(show-load-values)+ 超载徽标(show-overload-badge)+ 条内任务名(bar-label)

三个开关全开:负载柱顶显示该档并行任务数(超载档红色);张三行头显示「超载 1 档」徽标;任务条内显示任务名。

三个可读性能力均为 opt-in(默认全关、零新增节点):show-load-values 在每个 load > 0 的负载柱顶显示该档并行任务数(装饰性数字,aria-hidden;超载档加 .over 走 --oas-color-danger);show-overload-badge 在超载资源的泳道行头显示「超载 N 档」徽标(可见信息,不 aria-hidden,文案随全局 locale 即时切换);bar-label 在任务条内显示任务名(纯文本渲染防注入,条窄时单行裁切;不影响 aria-label 与点击命中)。

本地化与时间定位 ​

locale="en-US"(周日起始)+ scale="week":刻度文案与周起始按 en-US 口径;scrollToDate 把时间轴滚动定位到指定日期

滚动到 03-15

实例方法 scrollToDate(date):把时间轴横向滚动定位到指定日期(YYYY-MM-DD,在可视区内水平居中,扣除左侧 sticky 资源名列宽度)。非法日期 / 无数据为空操作;RTL 布局走负值 scrollLeft 模型(同 gantt)。

服务端行窗口(windowed) ​

资源上千 / 任务十万级:宿主只喂「可视窗口附近」的资源行切片,组件不持有全量数据。行窗口按滚动位置计算,未被已装载区间覆盖时派发 oas-window-request,宿主回填后按绝对行号渲染。

属性 windowed(开启)+ total(全量资源行数)+ window-start(切片首行绝对行号)+ range-start / range-end(宿主托管时间轴范围,ISO 日期,range-end 含当日)。事件:

  • oas-window-request:detail: { start, end, reason }(半开区间、绝对行号),同一期望区间不重复派发。
  • oas-range-request:可视时间窗接近轴端时派发,detail: { startMs, endMs, reason }。
html
<oas-resource windowed total="5000" window-start="0" range-start="2026-01-01" range-end="2026-12-31"
  scale="day" height="360"></oas-resource>
<script>
  const el = document.querySelector('oas-resource[windowed]')
  el.addEventListener('oas-window-request', (e) => {
    const { start, end } = e.detail
    el.setAttribute('window-start', String(start))
    el.setAttribute('resources', JSON.stringify(fetchResources(start, end))) // 真实项目请求后端
  })
</script>

windowed 下的约定:负载/超载统计仅基于已装载切片(全量统计由宿主负责)并 devWarn;缺 range-start / range-end 时时间轴回落「已装载任务」派生并 devWarn;oas-tasks-change 的 detail.tasks 仅含切片——宿主须按 id 合并回全量,不得整体替换。

完整宿主取数配方(分段、取消在途、按 id 合并、原子回填)与可运行示例见 服务端窗口取数。

API ​

oas-resource ​

属性 ​

属性说明类型默认值
bar-label任务条内显示任务名(布尔,默认关):单行省略,窄条自动裁切;不改变 aria-label 与点击/拖拽命中boolean—
capacity资源未声明 capacity 时的缺省容量(默认 1)string1
header-sticky泳道表头纵向吸顶(默认开):滚动泳道时周/日刻度保持可见;header-sticky="false" 关闭(表头随内容滚动)。角落名列在横向滚动时始终贴边(LTR/RTL)——
height组件高度 px(默认 320;接受纯数字或 Npx):映射到自定义属性 --oas-resource-height(宿主自身 height 内联始终优先,组件不覆盖宿主内联)。height 属性在场且为合法值(>0 纯数字或 Npx)时组件接管该变量,写入宿主内联并覆盖宿主自己设置的 --oas-resource-height;空串/空白按未设置处理;非法值不写该变量、仅清除本实例此前写入的值,宿主 token 不受影响;属性移除后组件写入的值归零清除,高度回落 token 缺省 320 或宿主 CSS,宿主原先内联设置的值不恢复;从未设置 height 属性时组件不写该变量,宿主内联或 class 规则设置的 --oas-resource-height 完全不受影响string320
locale本地化(覆盖 config-provider 注入与全局 locale)string—
range-end宿主托管时间轴终点(ISO 日期 YYYY-MM-DD,含当日):与 range-start 成对使用;只有其一 / 颠倒 / 非法时忽略托管并 devWarnstring—
range-start宿主托管时间轴起点(ISO 日期 YYYY-MM-DD):提供后 period 范围不再由已装载任务推导string—
resources资源列表(JSON [{ id, name, capacity? }])——capacity = 该资源每档(period)可并行任务数(day 档即每天;缺省回落属性 capacity,最终 1);资源可带可选 color(CSS 颜色或 token,如 var(--oas-color-success)):用于该泳道任务条与负载柱着色,缺省走 --oas-resource-bar-bg / --oas-resource-load-bg 的统一色ResourceItem[][]
scale直方图 period 粒度与时间轴刻度:day(默认)/ week / month;非法回落 daystring—
show-load-values负载直方图柱顶显示该档负载数字(布尔,默认关):仅 load > 0 显示,超载档数字用 text-on-primary(浅色主题白字/暗色主题深字,压在 danger 柱身上保证对比);数字为视觉冗余(aria-hidden),读屏仍读列的负载描述boolean—
show-overload-badge泳道行头显示「超载 N 档」徽标(布尔,默认关):仅该资源存在超载档时显示,文案走 i18n resource.overBadgeboolean—
tasks资源任务(JSON [{ id, name, start, end, resources? }]);start/end 仅日精度 YYYY-MM-DD(end 含当日;带时刻输入按当日处理),resources 为分配的资源 id 数组(指向不存在资源的分配忽略)ResourceTask[][]
totalwindowed 模式下的全量资源行数;为 0 或非法时 windowed 不生效(回落本地模式)string—
window-startwindowed 模式下切片首行(资源)的绝对行号(相对全量)string0
windowed服务端行窗口模式(布尔,默认关):与 total / window-start 配合,宿主只喂可视窗口切片(按绝对行号渲染),期望行区间未被已装载覆盖时派发 oas-window-request 由宿主回填;负载/超载统计仅基于已装载切片(全量统计由宿主负责)并 devWarn;缺 range-start / range-end 时时间轴回落「已装载任务」派生并 devWarn。非 windowed 行为不变boolean—

Property(JS property;是否写回 attribute 见各行说明) ​

Property说明类型默认值
resources资源列表(读为拷贝:嵌套 plain object / array 深拷贝——循环安全;同一引用在单次读取结果内保持共享;Date 按值复制(不保持共享);类实例 / Set 等奇异对象按引用;写同步 attribute + 重渲染,含不可序列化自定义键时 attribute 仅丢弃该键,property 读回仍完整保留);资源可带可选 color(CSS 颜色或 token,如 var(--oas-color-success)):用于该泳道任务条与负载柱着色,缺省走 --oas-resource-bar-bg / --oas-resource-load-bg 的统一色ResourceItem[][]
tasks资源任务(读为拷贝:嵌套 plain object / array 深拷贝——循环安全;同一引用在单次读取结果内保持共享;Date 按值复制(不保持共享);类实例 / Set 等奇异对象按引用;写同步 attribute + 重渲染 + 派发 oas-tasks-change,含不可序列化自定义键时 attribute 仅丢弃该键,property 读回仍完整保留)ResourceTask[][]

事件 ​

事件说明
oas-overload超载态变化时派发(每次更新至多一次;同一超载态不重复派发),detail: { overloads: [{ resourceId, period, load, capacity }] }(period 为档起始日);无超载不派发
oas-range-request宿主托管时间范围(range-start/range-end)且可视时间窗接近轴端点时派发,detail: { startMs, endMs, reason }(期望的相邻范围);同一期望范围不重复派发
oas-task-click点击资源泳道内的任务条时派发,detail:
oas-tasks-change程序写 tasks property 时派发,detail: { tasks }。windowed 下 detail.tasks 仅为已装载切片:宿主须按 id 合并回全量,不得整体替换
oas-window-requestwindowed 模式下期望行窗口未被已装载区间覆盖时派发,detail: { start, end, reason }(半开区间、绝对行号;reason 为 init / scroll / resize / data);同一期望区间不重复派发

CSS 变量 ​

CSS 变量默认值
--oas-resource-bar-bgcolor-mix(in srgb, var(--oas-color-primary) 22%, var(--oas-color-bg))
--oas-resource-bar-height20px
--oas-resource-bar-hover-bgcolor-mix(in srgb, var(--oas-color-primary) 34%, var(--oas-color-bg))
--oas-resource-header-bgvar(--oas-color-bg)
--oas-resource-header-height32px
--oas-resource-height320px
--oas-resource-lane-gapmax( 0px, (var(--oas-resource-row-height, 36px) - var(--oas-resource-bar-height, 20px)) / 2 )
--oas-resource-load-bgcolor-mix(in srgb, var(--oas-color-primary) 45%, var(--oas-color-bg))
--oas-resource-load-height64px
--oas-resource-load-over-bgvar(--oas-color-danger)
--oas-resource-name-width160px
--oas-resource-row-height36px

基于 MIT OR Apache-2.0 双许可发布