From 09dc74e264b6262cbe41c9c8476e24705871d4a6 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期日, 08 十一月 2026 23:31:17 +0800
Subject: [PATCH] yxh

---
 src/views/ecg/checktype/QueueSequenceForm.vue |  406 +++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 291 insertions(+), 115 deletions(-)

diff --git a/src/views/ecg/checktype/QueueSequenceForm.vue b/src/views/ecg/checktype/QueueSequenceForm.vue
index 25f1ca5..bef3e84 100644
--- a/src/views/ecg/checktype/QueueSequenceForm.vue
+++ b/src/views/ecg/checktype/QueueSequenceForm.vue
@@ -7,20 +7,24 @@
 
     鑳屾櫙锛氳琛ㄥ師鍏堟瘡澶╄嚜鍔ㄧ敓鎴愶紝鐜板凡鏀逛负鎵嬪伐缁存姢锛屾鍓嶆病鏈夌淮鎶ょ晫闈€��
   -->
-  <Dialog :title="dialogTitle" v-model="dialogVisible" width="1000px">
+  <Dialog :title="dialogTitle" v-model="dialogVisible" width="65%" >
     <!-- 椤堕儴璇存槑锛氳繖浜涘瓧娈电殑鍚箟涓�"姣忔棩閲嶇疆"鐨勫叧绯� -->
     <el-alert type="info" :closable="false" class="mb-10px">
       <template #title>
         <div class="text-13px leading-6">
           姝e湪缁存姢妫�鏌ラ」鐩細<b>{{ checkTypeName }}</b>
-          <span class="text-gray-500">锛堟鏌ラ」鐩�� {{ checkTypeValue }}锛屽叡 {{ list.length }} 涓椂娈碉級</span>
+          <span class="text-gray-500">锛堟鏌ラ」鐩�� {{ checkTypeValue }}锛屽叡 {{ slotList.length }} 涓椂娈碉級</span>
         </div>
       </template>
       <div class="text-12px leading-5">
-        路 <b>璧峰搴忓彿</b>锛氭瘡澶╄嚜鍔ㄩ噸缃椂鍥炲埌璇ュ�硷紱<b>涓婇檺</b>锛氬埌杈惧悗璇ユ椂娈佃涓恒�屽凡婊°�嶏紝鎮h�呯鍒颁細椤哄欢鍒板悗缁椂娈点��<br />
-        路 <b>褰撳墠搴忓彿</b>锛氬凡鍙戝埌鍑犲彿锛屼竴鑸棤闇�鎵嬪伐鏀癸紙姣忔棩閲嶇疆浼氳嚜鍔ㄥ洖鍒�"璧峰搴忓彿"锛夈��<br />
-        路 <b>搴忓彿涓婇檺蹇呴』澶т簬璧峰搴忓彿</b>锛屽惁鍒欒鏃舵姘歌繙鏃犳硶鍙栧彿銆�<br />
-        路 鍚屼竴妫�鏌ラ」鐩笅<b>鍚屼竴鏃舵鍙兘鏈変竴鏉¤鍒�</b>锛岄噸澶嶆坊鍔犱細琚嫆缁濄��
+        路 <b>鍙锋瑙勫垯</b>锛氭瘡涓椂娈垫寜椤哄簭鍗犵敤涓�娈佃繛缁彿 鈥斺�� 姝e父棰勭害鍙峰湪鍓嶏紝棰勭暀鍙风揣璺熷叾鍚庯紙鍙锋洿澶э級锛�
+        涓嬩竴娈典粠涓婁竴娈电殑鏈�澶у彿缁х画锛屽洜姝�<b>鍙烽殢鏃舵閫掑銆佹鍐呰繛缁�</b>銆�<br />
+        路 <b>璧峰搴忓彿</b>锛氱敱绯荤粺鑷姩璁$畻锛堜笂涓�娈电殑鏈�澶у彿锛夛紝<b>涓嶅彲鎵嬪伐淇敼</b>銆�<br />
+        路 <b>涓婇檺</b>锛氳鍙锋睜銆屽彿婊$殑鏈�澶у簭鍙枫�嶏紱<b>褰撳墠搴忓彿</b>锛氬凡鍙戝埌鍑犲彿锛堟瘡鏃ラ噸缃洖璧峰搴忓彿锛夈��<br />
+        路 <b>鍙栧彿椤哄簭</b>锛氭櫘閫氭偅鑰� 鈫� 鏈椂娈垫甯搁绾﹀彿锛涙弧浜� 鈫� 鏈椂娈�<b>棰勭暀鍙�</b>锛堢粰涓存椂鍔犲彿锛夛紱
+        鍐嶆弧 鈫� <b>鎬婚鐣欐睜</b>锛堟棤棰勭害鏃舵鐨勬偅鑰呬篃鐩存帴璧版�婚鐣欐睜锛夈��<b>鎬婚鐣欐睜涓嶈涓婇檺锛屼繚璇佷竴瀹氳兘绛惧埌銆�</b><br />
+        路 <b>棰勫畾棰濆害</b> = 涓婇檺 鈭� 璧峰搴忓彿锛堝彧璇伙級銆備笂闄� = 璧峰搴忓彿 琛ㄧず璇ュ彿姹犳棤鍚嶉锛堝厑璁镐繚瀛橈紝鏄剧ず 0 骞舵爣绾級銆�<br />
+        路 涓婇檺 <b>涓嶈兘灏忎簬</b>璧峰搴忓彿锛涘悓涓�妫�鏌ラ」鐩笅<b>鍚屼竴鏃舵鍙兘鏈変竴鏉¤鍒�</b>銆�
       </div>
     </el-alert>
 
@@ -36,110 +40,172 @@
       </span>
     </div>
 
-    <el-table v-loading="loading" :data="list" :stripe="true" border height="420px">
-      <el-table-column label="鏃舵" align="center" min-width="130px">
+    <el-table
+      v-loading="loading"
+      :data="slotList"
+      :stripe="true"
+      border
+      class="qs-table"
+      height="calc(100vh - 300px)"
+    >
+      <!-- ============ 鈶� 鏃舵 ============ -->
+      <el-table-column label="鏃舵" align="center" width="96">
         <template #default="scope">
-          <b>{{ formatTimeSlot(scope.row.timeSlot) }}</b>
-          <div class="text-11px text-gray-400">{{ scope.row.timeSlot }}</div>
+          <b class="text-12px" :title="String(scope.row.timeSlot ?? '')">
+            {{ formatTimeSlot(scope.row.timeSlot) }}
+          </b>
         </template>
       </el-table-column>
 
-      <el-table-column label="鏅��-璧峰搴忓彿" align="center" min-width="120px">
-        <template #default="scope">
-          <el-input-number
-            v-model="scope.row.queueSet"
-            :min="0"
-            :controls="false"
-            size="small"
-            style="width: 100%"
-            @change="markChanged(scope.row)"
-          />
-        </template>
-      </el-table-column>
-      <el-table-column label="鏅��-涓婇檺" align="center" min-width="110px">
-        <template #default="scope">
-          <el-input-number
-            v-model="scope.row.queueFull"
-            :min="1"
-            :controls="false"
-            size="small"
-            style="width: 100%"
-            @change="markChanged(scope.row)"
-          />
-        </template>
-      </el-table-column>
-      <el-table-column label="鏅��-褰撳墠搴忓彿" align="center" min-width="115px">
-        <template #default="scope">
-          <el-input-number
-            v-model="scope.row.queueNo"
-            :min="0"
-            :controls="false"
-            size="small"
-            style="width: 100%"
-            @change="markChanged(scope.row)"
-          />
-        </template>
+      <!-- ============ 鈶� 姝e父棰勭害 ============ -->
+      <el-table-column label="姝e父棰勭害" align="center">
+        <el-table-column label="璧峰搴忓彿" align="center" width="90">
+          <template #default="scope">
+            <!-- 銆愭湰闇�姹傘�戣捣濮嬪簭鍙� = 鍙锋璧风偣锛岀敱绯荤粺鎸夐『搴忚嚜鍔ㄨ绠楋紝涓嶅厑璁告墜宸ユ敼 -->
+            <span class="qs-fixed" :title="'绯荤粺鑷姩璁$畻锛堜笂涓�娈电殑鏈�澶у彿锛�'">
+              {{ scope.row.queueSet ?? 0 }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="涓婇檺" align="center" width="80">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.queueFull"
+              :min="0"
+              :controls="false"
+              size="small"
+              style="width: 100%"
+              @change="markChanged(scope.row)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="棰勫畾棰濆害" align="center" width="90">
+          <template #default="scope">
+            <span
+              class="qs-quota"
+              :class="{ 'qs-quota--zero': quotaOf(scope.row.queueSet, scope.row.queueFull) <= 0 }"
+              :title="`涓婇檺 ${scope.row.queueFull ?? 0} 鈭� 璧峰 ${scope.row.queueSet ?? 0}`"
+            >
+              {{ quotaOf(scope.row.queueSet, scope.row.queueFull) }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="褰撳墠搴忓彿" align="center" width="90">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.queueNo"
+              :min="0"
+              :controls="false"
+              size="small"
+              style="width: 100%"
+              @change="markChanged(scope.row)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐘舵��" align="center" width="90">
+          <template #default="scope">
+            <el-tag v-if="isFull(scope.row)" type="danger" size="small">宸叉弧</el-tag>
+            <el-tag v-else type="success" size="small">鍙彇鍙�</el-tag>
+          </template>
+        </el-table-column>
       </el-table-column>
 
-      <el-table-column label="VIP-璧峰搴忓彿" align="center" min-width="115px">
-        <template #default="scope">
-          <el-input-number
-            v-model="scope.row.queueVipSet"
-            :min="0"
-            :controls="false"
-            size="small"
-            style="width: 100%"
-            @change="markChanged(scope.row)"
-          />
-        </template>
-      </el-table-column>
-      <el-table-column label="VIP-涓婇檺" align="center" min-width="105px">
-        <template #default="scope">
-          <el-input-number
-            v-model="scope.row.queueVipFull"
-            :min="1"
-            :controls="false"
-            size="small"
-            style="width: 100%"
-            @change="markChanged(scope.row)"
-          />
-        </template>
-      </el-table-column>
-      <el-table-column label="VIP-褰撳墠搴忓彿" align="center" min-width="110px">
-        <template #default="scope">
-          <el-input-number
-            v-model="scope.row.queueVipNo"
-            :min="0"
-            :controls="false"
-            size="small"
-            style="width: 100%"
-            @change="markChanged(scope.row)"
-          />
-        </template>
+      <!-- ============ 鈶� 棰勭暀 ============ -->
+      <el-table-column label="棰勭暀" align="center">
+        <el-table-column label="璧峰搴忓彿" align="center" width="90">
+          <template #default="scope">
+            <!-- 銆愭湰闇�姹傘�戦鐣欏彿娈佃捣鐐癸紝鍚屾牱鐢辩郴缁熻嚜鍔ㄨ绠� -->
+            <span class="qs-fixed" :title="'绯荤粺鑷姩璁$畻锛堟甯搁绾︾殑涓婇檺锛�'">
+              {{ scope.row.queueVipSet ?? 0 }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="涓婇檺" align="center" width="80">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.queueVipFull"
+              :min="0"
+              :controls="false"
+              size="small"
+              style="width: 100%"
+              @change="markChanged(scope.row)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="棰勫畾棰濆害" align="center" width="90">
+          <template #default="scope">
+            <span
+              class="qs-quota"
+              :class="{ 'qs-quota--zero': quotaOf(scope.row.queueVipSet, scope.row.queueVipFull) <= 0 }"
+              :title="`涓婇檺 ${scope.row.queueVipFull ?? 0} 鈭� 璧峰 ${scope.row.queueVipSet ?? 0}`"
+            >
+              {{ quotaOf(scope.row.queueVipSet, scope.row.queueVipFull) }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="褰撳墠搴忓彿" align="center" width="90">
+          <template #default="scope">
+            <el-input-number
+              v-model="scope.row.queueVipNo"
+              :min="0"
+              :controls="false"
+              size="small"
+              style="width: 100%"
+              @change="markChanged(scope.row)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐘舵��" align="center" width="90">
+          <template #default="scope">
+            <el-tag v-if="isFullVip(scope.row)" type="danger" size="small">宸叉弧</el-tag>
+            <el-tag v-else type="success" size="small">鍙彇鍙�</el-tag>
+          </template>
+        </el-table-column>
       </el-table-column>
 
-      <el-table-column label="鐘舵��" align="center" width="90px">
-        <template #default="scope">
-          <el-tag v-if="isFull(scope.row)" type="danger" size="small">宸叉弧</el-tag>
-          <el-tag v-else type="success" size="small">鍙彇鍙�</el-tag>
-        </template>
-      </el-table-column>
-
-      <el-table-column label="鎿嶄綔" align="center" width="140px" fixed="right">
+      <!-- ============ 鈶� 鎿嶄綔 ============ -->
+      <el-table-column label="鎿嶄綔" align="center" width="160" fixed="right">
         <template #default="scope">
           <el-button
             link
             type="primary"
             :loading="savingId === scope.row.id"
+           
             @click="handleRowSave(scope.row)"
           >
             淇濆瓨
           </el-button>
-          <el-button link type="primary" @click="openForm('update', scope.row)">缂栬緫</el-button>
-          <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+          <el-button link type="primary" @click="openForm('update', scope.row)">
+            缂栬緫
+          </el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)">
+            鍒犻櫎
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
+
+    <!--
+      銆愭湰闇�姹傘�戞�婚鐣欐睜锛坱ime_slot = 0锛�
+      路 鏈鏅�氬彿 + 鏈棰勭暀鍙烽兘鍙戝畬锛屾垨鎮h�呮病鏈夐绾︽椂娈垫椂锛屼粠鎬婚鐣欐睜鍙栧彿锛�
+      路 鍙锋鏀惧湪褰撳ぉ鎵�鏈夋椂娈典箣鍚庯紙鍙锋渶澶� 鈬� 鎺掑叏澶╂渶鍚庯級锛屼笖**涓嶈涓婇檺**锛堟案杩滀笉浼氭弧锛夈��
+    -->
+    <el-alert type="warning" :closable="false" class="mt-10px">
+      <template #title>
+        <div class="text-13px">
+          鎬婚鐣欐睜锛堟棤鏃舵 / 鎵�鏈夊彿婧愮敤灏芥椂鐨勫厹搴曪級锛�
+          <template v-if="totalPool">
+            璧峰 <b>{{ totalPool.queueVipSet ?? 0 }}</b> 路
+            宸插彂 <b>{{ totalPool.queueVipNo ?? 0 }}</b> 路
+            涓婇檺 <b>{{ totalPool.queueVipFull ?? 0 }}</b>
+            <span class="text-gray-500">锛堜笉璁句笂闄愶紝婊″悗鑷姩缁х画鍙戝彿锛屼繚璇佷竴瀹氳兘绛惧埌锛�</span>
+          </template>
+          <template v-else>
+            <span class="text-gray-500">灏氭湭鍒濆鍖栵紙棣栨绛惧埌鏃剁郴缁熶細鑷姩鍒涘缓锛屽彿娈垫帴鍦ㄥ綋澶╂渶鍚庝竴娈典箣鍚庯級</span>
+          </template>
+        </div>
+      </template>
+    </el-alert>
 
     <!-- 鏂板 / 缂栬緫琛ㄥ崟 -->
     <Dialog v-model="formVisible" :title="formTitle" width="520px" append-to-body>
@@ -170,25 +236,35 @@
             閫夐」鏉ヨ嚜瀛楀吀 <code>ecg_book_timeslot</code>锛涗篃鏀寔鐩存帴杈撳叆璧峰/缁撴潫鏃堕棿鍚庡洖杞︽柊寤恒��
           </div>
         </el-form-item>
-        <el-form-item label="鏅��-璧峰搴忓彿" prop="queueSet">
-          <el-input-number v-model="formData.queueSet" :min="0" class="w-full" />
-        </el-form-item>
-        <el-form-item label="鏅��-涓婇檺" prop="queueFull">
-          <el-input-number v-model="formData.queueFull" :min="1" class="w-full" />
-        </el-form-item>
-        <el-form-item label="VIP-璧峰搴忓彿" prop="queueVipSet">
-          <el-input-number v-model="formData.queueVipSet" :min="0" class="w-full" />
-        </el-form-item>
-        <el-form-item label="VIP-涓婇檺" prop="queueVipFull">
-          <el-input-number v-model="formData.queueVipFull" :min="1" class="w-full" />
-        </el-form-item>
-        <el-form-item label="鏅��-褰撳墠搴忓彿">
-          <el-input-number v-model="formData.queueNo" :min="0" class="w-full" />
+        <el-form-item label="姝e父棰勭害-璧峰搴忓彿" prop="queueSet">
+          <!-- 銆愭湰闇�姹傘�戣捣濮嬪簭鍙� = 鍙锋璧风偣锛岀敱绯荤粺鎸夈�屾鏌ョ被鍨� 鈫� 鏃舵椤哄簭銆嶈嚜鍔ㄨ绠楋紝涓嶅彲鎵嬪伐鏀� -->
+          <el-input-number v-model="formData.queueSet" :min="0" class="w-full" disabled />
           <div class="text-12px text-gray-500 leading-5 mt-1">
-            鏂板鏃舵鏃跺缓璁笌銆屾櫘閫�-璧峰搴忓彿銆嶄竴鑷淬��
+            绯荤粺鑷姩璁$畻锛�= 涓婁竴娈电殑鏈�澶у彿锛夛紝涓嶉渶瑕佸~鍐欍��
           </div>
         </el-form-item>
-        <el-form-item label="VIP-褰撳墠搴忓彿">
+        <el-form-item label="姝e父棰勭害-涓婇檺" prop="queueFull">
+          <!-- 銆愭湰娆¢渶姹傘�戜笂闄愬厑璁哥瓑浜庤捣濮嬪簭鍙凤紙=璇ユ椂娈垫棤鍚嶉锛夛紝鏁� min 鏀逛负 0 -->
+          <el-input-number v-model="formData.queueFull" :min="0" class="w-full" />
+        </el-form-item>
+        <el-form-item label="棰勭暀-璧峰搴忓彿" prop="queueVipSet">
+          <!-- 銆愭湰闇�姹傘�戦鐣欏彿娈电揣璺熸甯搁绾﹀彿娈典箣鍚庯紝鐢辩郴缁熻嚜鍔ㄨ绠� -->
+          <el-input-number v-model="formData.queueVipSet" :min="0" class="w-full" disabled />
+          <div class="text-12px text-gray-500 leading-5 mt-1">
+            绯荤粺鑷姩璁$畻锛�= 姝e父棰勭害鐨勪笂闄愶級锛屼笉闇�瑕佸~鍐欍��
+          </div>
+        </el-form-item>
+        <el-form-item label="棰勭暀-涓婇檺" prop="queueVipFull">
+          <!-- 銆愭湰娆¢渶姹傘�戝悓鏅�氫笂闄愶細鍏佽绛変簬璧峰搴忓彿 -->
+          <el-input-number v-model="formData.queueVipFull" :min="0" class="w-full" />
+        </el-form-item>
+        <el-form-item label="姝e父棰勭害-褰撳墠搴忓彿">
+          <el-input-number v-model="formData.queueNo" :min="0" class="w-full" />
+          <div class="text-12px text-gray-500 leading-5 mt-1">
+            鏂板鏃舵鏃跺缓璁笌銆屾甯搁绾�-璧峰搴忓彿銆嶄竴鑷淬��
+          </div>
+        </el-form-item>
+        <el-form-item label="棰勭暀-褰撳墠搴忓彿">
           <el-input-number v-model="formData.queueVipNo" :min="0" class="w-full" />
         </el-form-item>
       </el-form>
@@ -214,7 +290,6 @@
 defineOptions({ name: 'QueueSequenceForm' })
 
 const message = useMessage() // 娑堟伅寮圭獥
-
 const dialogVisible = ref(false) // 涓诲脊绐�
 const loading = ref(false) // 鍒楄〃鍔犺浇涓�
 const list = ref<QueueSequenceVO[]>([]) // 鏌愭鏌ラ」鐩笅鐨勫叏閮ㄦ椂娈�
@@ -222,11 +297,23 @@
 const checkTypeName = ref<string>('') // 妫�鏌ラ」鐩悕绉帮紙浠呯敤浜庡睍绀猴級
 const changedRows = ref<Set<number>>(new Set()) // 宸茶鏀瑰姩浣嗘湭淇濆瓨鐨勮 id
 const savingId = ref<number>() // 姝e湪淇濆瓨鐨勮 id
-
 const dialogTitle = computed(
   () => `棰勭害鏃舵缁存姢${checkTypeName.value ? ' - ' + checkTypeName.value : ''}`
 )
 const changedCount = computed(() => changedRows.value.size)
+
+/**
+ * 銆愭湰闇�姹傘�戣〃鏍煎彧鏄剧ず"鐪熷疄鏃舵"锛坱ime_slot <> 0锛夛紱
+ * time_slot = 0 鐨勯偅涓�琛屾槸銆屾�婚鐣欐睜銆嶏紙鏃犳椂娈� / 鍏ㄦ弧鏃剁殑鍏滃簳鍙锋睜锛夛紝鍗曠嫭鍦ㄨ〃鏍间笅鏂瑰睍绀恒��
+ */
+const slotList = computed(() =>
+  (list.value || []).filter((r: QueueSequenceVO) => Number(r.timeSlot ?? 0) !== 0)
+)
+
+/** 鎬婚鐣欐睜琛岋紙time_slot = 0锛夛紱鏈垵濮嬪寲鏃朵负 undefined */
+const totalPool = computed(() =>
+  (list.value || []).find((r: QueueSequenceVO) => Number(r.timeSlot ?? 0) === 0)
+)
 
 /** 鏃舵涓嬫媺閫夐」锛氬彇鑷瓧鍏� ecg_book_timeslot锛坴alue 涓� HHMMHHMM 鏁板瓧瀛楃涓诧紝label 褰㈠ 08:00-08:30锛� */
 const timeSlotOptions = computed(() => {
@@ -258,8 +345,23 @@
     {
       validator: (_rule: any, value: any, callback: any) => {
         const set = formData.value.queueSet
-        if (value !== undefined && value !== null && set !== undefined && set !== null && value <= set) {
-          callback(new Error('涓婇檺蹇呴』澶т簬璧峰搴忓彿锛屽惁鍒欒鏃舵鏃犳硶鍙栧彿'))
+        // 銆愭湰娆¢渶姹傘�戜笂闄� = 璧峰搴忓彿 鏄�**鍚堟硶**鐨勶細琛ㄧず璇ユ椂娈垫病鏈夊悕棰濓紙棰勫畾棰濆害 0锛夛紝鍏佽淇濆瓨銆�
+        // 鍙湁銆屼笂闄� < 璧峰搴忓彿銆嶆墠鏄厤缃敊璇紙璇ユ椂娈垫案杩滄棤娉曞彇鍙凤級銆�
+        if (value !== undefined && value !== null && set !== undefined && set !== null && value < set) {
+          callback(new Error('涓婇檺涓嶈兘灏忎簬璧峰搴忓彿锛堢瓑浜庤〃绀鸿鏃舵娌℃湁鍚嶉锛�'))
+        } else {
+          callback()
+        }
+      },
+      trigger: 'blur'
+    }
+  ],
+  queueVipFull: [
+    {
+      validator: (_rule: any, value: any, callback: any) => {
+        const set = formData.value.queueVipSet
+        if (value !== undefined && value !== null && set !== undefined && set !== null && value < set) {
+          callback(new Error('棰勭暀涓婇檺涓嶈兘灏忎簬棰勭暀璧峰搴忓彿锛堢瓑浜庤〃绀洪鐣欐病鏈夊悕棰濓級'))
         } else {
           callback()
         }
@@ -308,15 +410,47 @@
   }
 }
 
-/** 璇ユ椂娈垫槸鍚﹀凡婊★紙褰撳墠搴忓彿 >= 涓婇檺锛� */
-const isFull = (row: QueueSequenceVO) =>
-  (row.queueNo ?? 0) >= (row.queueFull ?? 0) && (row.queueFull ?? 0) > 0
+/**
+ * 棰勫畾棰濆害 = 涓婇檺 鈭� 璧峰搴忓彿锛堝皬浜� 0 鎸� 0 鏄剧ず锛夈��
+ *
+ * 銆愭湰娆¢渶姹傘�戣鍒楀彧璇伙紝鍊间负 0 鏃跺崟鍏冩牸娴呯孩搴� 鈥斺�� 琛ㄧず杩欎釜鏃舵**娌℃湁鍚嶉**銆�
+ * 銆屼笂闄� = 璧峰搴忓彿銆嶆槸鍚堟硶閰嶇疆锛堟棤鍚嶉鏃舵锛夛紝涓嶅啀褰撲綔閿欒銆�
+ */
+const quotaOf = (set?: number | null, full?: number | null) =>
+  Math.max(0, (full ?? 0) - (set ?? 0))
+
+/**
+ * 璇ユ椂娈垫槸鍚﹀凡婊★紙姝e父棰勭害锛夈��
+ *
+ * 婊$殑涓ょ鎯呭舰锛�
+ *  鈶� 棰勫畾棰濆害 <= 0锛堜笂闄� <= 璧峰搴忓彿锛夆啋 鏈潵灏辨病鏈夊悕棰濓紱
+ *  鈶� 褰撳墠搴忓彿宸茶揪鍒颁笂闄愩��
+ */
+const isFull = (row: QueueSequenceVO) => {
+  if (quotaOf(row.queueSet, row.queueFull) <= 0) return true
+  return (row.queueNo ?? 0) >= (row.queueFull ?? 0)
+}
+
+/** 璇ユ椂娈垫槸鍚﹀凡婊★紙棰勭暀缁勶級锛屽彛寰勫悓涓� */
+const isFullVip = (row: QueueSequenceVO) => {
+  if (quotaOf(row.queueVipSet, row.queueVipFull) <= 0) return true
+  return (row.queueVipNo ?? 0) >= (row.queueVipFull ?? 0)
+}
 
 /** 琛屽唴淇濆瓨锛堝彧鏀规暟鍊硷紝涓嶅姩鏃舵锛� */
 const handleRowSave = async (row: QueueSequenceVO) => {
   if (!row.id) return
-  if ((row.queueFull ?? 0) <= (row.queueSet ?? 0)) {
-    message.error(`鏃舵 ${formatTimeSlot(row.timeSlot)}锛氫笂闄愬繀椤诲ぇ浜庤捣濮嬪簭鍙穈)
+  // 銆愭湰娆¢渶姹傘�戝彧鏈夈�屼笂闄� < 璧峰搴忓彿銆嶆墠鏄敊璇紱鐩哥瓑琛ㄧず璇ユ椂娈垫病鏈夊悕棰濓紝鍏佽淇濆瓨銆�
+  if ((row.queueFull ?? 0) < (row.queueSet ?? 0)) {
+    message.error(
+      `鏃舵 ${formatTimeSlot(row.timeSlot)}锛氫笂闄愪笉鑳藉皬浜庤捣濮嬪簭鍙凤紙绛変簬琛ㄧず璇ユ椂娈垫病鏈夊悕棰濓級`
+    )
+    return
+  }
+  if ((row.queueVipFull ?? 0) < (row.queueVipSet ?? 0)) {
+    message.error(
+      `鏃舵 ${formatTimeSlot(row.timeSlot)}锛氶鐣欎笂闄愪笉鑳藉皬浜庨鐣欒捣濮嬪簭鍙凤紙绛変簬琛ㄧず棰勭暀娌℃湁鍚嶉锛塦
+    )
     return
   }
   savingId.value = row.id
@@ -390,3 +524,45 @@
   await getList()
 }
 </script>
+
+<style scoped lang="scss">
+/*
+  銆愭湰娆¤皟鏁淬�戝瓧鍙锋仮澶嶄负绯荤粺榛樿锛�**鍏佽妯悜婊氬姩**锛�
+    路 涓嶅啀鍘嬬缉瀛楀彿涓庡唴杈硅窛 鈥斺�� 琛ㄤ綋鎭㈠榛樿瀛楀彿锛�14px锛夈�佽緭鍏ユ榛樿瀛楀彿銆佺姸鎬佹爣绛剧敤 small 榛樿鏍峰紡锛�
+    路 鍒楀鐢辨ā鏉垮浐瀹氾紙鏃舵 96 + 姝e父棰勭害 5 鍒� + 棰勭暀 5 鍒� + 鎿嶄綔 160锛夛紱
+      鎬诲瓒呰繃寮圭獥瀹藉害鏃惰〃鏍煎嚭鐜�**妯悜婊氬姩鏉�**锛屾搷浣滃垪 fixed="right" 濮嬬粓鍙锛�
+    路 琛ㄦ牸楂樺害 calc(100vh - 300px)锛氱珫鍚戝鏄剧ず鍑犺锛岄〉闈㈡湰韬笉鍑虹幇婊氬姩鏉°��
+*/
+.qs-table {
+  /* 琛屽唴鏁板瓧杈撳叆鍗犳弧鍗曞厓鏍硷紙涓嶇缉灏忓瓧鍙凤紝鍙帶鍒跺搴︼級 */
+  :deep(.el-input-number) {
+    width: 100%;
+  }
+}
+
+/* 棰勫畾棰濆害锛堝彧璇伙級锛氬�间负 0 鏃舵祬绾㈠簳锛岃〃绀鸿鏃舵娌℃湁鍚嶉 */
+/* 銆愭湰闇�姹傘�戝彿娈佃捣鐐癸紙绯荤粺鑷姩璁$畻锛屽彧璇诲睍绀猴級 */
+.qs-fixed {
+  display: inline-block;
+  min-width: 34px;
+  padding: 1px 4px;
+  border-radius: 3px;
+  color: var(--el-text-color-secondary);
+  background-color: var(--el-fill-color-light);
+  font-variant-numeric: tabular-nums;
+}
+.qs-quota {
+  display: inline-block;
+  padding: 1px 6px;
+  border-radius: 3px;
+  font-weight: 600;
+  font-variant-numeric: tabular-nums;
+  color: var(--el-text-color-primary);
+}
+
+.qs-quota--zero {
+  color: var(--el-color-danger);
+  background-color: var(--el-color-danger-light-9);
+  box-shadow: inset 0 0 0 1px var(--el-color-danger-light-5);
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3