feat: 排班配置拆分为4个时段(上午2段+下午2段),独立控制开诊与人数

This commit is contained in:
2026-04-16 16:16:04 +08:00
parent dc2ba3000a
commit da704d8c83
@@ -50,17 +50,20 @@
table.schedule tbody tr:hover td:first-child{background:#EEF5FF;}
/* 时段单元格 */
.slot-cell{display:flex;align-items:center;gap:10px;}
.slot-toggle-wrap{display:flex;align-items:center;gap:6px;flex-shrink:0;}
.slot-toggle-label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;min-width:36px;}
.slot-cell{display:flex;align-items:center;gap:8px;justify-content:center;}
.slot-toggle-wrap{display:flex;align-items:center;gap:5px;flex-shrink:0;}
.slot-toggle-label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;min-width:28px;}
.slot-toggle-label.on{color:var(--success);}
.slot-divider{width:1px;height:20px;background:var(--border);flex-shrink:0;}
.slot-quota{display:flex;align-items:center;gap:6px;flex-shrink:0;}
.slot-quota{display:flex;align-items:center;gap:4px;flex-shrink:0;}
.slot-quota label{font-size:var(--font-xs);color:var(--text-secondary);white-space:nowrap;}
.slot-quota input{width:60px;height:28px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 8px;font-size:var(--font-sm);text-align:center;outline:none;color:var(--text-primary);}
.slot-quota input{width:52px;height:26px;border:1px solid var(--border);border-radius:var(--radius-sm);padding:0 6px;font-size:var(--font-sm);text-align:center;outline:none;color:var(--text-primary);}
.slot-quota input:focus{border-color:var(--primary);}
.slot-quota input:disabled{background:#F5F5F5;color:#bbb;cursor:not-allowed;}
.slot-quota span{font-size:var(--font-xs);color:var(--text-secondary);}
/* 双行表头 */
table.schedule thead th.time-group{border-bottom:1px solid var(--border);}
table.schedule thead th.time-sub{font-size:var(--font-xs);padding:6px 10px;}
/* 按钮 */
.btn{height:34px;padding:0 18px;border-radius:var(--radius-sm);font-size:var(--font-sm);cursor:pointer;border:none;transition:all .2s;display:inline-flex;align-items:center;gap:6px;}
@@ -101,9 +104,15 @@
<table class="schedule" id="scheduleTable">
<thead>
<tr>
<th>星期</th>
<th>上午</th>
<th>下午</th>
<th rowspan="2" style="width:70px;">星期</th>
<th colspan="2" class="time-group">上午</th>
<th colspan="2" class="time-group">下午</th>
</tr>
<tr>
<th class="time-sub">8:00-10:00</th>
<th class="time-sub">10:00-12:00</th>
<th class="time-sub">14:00-16:00</th>
<th class="time-sub">16:00-18:00</th>
</tr>
</thead>
<tbody id="scheduleBody"></tbody>
@@ -118,14 +127,17 @@
<script>
var days = ['周一','周二','周三','周四','周五','周六','周日'];
var slots = ['am1','am2','pm1','pm2'];
// 初始数据:前5天默认开诊,周末默认关闭
// 初始数据:工作日默认开诊,周末默认关闭
var scheduleData = days.map(function(d, i) {
var isWeekend = i >= 5;
return {
day: d,
am: { open: !isWeekend, quota: isWeekend ? 0 : 10 },
pm: { open: !isWeekend, quota: isWeekend ? 0 : 8 }
am1: { open: !isWeekend, quota: isWeekend ? 0 : 5 },
am2: { open: !isWeekend, quota: isWeekend ? 0 : 5 },
pm1: { open: !isWeekend, quota: isWeekend ? 0 : 4 },
pm2: { open: !isWeekend, quota: isWeekend ? 0 : 4 }
};
});
@@ -136,8 +148,10 @@ function renderTable() {
var tr = document.createElement('tr');
tr.innerHTML =
'<td>' + row.day + '</td>' +
'<td>' + slotHtml(i, 'am', row.am) + '</td>' +
'<td>' + slotHtml(i, 'pm', row.pm) + '</td>';
'<td>' + slotHtml(i, 'am1', row.am1) + '</td>' +
'<td>' + slotHtml(i, 'am2', row.am2) + '</td>' +
'<td>' + slotHtml(i, 'pm1', row.pm1) + '</td>' +
'<td>' + slotHtml(i, 'pm2', row.pm2) + '</td>';
tbody.appendChild(tr);
});
}
@@ -155,7 +169,6 @@ function slotHtml(dayIdx, period, slot) {
'</div>' +
'<div class="slot-divider"></div>' +
'<div class="slot-quota">' +
'<label>预约上限</label>' +
'<input type="number" id="' + id + '_quota" min="0" max="999" value="' + slot.quota + '" ' + disabled + ' oninput="updateQuota(' + dayIdx + ',\'' + period + '\',this.value)">' +
'<span>人</span>' +
'</div>' +
@@ -174,7 +187,7 @@ function toggleSlot(dayIdx, period, el) {
labelEl.textContent = '开诊';
labelEl.className = 'slot-toggle-label on';
quotaEl.disabled = false;
if (!slot.quota) { slot.quota = 10; quotaEl.value = 10; }
if (!slot.quota) { slot.quota = 5; quotaEl.value = 5; }
} else {
toggleEl.classList.remove('on');
labelEl.textContent = '休诊';