快乐的昕的电脑
2025-11-19 ec6ce3c1218555e1b10bf5679cf26893ccde584c
components/WorkOrderPrint.vue
@@ -1,8 +1,55 @@
<template>
   <view class="page wide-layout" :class="{'has-overlay': (isShowUserSelect || isShow || barcodeIsShow)}">
      <view class="status-section">
         <!-- 报工记录表部分,在标题行添加刷新按钮 -->
         <view class="report-table-wrapper">
            <view class="report-title">报工记录表</view>
            <view class="report-header">
               <view class="report-title">报工记录表</view>
               <view class="header-buttons">
                  <button class="refresh-btn-header" @click="refresh">刷新</button>
                  <button v-if="isGeneratingBarcode" class="reset-btn-header" @click="resetGenerateState">重置</button>
               </view>
            </view>
            <!-- 数采总产量 -->
            <view class="section-title">当前数采产量报工记录</view>
            <div class="table-scroll">
               <table class="report-table">
                  <thead>
                     <tr>
                        <th>时间</th>
                        <th>报工人</th>
                        <th>工单号</th>
                        <th>产品名称</th>
                        <th>计划生产数</th>
                        <th>机台号</th>
                        <th>初始采集数</th>
                        <th>报工时采集数</th>
                        <th>基于数采的报工数</th>
                        <th>不良数</th>
                        <th>良品数(计算)</th>
                     </tr>
                  </thead>
                  <tbody>
                     <tr class="summary-row highlight-row">
                        <td>{{ nowTime }}</td>
                        <td>{{ staffDisplay || '-' }}</td>
                        <td>{{ orderNo || '-' }}</td>
                        <td>{{ order.daa003 || '-' }}</td>
                        <td>{{ planQtyDisplay }}</td>
                        <td>{{ machineNo || '-' }}</td>
                        <td>{{ order.initCjNum }}</td>
                        <td>{{ order.currentCjNum }}</td>
                        <td>{{ order.currentCjNum - order.initCjNum }}</td>
                        <td>{{ realTimeDefectiveCount }}</td>
                        <td>{{ realTimeOkCount }}</td>
                     </tr>
                  </tbody>
               </table>
            </div>
            <!-- 历史报工记录 -->
            <view class="section-title history-title">历史报工记录</view>
            <div class="table-scroll">
               <table class="report-table">
                  <thead>
@@ -21,33 +68,18 @@
                     </tr>
                  </thead>
                  <tbody>
                     <!-- 当前实时统计(保持原来单行) -->
                     <tr class="summary-row">
                        <td>{{ nowTime }}</td>
                        <td>{{ staffDisplay || '-' }}</td>
                        <td>{{ orderNo || '-' }}</td>
                        <td>{{ order.daa003 || '-' }}</td>
                        <td>{{ planQtyDisplay }}</td>
                        <td>{{ machineNo || '-' }}</td>
                        <td>{{ initialValue }}</td>
                        <td>{{ productionCount }}</td>
                        <td>{{ calculatedTotalProduction }}</td>
                        <td>{{ calculatedDefectiveCount }}</td>
                        <td>{{ sQuantity }}</td>
                     </tr>
                     <!-- 历史报工记录行 -->
                     <tr v-for="(r, idx) in reportingHistory" :key="idx">
                        <td>{{ r.time }}</td>
                        <td>{{ r.bgDate }}</td>
                        <td>{{ r.staff || '-' }}</td>
                        <td>{{ r.orderNo || '-' }}</td>
                        <td>{{ r.productName || '-' }}</td>
                        <td>{{ r.planQty }}</td>
                        <td>{{ order.daa003 || '-' }}</td>
                        <td>{{ planQtyDisplay }}</td>
                        <td>{{ r.machineNo || '-' }}</td>
                        <td>{{ r.initialValue }}</td>
                        <td>{{ r.productionCount }}</td>
                        <td>{{ r.totalProduction }}</td>
                        <td>{{ r.defective }}</td>
                        <td>{{ r.good }}</td>
                        <td>{{ r.BfQty }}</td>
                        <td>{{ r.OkQty }}</td>
                     </tr>
                     <tr v-if="!reportingHistory.length">
                        <td colspan="11" class="no-data">暂无历史报工记录</td>
@@ -57,9 +89,9 @@
            </div>
         </view>
         <!-- 下面原有内容保持不变 -->
         <!-- 移除了原来的状态行中的按钮组 -->
         <view class="status-row">
            <view class="status-box">
            <!--<view class="status-box">
               <text>机台面板数:</text>
               <input v-model="productionCount" class="highlight" disabled />
            </view>
@@ -80,30 +112,26 @@
            <view class="status-box result-box">
               <text>已生产数:</text>
               <input v-model="calculatedTotalProduction" class="highlight" disabled />
            </view>
            <view class="btn-group">
               <button class="refresh-btn-inline" @click="refresh">刷新</button>
               <button v-if="isGeneratingBarcode" class="reset-btn-inline" @click="resetGenerateState">重置</button>
            </view>
            </view>-->
         </view>
         <view class="flex-row gap-lg">
            <view class="print-section flex-grow">
               <view class="barcode-info">
                  <view class="user-select">
                     <text>不良数量:</text>
                     <input v-model="customAmount" class="inp bad-input" placeholder="请输入数量" />
                  </view>
                  <view class="user-select">
                     <button class="details-btn" @click="confirmCustomAmount">确认提交</button>
                  </view>
               </view>
            </view>
            <view class="current-user-section fill-width">
            <!-- 当前报工人部分 -->
            <view class="current-user-section">
               <text>当前报工人:</text>
               <text class="current-user-name">{{ staffDisplay || '未选择' }}</text>
               <button class="select-user-btn" @click="isShowUserSelect = true">选人</button>
            </view>
            <!-- 不良数量部分 -->
            <view class="defective-section">
               <text>不良数量:</text>
               <input v-model="customAmount" class="inp bad-input" placeholder="请输入数量" />
            </view>
            <!-- 确认提交按钮 -->
            <view class="submit-section">
               <button class="details-btn" @click="confirmCustomAmount">确认提交</button>
            </view>
         </view>
@@ -120,7 +148,7 @@
                  <button v-if="userSearch" class="user-search-clear" @click="userSearch=''">清空</button>
                  <view class="user-search-info">
                     匹配:{{ filteredUsers.length }} / {{ users.length }}
                  </view>
         </view>
               </view>
               <view class="user-list-scroll">
                  <template v-if="filteredUsers.length">
@@ -144,11 +172,11 @@
            </view>
         </view>
         <view class="bottom-section">
         <!-- 禁用按钮:‘保存并生效'、‘取消’ -->
         <!--<view class="bottom-section">
            <button class="save-btn" @click="save">保存并生效</button>
            <button class="cancel-btn" @click="cancel">取消</button>
         </view>
         </view>-->
         <!-- 保留旧弹窗 -->
         <view v-if="isShow" class="overlay">
            <view class="popup">
@@ -216,8 +244,20 @@
         }
      },
      computed: {
         //良品数实时计算
         realTimeDefectiveCount() {
            // 优先用输入框的值,否则用接口数据
            const val = Number(this.customAmount);
            if (!isNaN(val) && this.customAmount !== '') return val;
            return this.calculatedDefectiveCount;
         },
         realTimeOkCount() {
            // 良品数 = 报工数(计算) - 不良数
            const total = (this.order.currentCjNum || 0) - (this.order.initCjNum || 0);
            return total - this.realTimeDefectiveCount;
         },
         calculatedCurrentCount() { return (this.productionCount || 0) - (this.initialValue || 0); },
         calculatedTotalProduction() { return (this.kgQty || 0); }, // 若需要恢复之前逻辑可改为 (this.kgQty||0)+this.calculatedCurrentCount
         calculatedTotalProduction() { return (this.kgQty || 0); }, // 若需恢复旧逻辑可用 (this.kgQty||0)+this.calculatedCurrentCount
         calculatedDefectiveCount() { return this.calculatedTotalProduction - (this.sQuantity || 0); },
         planQtyDisplay() { return this.order.planQty || this.order.planQuantity || this.order.daa008 || 0; },
         staffDisplay() {
@@ -237,7 +277,8 @@
         this.init();
         this.getXS0101();
         this.updateNowTime();
         this.nowTimeTimer = setInterval(this.updateNowTime, 60000);
         // 秒级刷新;如不需动态跳秒可改为 60000
         this.nowTimeTimer = setInterval(this.updateNowTime, 1000);
      },
      beforeDestroy() { if (this.nowTimeTimer) clearInterval(this.nowTimeTimer); },
      methods: {
@@ -247,9 +288,10 @@
            return segs.length > 1 ? `${segs[0]} ${segs[1]}` : u;
         },
         selectUser(u) { this.staffNo = u; this.isShowUserSelect = false; this.userSearch = ''; },
         /* 修改:增加秒 */
         updateNowTime() {
            const d = new Date(), p = n => n.toString().padStart(2, '0');
            this.nowTime = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
            this.nowTime = `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
         },
         initializeData() {
            this.productionCount = this.printedCount = this.defectiveCount = 0;
@@ -263,7 +305,7 @@
         },
         refresh() {
            this.$sendPostRequest({
               url: "http://192.168.0.94:9095/Numerical/RefreshDev",
               url: "http://192.168.0.94:9095/Numerical/RefreshDevBycl",
               data: { machineNo: this.order.machineNo },
               contentType: "application/json"
            }).then(r => { r.code == 200 ? this.fetchData(true) : this.$showMessage("同步失败"); });
@@ -290,29 +332,34 @@
            }
         },
         /* 新增:获取历史报工记录 */
         /* 修改:规范历史时间到秒 */
         getReportingHistory() {
            if (!this.orderNo) { this.reportingHistory = []; return; }
                this.$post({
                    url: "/Womdaa/GetByBillNoBG",
                    data: { billNo: this.orderNo, machineNo: this.machineNo || null }
                })
            const fmtSec = v => {
               if (!v) return '';
               // 兼容后端可能返回的不同格式
               const d = new Date(typeof v === 'string' ? v.replace(/-/g, '/') : v);
               if (isNaN(d.getTime())) return v; // 无法解析则原样返回
               const p = n => n.toString().padStart(2, '0');
               return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
            };
            this.$post({
               url: "/Womdaa/GetByBillNoBG",
               data: { billNo: this.orderNo, machineNo: this.machineNo || null }
            }).then(res => {
               const list = res?.data?.tbBillList || res?.data || [];
               this.reportingHistory = list.map(r => {
                  // 依据你数据库字段做映射(下面字段名按常见命名举例,需要按实际改)
                  return {
                     time: r.bgDate || r.startTime || r.createTime || '',        // 开始时间
                     staff: (r.staffNo ? (r.staffNo + ' ' + (r.staffName || '')) : (r.staffName || '')),
                     orderNo: r.billNo || this.orderNo,
                     productName: r.daa003 || this.order?.daa003,
                     planQty: this.planQtyDisplay,
                     machineNo: r.machineNo || this.machineNo,
                     initialValue: r.initialValue ?? 0,
                     productionCount: r.productionCount ?? r.todayOutput ?? 0,
                     totalProduction: r.kgQty ?? r.totalProduction ?? 0,
                     good: r.sQuantity ?? r.okQty ?? 0,
                     defective: (r.defectiveQty ??
                        ((r.kgQty ?? r.totalProduction ?? 0) - (r.sQuantity ?? r.okQty ?? 0)))
                     bgDate: r.bgDate || '', // 报工时间
                     staff: (r.staffNo ? (r.staffNo + ' ' + (r.staffName || '')) : (r.staffName || '')),//报工人
                     orderNo: r.billNo,//工单号
                     machineNo: r.machineNo,//机台号
                     initialValue: r.csQty ?? 0,//初始采集数
                     productionCount: r.cjQty ?? 0,//报工时采集数
                     totalProduction: (r.cjQty - r.csQty) ?? 0,//报工数(计算)
                     BfQty: r.bfQty,//不良数
                     OkQty: r.okQty//良品数(计算)
                  }
               });
            }).catch(() => { this.reportingHistory = []; });
@@ -322,6 +369,7 @@
            this.user = this.user === u ? null : u;
            this.staffNo = this.user;
         },
         //选择报工人
         confirmCustomAmount() {
            if (!this.customAmount || isNaN(Number(this.customAmount))) { this.$showMessage('请输入有效的数量'); return; }
            if (!this.staffNo) { this.$showMessage('请选择报工人'); return; }
@@ -333,7 +381,9 @@
                  orderNo: this.orderNo,
                  orderId: this.orderId,
                  bf: amount,
                  staffNo: staffNo
                  staffNo: staffNo,
                  initCjNum: this.order.initCjNum,        // 初始采集数
                  currentCjNum: this.order.currentCjNum   // 报工时采集数
               }
            }).then(res => {
               if (res.status == 1) { this.$showMessage(res.message); return; }
@@ -438,475 +488,587 @@
</script>
<style scoped>
   /* 原样式保持,新增几行辅助样式 */
   .report-table .summary-row {
      background: #f0f8ff;
      font-weight: 600;
   }
    .section-title {
        font-size: 20px;
        font-weight: bold;
        margin: 18px 0 8px 0;
        color: #fff;
        background: #007aff;
        padding: 8px 18px;
        border-radius: 8px 8px 0 0;
        display: inline-block;
    }
   .report-table .no-data {
      text-align: center;
      color: #777;
      font-size: 14px;
   }
   /* 其余样式保持不变 */
    .history-title {
        background: #555;
    }
   .page {
      padding: 1.2vh 2vw;
      display: flex;
      flex-direction: column;
      box-sizing: border-box;
   }
    .highlight-row {
        background: #ffe9b3 !important;
        font-weight: bold;
    }
   .wide-layout {
      max-width: 1600px;
      margin: 0 auto;
   }
    .report-table .summary-row {
        background: #f0f8ff;
        font-weight: 600;
    }
   .page.has-overlay .status-section > :not(.overlay) {
      pointer-events: none;
   }
    .report-table .no-data {
        text-align: center;
        color: #777;
        font-size: 14px;
    }
   .page.has-overlay .status-section > .overlay {
      pointer-events: auto;
   }
    .report-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 8px;
    }
   .report-table-wrapper {
      margin-bottom: 12px;
   }
    .header-buttons {
        display: flex;
        align-items: center;
        gap: 12px;
    }
   .table-scroll {
      overflow-x: auto;
   }
    .refresh-btn-header {
        background: #00A2E9;
        color: #fff;
        border: none;
        font-size: 16px;
        border-radius: 8px;
        padding: 8px 20px;
        transition: background 0.15s;
    }
   .report-title {
      font-size: 24px;
      font-weight: 600;
      text-align: center;
      margin: 0 0 8px;
   }
        .refresh-btn-header:hover {
            background: #0086c0;
        }
   .report-table {
      min-width: 1080px;
      width: 100%;
      border-collapse: collapse;
      font-size: 14px;
      background: #fff;
   }
    .reset-btn-header {
        background: #ff6b6b;
        color: #fff;
        border: none;
        font-size: 14px;
        border-radius: 8px;
        padding: 8px 16px;
        transition: background 0.15s;
    }
      .report-table th, .report-table td {
         border: 1px solid #555;
         padding: 6px 8px;
         text-align: center;
         white-space: nowrap;
      }
        .reset-btn-header:hover {
            background: #e94d4d;
        }
   .status-section {
      display: flex;
      flex-direction: column;
      gap: 10px;
   }
    .page {
        padding: 1.2vh 2vw;
        display: flex;
        flex-direction: column;
        box-sizing: border-box;
    }
   .status-row {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      gap: 10px;
      background: #f9f9f9;
      padding: 10px 14px;
      border-radius: 8px;
      box-shadow: 0 1px 4px rgba(0,0,0,.06);
   }
    .wide-layout {
        max-width: none;
        width: 100%;
    }
   .status-box {
      display: flex;
      align-items: center;
   }
    .page.has-overlay .status-section > :not(.overlay) {
        pointer-events: none;
    }
   .result-box {
      background: #f0f8ff;
      padding: 4px 12px;
      border-radius: 6px;
      border-left: 5px solid #007aff;
   }
    .page.has-overlay .status-section > .overlay {
        pointer-events: auto;
    }
   input.highlight {
      width: 9vw;
      min-width: 110px;
      font-weight: 600;
      border: none;
      background: #fff;
      text-align: center;
      font-size: 18px;
      padding: 6px 0;
      border-radius: 6px;
      box-shadow: inset 0 1px 3px rgba(0,0,0,.12);
   }
    .report-table-wrapper {
        width: 100%;
        max-width: none;
    }
   .operator-box {
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 28px;
      font-weight: bold;
      color: #007aff;
      margin: 0 6px;
   }
    .table-scroll {
        width: 100%;
        overflow-x: scroll !important;
        min-height: 40px;
    }
   .btn-group {
      margin-left: auto;
      display: flex;
      align-items: center;
      gap: 12px;
   }
    .report-title {
        font-size: 32px;
        font-weight: 600;
        text-align: center;
        margin: 0;
    }
   .refresh-btn-inline, .reset-btn-inline {
      transition: .15s;
   }
    /* 2. 区块标题 */
    .section-title, .history-title {
        font-size: 26px;
    }
   .refresh-btn-inline {
      background: #00A2E9;
      color: #fff;
      border: none;
      font-size: 18px;
      border-radius: 10px;
      padding: 8px 30px;
   }
    /* 3. 表格字体 */
    .report-table, .report-table th, .report-table td {
        font-size: 22px;
    }
      .refresh-btn-inline:hover {
         background: #0086c0;
      }
    /* 4. 当前报工人、不良数量等输入区 */
    .current-user-section,
    .defective-section,
    .submit-section {
        font-size: 30px;
    }
   .reset-btn-inline {
      background: #ff6b6b;
      color: #fff;
      border: none;
      font-size: 16px;
      border-radius: 10px;
      padding: 8px 18px;
   }
    /* 5. 输入框字体 */
    .inp, .bad-input {
        font-size: 28px;
    }
      .reset-btn-inline:hover {
         background: #e94d4d;
      }
    /* 6. 按钮字体 */
    .details-btn,
    .select-user-btn,
    .refresh-btn-header,
    .reset-btn-header {
        font-size: 22px;
    }
   .flex-row {
      display: flex;
      flex-wrap: wrap;
      gap: 20px;
      align-items: flex-start;
   }
    .report-table {
        width: 100%;
        min-width: 1800px;
        border-collapse: collapse;
        background: #fff;
    }
   .flex-grow {
      flex: 1 1 540px;
   }
        .report-table th, .report-table td {
            border: 1px solid #555;
            padding: 6px 8px;
            text-align: center;
            white-space: nowrap;
        }
   .gap-lg {
      gap: 30px;
   }
    .status-section {
        display: flex;
        flex-direction: column;
        gap: 10px;
    }
   .print-section {
      padding: 6px 0 14px;
      margin-bottom: 0;
      flex: 1;
   }
    .status-row {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        gap: 10px;
        background: #f9f9f9;
        padding: 10px 14px;
        border-radius: 8px;
        box-shadow: 0 1px 4px rgba(0,0,0,.06);
    }
   .barcode-info {
      display: flex;
      flex-wrap: wrap;
      align-items: flex-start;
      gap: 30px;
   }
    .status-box {
        display: flex;
        align-items: center;
    }
   .inp {
      padding: 8px;
      font-size: 16px;
      border: 1px solid #808080;
      border-radius: 8px;
      box-sizing: border-box;
   }
    .result-box {
        background: #f0f8ff;
        padding: 4px 12px;
        border-radius: 6px;
        border-left: 5px solid #007aff;
    }
   .bad-input {
      width: 320px;
      max-width: 100%;
      height: 66px;
      border: 3px solid #808080;
      font-size: 34px;
      text-align: center;
   }
    input.highlight {
        width: 9vw;
        min-width: 110px;
        font-weight: 600;
        border: none;
        background: #fff;
        text-align: center;
        font-size: 18px;
        padding: 6px 0;
        border-radius: 6px;
        box-shadow: inset 0 1px 3px rgba(0,0,0,.12);
    }
   .details-btn {
      padding: 12px 34px;
      background: #00a2e9;
      color: #fff;
      font-size: 20px;
      border: none;
      cursor: pointer;
      border-radius: 12px;
   }
    .operator-box {
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 28px;
        font-weight: bold;
        color: #007aff;
        margin: 0 6px;
    }
    .btn-group {
        margin-left: auto;
        display: flex;
        align-items: center;
        gap: 12px;
    }
    .refresh-btn-inline, .reset-btn-inline {
        transition: .15s;
    }
    .refresh-btn-inline {
        background: #00A2E9;
        color: #fff;
        font-size: 18px;
        border-radius: 10px;
        padding: 8px 30px;
        border: none;
    }
        .refresh-btn-inline:hover {
            background: #0086c0;
        }
    .reset-btn-inline {
        background: #ff6b6b;
        color: #fff;
        font-size: 16px;
        border-radius: 10px;
        padding: 8px 18px;
        border: none;
    }
        .reset-btn-inline:hover {
            background: #e94d4d;
        }
    .flex-row {
        display: flex;
        flex-wrap: wrap;
        gap: 20px;
        align-items: stretch;
    }
    .flex-grow {
        flex: 1 1 540px;
    }
    .gap-lg {
        gap: 30px;
    }
    .defective-section {
        display: flex;
        align-items: center;
        gap: 14px;
        font-size: 18px;
    }
    .submit-section {
        display: flex;
        align-items: center;
    }
    .inp {
        padding: 8px;
        font-size: 16px;
        border: 1px solid #808080;
        border-radius: 8px;
        box-sizing: border-box;
    }
    .bad-input {
        width: 320px;
        max-width: 100%;
        height: 66px;
        border: 3px solid #808080;
        font-size: 34px;
        text-align: center;
    }
    .details-btn {
        padding: 12px 34px;
        background: #00a2e9;
        color: #fff;
        font-size: 20px;
        border: none;
        cursor: pointer;
        border-radius: 12px;
    }
        .details-btn:hover {
            background: #008ac2;
        }
    .current-user-section {
        display: flex;
        align-items: center;
        font-size: 26px;
        border: 1.5px solid #f00;
        border-radius: 10px;
        padding: 14px 22px;
        background: #fff;
        gap: 14px;
        flex: 0 0 auto;
    }
    .current-user-name {
        font-weight: bold;
        font-size: 22px;
    }
    .select-user-btn {
        padding: 6px 22px;
        background: #eee;
        border: 1px solid #aaa;
        border-radius: 8px;
        font-size: 24px;
    }
      .details-btn:hover {
         background: #008ac2;
      }
        .select-user-btn:hover {
            background: #ddd;
        }
   .current-user-section {
      display: flex;
      align-items: center;
      font-size: 18px;
      border: 1.5px solid #f00;
      border-radius: 10px;
      padding: 14px 22px;
      background: #fff;
      gap: 14px;
   }
    .overlay {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        background: rgba(0,0,0,.45);
        display: flex;
        justify-content: center;
        align-items: center;
        z-index: 1000;
    }
   .fill-width {
      flex: 0 1 380px;
   }
    .popup {
        background: #fff;
        padding: 2vh;
        border: 1px solid #ccc;
        box-shadow: 0 0 14px rgba(0,0,0,.12);
        width: 72vw;
        max-width: 1400px;
        height: 70vh;
        font-size: 1.4vw;
        max-height: 80vh;
        overflow-y: auto;
        border-radius: 12px;
        z-index: 1001;
    }
   .current-user-name {
      font-weight: bold;
      font-size: 22px;
   }
    /* 选人弹窗更宽,名字更大,关闭按钮更小 */
    .user-select-popup {
        width: 1600px;
        max-width: 99vw;
        min-width: 1000px;
        height: auto;
        min-height: 520px;
        padding: 0;
        display: flex;
        flex-direction: column;
        font-size: 32px;
    }
   .select-user-btn {
      padding: 6px 22px;
      background: #eee;
      border: 1px solid #aaa;
      border-radius: 8px;
      font-size: 16px;
   }
    .user-search-bar {
        display: flex;
        align-items: center;
        gap: 18px;
        padding: 24px 64px 0 64px;
        background: #fff;
        flex-wrap: wrap;
    }
      .select-user-btn:hover {
         background: #ddd;
      }
    .user-search-input {
        flex: 1 1 260px;
        padding: 16px 20px;
        font-size: 28px;
        border: 1px solid #bbb;
        border-radius: 8px;
        outline: none;
        height: 54px;
    }
   .overlay {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: rgba(0,0,0,.45);
      display: flex;
      justify-content: center;
      align-items: center;
      z-index: 1000;
   }
        .user-search-input:focus {
            border-color: #007aff;
            box-shadow: 0 0 0 2px rgba(0,122,255,.15);
        }
   .popup {
      background: #fff;
      padding: 2vh;
      border: 1px solid #ccc;
      box-shadow: 0 0 14px rgba(0,0,0,.12);
      width: 72vw;
      max-width: 1400px;
      height: 70vh;
      font-size: 1.4vw;
      max-height: 80vh;
      overflow-y: auto;
      border-radius: 12px;
      z-index: 1001;
   }
    .user-search-clear {
        padding: 12px 28px;
        background: #ff9f43;
        color: #fff;
        border: none;
        border-radius: 8px;
        font-size: 24px;
        cursor: pointer;
    }
   .user-select-popup {
      width: 860px;
      max-width: 80vw;
      height: auto;
      min-height: 480px;
      padding: 0;
      display: flex;
      flex-direction: column;
   }
   /* 搜索条样式 */
   .user-search-bar {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 18px 32px 0 32px;
      background: #fff;
      flex-wrap: wrap;
   }
        .user-search-clear:hover {
            background: #ff8920;
        }
   .user-search-input {
      flex: 1 1 260px;
      padding: 10px 14px;
      font-size: 16px;
      border: 1px solid #bbb;
      border-radius: 8px;
      outline: none;
   }
    .user-search-info {
        font-size: 22px;
        color: #555;
    }
      .user-search-input:focus {
         border-color: #007aff;
         box-shadow: 0 0 0 2px rgba(0,122,255,.15);
      }
    .user-list-scroll {
        flex: 1 1 auto;
        overflow-y: auto;
        padding: 32px 64px 0 64px;
    }
   .user-search-clear {
      padding: 10px 18px;
      background: #ff9f43;
      color: #fff;
      border: none;
      border-radius: 8px;
      font-size: 14px;
      cursor: pointer;
   }
    .user-list-grid {
        display: grid;
        grid-template-columns: repeat(auto-fill,minmax(200px,1fr));
        gap: 22px 22px;
    }
      .user-search-clear:hover {
         background: #ff8920;
      }
    .user-list-btn {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        gap: 2px; /* 原8px,减小行间距 */
        padding: 10px 10px; /* 适当减小上下内边距 */
        height: 100px; /* 可适当减小高度 */
        font-size: 30px;
        background: #00a2e9;
        color: #fff;
        border: none;
        border-radius: 8px;
        cursor: pointer;
        box-sizing: border-box;
        word-break: break-word;
    }
   .user-search-info {
      font-size: 14px;
      color: #555;
   }
        .user-list-btn .user-code {
            font-weight: 700;
            font-size: 36px;
            line-height: 1.1; /* 紧凑一点 */
        }
   .user-list-scroll {
      flex: 1 1 auto;
      overflow-y: auto;
      padding: 24px 32px 0 32px;
   }
        .user-list-btn .user-name {
            font-size: 32px;
            line-height: 1.1; /* 紧凑一点 */
        }
   .user-list-grid {
      display: grid;
      grid-template-columns: repeat(auto-fill,minmax(150px,1fr));
      gap: 24px 24px;
   }
        .user-list-btn.selected {
            background: #0072c9;
            box-shadow: 0 0 0 3px rgba(255,255,255,.6) inset;
        }
   .user-list-btn {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      gap: 6px;
      padding: 16px 10px;
      height: 120px;
      font-size: 18px;
      background: #00a2e9;
      color: #fff;
      border: none;
      border-radius: 10px;
      cursor: pointer;
      box-sizing: border-box;
      word-break: break-word;
   }
        .user-list-btn:hover {
            background: #008ed0;
        }
      .user-list-btn .user-code {
         font-weight: 600;
         font-size: 18px;
      }
    .no-user-result {
        padding: 40px 0;
        text-align: center;
        font-size: 28px;
        color: #666;
    }
      .user-list-btn .user-name {
         font-size: 16px;
      }
    .user-popup-footer {
        flex-shrink: 0;
        padding: 24px 64px 32px 64px;
        background: #fff;
        text-align: center;
    }
      .user-list-btn.selected {
         background: #0072c9;
         box-shadow: 0 0 0 3px rgba(255,255,255,.6) inset;
      }
    .clean-btn {
        width: 24%;
        padding: 10px 0;
        color: #fff;
        font-size: 20px;
        border: none;
        text-align: center;
        cursor: pointer;
        border-radius: 0.6vw;
        background: #007aff;
    }
      .user-list-btn:hover {
         background: #008ed0;
      }
        .clean-btn.wide-btn {
            width: 30%;
            font-size: 22px;
            padding: 12px 0;
        }
   .no-user-result {
      padding: 40px 0;
      text-align: center;
      font-size: 18px;
      color: #666;
   }
        .clean-btn:hover {
            background: #0062c9;
        }
   .user-popup-footer {
      flex-shrink: 0;
      padding: 22px 32px 32px 32px;
      background: #fff;
      text-align: center;
   }
    .reason-section {
        margin: 14px 0 18px;
    }
   .clean-btn {
      width: 48%;
      padding: 1.6vh;
      color: #fff;
      font-size: 1.4vw;
      border: none;
      text-align: center;
      cursor: pointer;
      border-radius: .6vw;
      background: #007aff;
   }
    .reason-buttons {
        display: grid;
        grid-template-columns: repeat(5,1fr);
        gap: 12px;
    }
      .clean-btn.wide-btn {
         width: 60%;
         font-size: 20px;
      }
    .reason-btn {
        padding: 10px 6px;
        background: #808080;
        color: #fff;
        font-size: 14px;
        border: none;
        border-radius: 8px;
        cursor: pointer;
    }
      .clean-btn:hover {
         background: #0062c9;
      }
        .reason-btn.selected {
            background: #FFD700;
            color: #000;
        }
   .reason-section {
      margin: 14px 0 18px;
   }
    .bottom-section {
        display: flex;
        justify-content: space-between;
        margin-top: 16px;
        gap: 16px;
    }
   .reason-buttons {
      display: grid;
      grid-template-columns: repeat(5,1fr);
      gap: 12px;
   }
    .save-btn, .cancel-btn {
        flex: 1;
        padding: 16px 0;
        background: #00A2E9;
        color: #fff;
        font-size: 20px;
        border: none;
        border-radius: 10px;
    }
   .reason-btn {
      padding: 10px 6px;
      background: #808080;
      color: #fff;
      font-size: 14px;
      border: none;
      border-radius: 8px;
      cursor: pointer;
   }
        .save-btn:hover, .cancel-btn:hover {
            background: #0086c0;
        }
      .reason-btn.selected {
         background: #FFD700;
         color: #000;
      }
    .table1 {
        width: 100%;
        border-spacing: 3px;
    }
   .bottom-section {
      display: flex;
      justify-content: space-between;
      margin-top: 16px;
      gap: 16px;
   }
    @media (max-width:1400px) {
        input.highlight {
            font-size: 16px;
        }
   .save-btn, .cancel-btn {
      flex: 1;
      padding: 16px 0;
      background: #00A2E9;
      color: #fff;
      font-size: 20px;
      border: none;
      border-radius: 10px;
   }
        .user-list-btn {
            height: 70px;
            font-size: 18px;
        }
      .save-btn:hover, .cancel-btn:hover {
         background: #0086c0;
      }
            .user-list-btn .user-code {
                font-size: 18px;
            }
   .table1 {
      width: 100%;
      border-spacing: 3px;
   }
            .user-list-btn .user-name {
                font-size: 16px;
            }
   @media (max-width:1400px) {
      input.highlight {
         font-size: 16px;
      }
        .reason-btn {
            font-size: 12px;
        }
      .user-list-btn {
         height: 110px;
         font-size: 16px;
      }
        .refresh-btn-header {
            font-size: 14px;
            padding: 6px 16px;
        }
      .reason-btn {
         font-size: 12px;
      }
   }
        .reset-btn-header {
            font-size: 12px;
            padding: 6px 12px;
        }
    }
</style>