From 4a9c0f7ddb5eae77b1f833bd2223e33fe6bb2918 Mon Sep 17 00:00:00 2001
From: xwt <2740516069@qq.com>
Date: 星期四, 30 十月 2025 12:41:24 +0800
Subject: [PATCH] XJ,SJ,RKJ序号排序,LLJ单个检验项目FTP附件
---
pages/QC/LLJ/Add.vue | 2477 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 2,182 insertions(+), 295 deletions(-)
diff --git a/pages/QC/LLJ/Add.vue b/pages/QC/LLJ/Add.vue
index 4492c63..a53dc0a 100644
--- a/pages/QC/LLJ/Add.vue
+++ b/pages/QC/LLJ/Add.vue
@@ -1,14 +1,14 @@
<template>
<view class="inspection-sheet">
- <!-- 澶撮儴淇℃伅 -->
- <view class="sheet-header">
- <h1>鏉ユ枡妫�楠屽崟</h1>
- <view class="inspection-number">妫�楠屽崟鍙凤細{{formData.releaseNo}}</view>
- <!--瀹為獙瀹ら�佹 -->
- <view style="text-align: right;" class="action-buttons">
- <a class="sysLike" v-if="this.current" @click="toSysSubmitFrom(formData.releaseNo)">瀹為獙瀹ら�佹</a>
+ <!-- 澶撮儴淇℃伅 -->
+ <view class="sheet-header">
+ <h1>鏉ユ枡妫�楠屽崟</h1>
+ <view class="inspection-number">妫�楠屽崟鍙凤細{{formData.releaseNo}}</view>
+ <!--瀹為獙瀹ら�佹 -->
+ <view style="text-align: right;" class="action-buttons">
+ <a class="sysLike" v-if="this.current" @click="toSysSubmitFrom(formData.releaseNo)">瀹為獙瀹ら�佹</a>
+ </view>
</view>
- </view>
<!-- 鍩烘湰淇℃伅鍖� -->
<view class="basic-info">
@@ -56,10 +56,6 @@
<view class="info-label">涓嶈壇鎻忚堪锛�</view>
<view class="info-value">{{formData.fngDesc}}</view>
</view>
- <view class="info-block" v-if="formData.newFngDesc!=null">
- <view class="info-label">涓婃涓嶈壇锛�</view>
- <view class="info-value">{{formData.newFngDesc}}</view>
- </view>
</view>
<view class="dropdown-row">
<view class="info-label">涓嶈壇鍘熷洜锛�</view>
@@ -86,16 +82,17 @@
<view class="info-label">澶囨敞锛�</view>
<input type="text" id="lotNo1" v-model="formData.lotNo1"
placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
- style="color: red; font-weight: bold;"/>
+ style="color: red; font-weight: bold; background-color: #fff !important; -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; pointer-events: auto !important; opacity: 1 !important; z-index: 1 !important;"/>
</view>
<view class="info-block" style="margin-top: 10px;">
<view class="info-label">鐮村潖瀹為獙鏁伴噺锛�</view>
- <view class="info-value highlight">{{formData.phsy}}</view>
+ <view class="info-value highlight">{{formData.PHSY || formData.phsy || ''}}</view>
</view>
<!-- 琛ㄥ崟涓婃柟鎿嶄綔鎸夐挳鍖� -->
<view class="top-action-buttons">
<button class="action-btn" @click="getInspectionItems" v-if="this.current">鑾峰彇妫�楠岄」鐩�</button>
+ <button class="action-btn" @click="openGlobalBlockHoleDialog" v-if="this.current">鍫电┐璁剧疆</button>
<button class="action-btn" @click="handleEmergencyRelease" v-if="this.current">绱ф�ユ斁琛�</button>
<button class="action-btn" @click="handleWithdraw" v-if="this.current">鎾ゅ洖</button>
</view>
@@ -150,7 +147,7 @@
<form>
<view class="form-group">
<label class="form-label">涓嶅悎鏍兼弿杩�:</label>
- <input class="form-input" type="text" v-model="remarks" />
+ <input class="info-input" type="text" v-model="remarks" placeholder="璇疯緭鍏ヤ笉鍚堟牸鎻忚堪" />
</view>
</form>
@@ -160,19 +157,190 @@
</view>
<view v-if="destructionPopup" class="overlay">
- <view class="popup">
- <h3>鐮村潖瀹為獙鏁伴噺</h3>
- <form>
- <view class="form-group">
- <label class="form-label">鐮村潖瀹為獙鏁伴噺:</label>
- <input class="form-input" type="text" v-model="PHSY" placeholder="鐣欑┖琛ㄧず娓呴櫎鏁伴噺" />
+ <view class="popup destruction-popup">
+ <h3>鐮村潖瀹為獙</h3>
+
+ <!-- 绗竴姝ワ細鎵弿浜岀淮鐮侊紙鏃犺褰曟椂鏄剧ず锛� -->
+ <view v-if="!hasExistingRecord && !scannedMaterialInfo" class="scan-step">
+ <view class="scan-icon">馃摲</view>
+ <view class="scan-title">鎵弿鐗╂枡浜岀淮鐮�</view>
+ <view class="scan-description">璇锋壂鎻忚鐢ㄤ簬鐮村潖瀹為獙鐨勭墿鏂欐潯鐮�</view>
+ <view class="scan-actions">
+ <button class="scan-btn" @click="scanQRCode">寮�濮嬫壂鎻�</button>
+ <button class="destruction-btn cancel-btn" @click="closeDestructionPopup">杩斿洖</button>
</view>
- </form>
- <div v-if="!isInteger" class="error-message">璇疯緭鍏ユ暣鏁板�兼垨鐣欑┖</div>
- <button class="updateBut" @click="editDestruction">淇敼</button>
- <button @click="clearDestruction">娓呴櫎</button>
- <button @click="destructionPopup = !destructionPopup">鍙栨秷</button>
+ </view>
+
+ <!-- 绗簩姝ワ細鏄剧ず鎵弿缁撴灉鍜岃緭鍏ユ暟閲忥紙鏃犺褰曟椂鎵弿鍚庢樉绀猴級 -->
+ <view v-if="!hasExistingRecord && scannedMaterialInfo" class="result-step">
+ <view class="scan-success-icon">鉁�</view>
+ <view class="scan-success-title">鎵弿鎴愬姛</view>
+
+ <!-- 鏄剧ず鎵弿鍒扮殑鐗╂枡淇℃伅 -->
+ <view class="material-info-display">
+ <view class="material-detail">
+ <view class="detail-row">
+ <span class="detail-label">鎵弿鏉$爜:</span>
+ <span class="detail-value barcode-value">{{ scannedMaterialInfo.itemBarcode || scannedMaterialInfo.itemNo }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鐗╂枡缂栫爜:</span>
+ <span class="detail-value">{{ scannedMaterialInfo.itemNo }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鐗╂枡鍚嶇О:</span>
+ <span class="detail-value">{{ scannedMaterialInfo.itemName }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">瑙勬牸鍨嬪彿:</span>
+ <span class="detail-value">{{ scannedMaterialInfo.itemModel }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鍒拌揣鍗曞彿:</span>
+ <span class="detail-value">{{ scannedMaterialInfo.billNo }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鍙敤鏁伴噺:</span>
+ <span class="detail-value">{{ scannedMaterialInfo.oldQty }}</span>
+ </view>
+ </view>
+ </view>
+
+ <!-- 閲嶆柊璁捐鐨勮緭鍏ュ尯鍩� -->
+ <view class="input-section">
+ <view class="input-title">鐮村潖瀹為獙鏁伴噺</view>
+ <view class="input-container">
+ <view class="input-box" @click="focusInput">
+ <text v-if="destructionQuantity" class="input-value">{{ destructionQuantity }}</text>
+ <text v-else class="input-placeholder">鐐瑰嚮杈撳叆鏁伴噺</text>
+ </view>
+ </view>
+ <view v-if="!isInteger && destructionQuantity" class="error-tip">璇疯緭鍏ユ湁鏁堢殑姝f暣鏁�</view>
+ </view>
+
+ <!-- 鎿嶄綔鎸夐挳 -->
+ <view class="destruction-actions">
+ <!-- 鏃犺褰曟椂鏄剧ず锛氱‘璁ゃ�佷慨鏀广�佸垹闄ゃ�佽繑鍥� -->
+ <template v-if="!hasExistingRecord">
+ <button class="destruction-btn confirm-btn" @click="confirmDestruction" :disabled="!isInteger || !destructionQuantity">纭</button>
+ <button class="destruction-btn modify-btn" @click="modifyDestruction">淇敼</button>
+ <button class="destruction-btn delete-btn" @click="deleteDestruction">鍒犻櫎</button>
+ <button class="destruction-btn cancel-btn" @click="resetDestruction">杩斿洖</button>
+ </template>
+ <!-- 鏈夎褰曟椂鏄剧ず锛氫慨鏀广�佸垹闄ゃ�佽繑鍥� -->
+ <template v-else>
+ <button class="destruction-btn modify-btn" @click="modifyDestruction">淇敼</button>
+ <button class="destruction-btn delete-btn" @click="deleteDestruction">鍒犻櫎</button>
+ <button class="destruction-btn cancel-btn" @click="resetDestruction">杩斿洖</button>
+ </template>
+ </view>
+ </view>
+
+ <!-- 绗笁姝ワ細鏄剧ず宸叉湁璁板綍淇℃伅锛堟湁璁板綍鏃舵樉绀猴紝澶嶇敤鎵弿缁撴灉鐣岄潰锛� -->
+ <view v-if="hasExistingRecord" class="result-step">
+ <view class="scan-success-icon">鉁�</view>
+ <view class="scan-success-title">鎵弿鎴愬姛</view>
+
+ <!-- 鏄剧ず鎵弿鍒扮殑鐗╂枡淇℃伅 -->
+ <view class="material-info-display">
+ <view class="material-detail">
+ <view class="detail-row">
+ <span class="detail-label">鎵弿鏉$爜:</span>
+ <span class="detail-value barcode-value">{{ (scannedMaterialInfo && scannedMaterialInfo.itemBarcode) || (scannedMaterialInfo && scannedMaterialInfo.itemNo) || '' }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鐗╂枡缂栫爜:</span>
+ <span class="detail-value">{{ (scannedMaterialInfo && scannedMaterialInfo.itemNo) || '' }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鐗╂枡鍚嶇О:</span>
+ <span class="detail-value">{{ (scannedMaterialInfo && scannedMaterialInfo.itemName) || '' }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">瑙勬牸鍨嬪彿:</span>
+ <span class="detail-value">{{ (scannedMaterialInfo && scannedMaterialInfo.itemModel) || '' }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鍒拌揣鍗曞彿:</span>
+ <span class="detail-value">{{ (scannedMaterialInfo && scannedMaterialInfo.billNo) || formData.lotNo }}</span>
+ </view>
+ <view class="detail-row">
+ <span class="detail-label">鍙敤鏁伴噺:</span>
+ <span class="detail-value">{{ (scannedMaterialInfo && scannedMaterialInfo.oldQty) || '0' }}</span>
+ </view>
+ </view>
+ </view>
+
+ <!-- 閲嶆柊璁捐鐨勮緭鍏ュ尯鍩� -->
+ <view class="input-section">
+ <view class="input-title">鐮村潖瀹為獙鏁伴噺</view>
+ <view class="input-container">
+ <view class="input-box" @click="focusInput">
+ <text v-if="destructionQuantity" class="input-value">{{ destructionQuantity }}</text>
+ <text v-else class="input-placeholder">鐐瑰嚮杈撳叆鏁伴噺</text>
+ </view>
+ </view>
+ <view v-if="!isInteger && destructionQuantity" class="error-tip">璇疯緭鍏ユ湁鏁堢殑姝f暣鏁�</view>
+ </view>
+
+ <!-- 鎿嶄綔鎸夐挳 -->
+ <view class="destruction-actions">
+ <button class="destruction-btn modify-btn" @click="modifyDestruction">淇敼</button>
+ <button class="destruction-btn delete-btn" @click="deleteDestruction">鍒犻櫎</button>
+ <button class="destruction-btn cancel-btn" @click="resetDestruction">杩斿洖</button>
+ </view>
+ </view>
</view>
+ </view>
+
+ <!-- 鍏ㄥ眬鍫电┐璁剧疆瀵硅瘽妗� -->
+ <view v-if="globalBlockHolePopup" class="overlay">
+ <view class="popup global-block-hole-popup">
+ <h3>鍏ㄥ眬鍫电┐璁剧疆</h3>
+ <view class="block-hole-content">
+ <view class="hole-info">
+ <view class="info-label">妫�楠屽崟鍙凤細{{ formData.releaseNo }}</view>
+ <view class="info-label">灏嗗簲鐢ㄤ簬鎵�鏈夋湁寮�绌存暟鐨勬楠岄」鐩�</view>
+ </view>
+ <view class="input-section">
+ <view class="input-label">鍫电┐鏁伴噺锛�</view>
+ <input class="info-input" type="text" v-model="globalBlockHoleInput"
+ placeholder="璇疯緭鍏�1,2,3" @input="onGlobalBlockHoleInput" />
+ <view v-if="globalBlockHoleError" class="error-message">{{ globalBlockHoleError }}</view>
+ </view>
+ <view class="block-hole-actions">
+ <button class="block-hole-btn confirm" @click="confirmGlobalBlockHole"
+ :disabled="!isGlobalBlockHoleValid">纭璁剧疆</button>
+ <button class="block-hole-btn cancel" @click="closeGlobalBlockHoleDialog">鍙栨秷</button>
+ </view>
+ </view>
+ </view>
+ </view>
+
+ <view class="barcode">
+ <u-modal :show="itemShow" title="鐗╂枡鏄庣粏" @confirm="drawingConfirm" @cancel="drawingCancel"
+ showCancelButton :z-index="1000">
+ <uni-table border stripe emptyText="鏆傛棤鏇村鏁版嵁" style="margin-left: 5px;margin-right: 5px;height: 400px;max-height: 60vh;overflow-y: auto;">
+ <uni-tr>
+ <uni-th align="center">鏂欏彿</uni-th>
+ <uni-th align="center" width="90">鍚嶇О</uni-th>
+ <uni-th align="center" width="90">瑙勬牸鍨嬪彿</uni-th>
+ <uni-th align="center" width="150">璋冨彇PLM鍥剧焊</uni-th>
+ </uni-tr>
+ <uni-tr v-for="(item,index) in (drawing || [])" style="height: 100px;">
+ <uni-td align="center">{{item.itemNo}}</uni-td>
+ <uni-td align="center" style="font-size:25px;">
+ <div >{{item.itemName}}</div>
+ </uni-td>
+ <uni-td align="center" style="font-size:25px;">
+ <div>{{item.itemModel}}</div>
+ </uni-td>
+ <uni-td align="center" class="click-wd">
+ <div @click="fetchDrawingNumber">璋冨彇鍥剧焊</div>
+ </uni-td>
+ </uni-tr>
+ </uni-table>
+ </u-modal>
</view>
<view class="barcode">
@@ -205,57 +373,119 @@
<!-- 闄勪欢璇︽儏寮圭獥 -->
<view v-if="showAttachmentDetail" class="overlay">
<view class="popup attachment-detail-popup">
- <h3 class="attachment-popup-title">闄勪欢璇︽儏</h3>
- <div class="attachment-popup-divider"></div>
- <div v-if="selectedAttachment" class="attachment-detail-content">
- <div class="attachment-detail-row"><span class="attachment-label">ID锛�</span><span>{{ Math.trunc(selectedAttachment.id) }}</span></div>
- <div class="attachment-detail-row"><span class="attachment-label">闄勪欢鍚嶏細</span><span>{{ selectedAttachment.fattach }}</span></div>
- <div class="attachment-detail-row"><span class="attachment-label">绫诲瀷锛�</span><span>{{ selectedAttachment.ftype }}</span></div>
- <div class="attachment-detail-row"><span class="attachment-label">鐗堟湰锛�</span><span>{{ selectedAttachment.fversion }}</span></div>
- <div class="attachment-detail-row"><span class="attachment-label">鍙楁帶鏃ユ湡锛�</span><span>{{ selectedAttachment.fdate }}</span></div>
- <div class="attachment-detail-row"><span class="attachment-label">涓婁紶浜猴細</span><span>{{ selectedAttachment.createBy }}</span></div>
- <div class="attachment-detail-row"><span class="attachment-label">涓婁紶鏃堕棿锛�</span><span>{{ selectedAttachment.createDate }}</span></div>
- <div class="attachment-actions-detail">
- <button class="attachment-action-btn preview-btn"
- @click="previewFtpFile(selectedAttachment)"
- v-if="isPreviewable(selectedAttachment.fattach)">
- 馃攳 鍦ㄧ嚎棰勮
- </button>
- <button class="attachment-action-btn download-btn"
- @click="downloadAttachment(selectedAttachment)">
- 馃摜 涓嬭浇鏂囦欢
- </button>
+ <div class="attachment-popup-header">
+ <h3 class="attachment-popup-title">闄勪欢璇︽儏</h3>
+ <button class="attachment-close-btn" @click="closeAttachmentDetail">杩斿洖</button>
+ </div>
+
+ <div class="attachment-popup-content">
+ <div v-if="selectedAttachment" class="attachment-detail-content">
+ <div class="attachment-detail-header">
+ <div class="file-type-badge large" :class="getFileTypeClass(selectedAttachment.fattach)">
+ {{ getFileTypeIcon(selectedAttachment.fattach) }}
+ </div>
+ <div class="attachment-detail-title">
+ {{ selectedAttachment.fattach }}
+ </div>
+ </div>
+
+ <div class="attachment-detail-info">
+ <div class="info-row">
+ <div class="info-item">
+ <text class="info-label">ID</text>
+ <text class="info-content">{{ Math.trunc(selectedAttachment.id) }}</text>
+ </div>
+ <div class="info-item">
+ <text class="info-label">绫诲瀷</text>
+ <text class="info-content">{{ selectedAttachment.ftype || '鏈煡绫诲瀷' }}</text>
+ </div>
+ </div>
+
+ <div class="info-row" v-if="selectedAttachment.fversion">
+ <div class="info-item">
+ <text class="info-label">鐗堟湰</text>
+ <text class="info-content">{{ selectedAttachment.fversion }}</text>
+ </div>
+ <div class="info-item" v-if="selectedAttachment.fdate">
+ <text class="info-label">鍙楁帶鏃ユ湡</text>
+ <text class="info-content">{{ formatDate(selectedAttachment.fdate) }}</text>
+ </div>
+ </div>
+
+ <div class="info-row" v-if="selectedAttachment.createBy">
+ <div class="info-item">
+ <text class="info-label">涓婁紶浜�</text>
+ <text class="info-content">{{ selectedAttachment.createBy }}</text>
+ </div>
+ <div class="info-item" v-if="selectedAttachment.createDate">
+ <text class="info-label">涓婁紶鏃堕棿</text>
+ <text class="info-content">{{ formatDate(selectedAttachment.createDate) }}</text>
+ </div>
+ </div>
+ </div>
+
+ <div class="attachment-detail-actions">
+ <button v-if="isPreviewable(selectedAttachment.fattach)"
+ class="btn-primary"
+ @click="previewFtpFile(selectedAttachment)">棰勮</button>
+ <button class="btn-success" @click="downloadAttachment(selectedAttachment)">涓嬭浇</button>
+ </div>
+ </div>
+ <div v-else class="attachment-detail-empty">
+ <div class="empty-icon">鉂�</div>
+ <div class="empty-text">鏆傛棤闄勪欢淇℃伅</div>
</div>
</div>
- <div v-else class="attachment-detail-empty">鏆傛棤闄勪欢淇℃伅</div>
- <button class="attachment-popup-close" @click="closeAttachmentDetail">杩斿洖闄勪欢鍒楄〃</button>
</view>
</view>
<!-- 闄勪欢鍒楄〃寮圭獥 -->
<view v-if="showAttachmentPopup" class="overlay">
- <view class="popup" style="width: 60vw; max-width: 500px;">
- <h3>闄勪欢鍒楄〃</h3>
- <div v-if="attachmentsLoading">鍔犺浇涓�...</div>
- <div v-else-if="attachments.length === 0">鏆傛棤闄勪欢</div>
- <ul class="attachment-list" v-else>
- <li v-for="item in attachments" :key="item.id">
- <div class="attachment-info">
- <span class="attachment-name" @click="showAttachmentDetailDialog(item)">
- {{ item.fattach }}
- </span>
- <div class="attachment-meta">
- <span class="attachment-type">{{ item.ftype || '鏈煡绫诲瀷' }}</span>
+ <view class="popup attachment-list-popup">
+ <div class="attachment-popup-header">
+ <h3 class="attachment-popup-title">闄勪欢鍒楄〃</h3>
+ <button class="attachment-close-btn" @click="closeAttachmentPopup">鍏抽棴</button>
+ </div>
+
+ <div class="attachment-popup-content">
+ <div v-if="attachmentsLoading" class="attachment-loading">
+ <div class="loading-spinner"></div>
+ <span class="loading-text">姝e湪鍔犺浇闄勪欢...</span>
+ </div>
+
+ <div v-else-if="attachments.length === 0" class="attachment-empty">
+ <div class="empty-icon">馃搧</div>
+ <div class="empty-text">鏆傛棤闄勪欢</div>
+ <div class="empty-hint">璇ョ墿鏂欐殏鏈笂浼犱换浣曢檮浠�</div>
+ </div>
+
+ <div v-else class="attachment-list">
+ <div v-for="item in attachments" :key="item.id" class="attachment-item">
+ <div class="attachment-info">
+ <div class="file-type-badge" :class="getFileTypeClass(item.fattach)">
+ {{ getFileTypeIcon(item.fattach) }}
+ </div>
+ <div class="attachment-details">
+ <div class="attachment-name" @click="showAttachmentDetailDialog(item)">
+ {{ item.fattach }}
+ </div>
+ <div class="attachment-meta">
+ <span class="meta-type">{{ item.ftype || '鏈煡绫诲瀷' }}</span>
+ <span v-if="item.fversion" class="meta-version">v{{ item.fversion }}</span>
+ <span v-if="item.fdate" class="meta-date">{{ formatDate(item.fdate) }}</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="attachment-actions">
+ <button class="btn-secondary" @click="showAttachmentDetailDialog(item)">璇︽儏</button>
+ <button v-if="isPreviewable(item.fattach)"
+ class="btn-primary"
+ @click="previewFtpFile(item)">棰勮</button>
+ <button class="btn-success" @click="downloadAttachment(item)">涓嬭浇</button>
</div>
</div>
- <div class="attachment-actions">
- <button class="secondary-btn" @click="showAttachmentDetailDialog(item)">璇︽儏</button>
- <button class="secondary-btn preview-btn" @click="previewFtpFile(item)"
- v-if="isPreviewable(item.fattach)">棰勮</button>
- <button class="secondary-btn" @click="downloadAttachment(item)">涓嬭浇</button>
- </div>
- </li>
- </ul>
- <button class="attachment-popup-close" @click="closeAttachmentPopup">鍏抽棴</button>
+ </div>
+ </div>
</view>
</view>
@@ -342,12 +572,13 @@
current: true,
drawing: [],
drawingShow: false,
+ itemShow: false,
badreason: '',
PSTYPE: '',
WORKSHOP: '',
REMARK: '',
// picker 閫夐」鍜岀储寮�
- badreasonOptions: ['', '澶栬涓嶈壇', '灏哄涓嶈壇', '鍖呰涓嶈壇', '鎬ц兘涓嶈壇', '瑁呴厤涓嶈壇', '瀹夎涓嶈壇'],
+ badreasonOptions: ['', '澶栬涓嶈壇', '灏哄涓嶈壇', '鍖呰涓嶈壇', '鎬ц兘涓嶈壇', '瑁呴厤涓嶈壇', '瀹夎涓嶈壇','鍥剧焊涓嶈壇'],
badreasonIndex: 0,
workshopOptions: ['', '鐢熶骇涓�閮�', '鐢熶骇浜岄儴', '娉ㄥ杞﹂棿', '鍏朵粬'],
workshopIndex: 0,
@@ -361,6 +592,10 @@
destructionPopup: false,
PHSY: '',
isInteger: true,
+ scannedMaterialInfo: null, // 鎵弿鍒扮殑鐗╂枡淇℃伅
+ destructionQuantity: '', // 鐮村潖瀹為獙鏁伴噺杈撳叆
+ inputFocus: false, // 杈撳叆妗嗙劍鐐圭姸鎬�
+ hasExistingRecord: false, // 鏄惁鏈夊凡瀛樺湪鐨勭牬鍧忓疄楠岃褰�
attachments: [],
showAttachmentPopup: false,
attachmentsLoading: false,
@@ -372,6 +607,25 @@
previewItemNo: '',
previewType: '', // 'text', 'image', 'excel', 'unsupported'
+ // 鍏ㄥ眬鍫电┐鐩稿叧鏁版嵁
+ globalBlockHolePopup: false,
+ globalBlockHoleInput: '',
+ globalBlockHoleError: '',
+ isGlobalBlockHoleValid: false,
+
+ }
+ },
+ computed: {
+ isUnmaintainedAndNotEmergency() {
+ // 鍒ゆ柇琛ㄥ崟鏄惁鏈淮鎶や笖涓嶆槸绱ф�ユ斁琛�
+ // 鏈淮鎶ょ殑鏉′欢锛歵ableData涓虹┖鎴栨墍鏈夋楠岄」鐩兘鏈畬鎴�
+ const isUnmaintained = this.tableData.length === 0 ||
+ this.tableData.every(item => item.fcheckResu === null || item.fcheckResu === '');
+
+ // 涓嶆槸绱ф�ユ斁琛岀殑鏉′欢锛歟mergencyStatus涓篺alse
+ const isNotEmergency = !this.formData.emergencyStatus;
+
+ return isUnmaintained && isNotEmergency;
}
},
onLoad(options) {
@@ -487,6 +741,7 @@
this.remarks = this.formData.remarks || this.remarks || '';
console.log('鎵撳紑寮圭獥鏃剁殑remarks鍊�:', this.remarks);
},
+
// picker 浜嬩欢澶勭悊鏂规硶
onBadreasonChange(e) {
const index = e.detail.value;
@@ -575,42 +830,26 @@
}).then(res => {
if (res.status == 0) {
- if(this.$loginInfo.account == 'PL017'){
- this.QcIssueResultDetailes = {
- fbatchQty: this.formData.fbatchQty,
- itemName: this.formData.itemName,
- itemNo: this.formData.itemNo,
- suppName: this.formData.suppName,
- appicationReason: this.formData.fngDesc,
- badReason: this.badreason,
- remark: this.remarks || '',
- workShop: this.WORKSHOP,
- releaseNo: this.formData.releaseNo,
- staffNo: 'HMCS',
- // staffNo: this.$loginInfo.account,
- iqcStatus: this.PSTYPE,
- department: this.WORKSHOP, // 浣跨敤WORKSHOP鏇夸唬鏈畾涔夌殑DEPARTMENT
- EMERGENCY: this.formData.emergencyStatus ? "1" : "0" // 纭繚绱ф�ユ斁琛岀姸鎬佹纭紶閫�
- };
- }
- else{
- this.QcIssueResultDetailes = {
- fbatchQty: this.formData.fbatchQty,
- itemName: this.formData.itemName,
- itemNo: this.formData.itemNo,
- suppName: this.formData.suppName,
- appicationReason: this.formData.fngDesc,
- badReason: this.badreason,
- remark: this.remarks || '',
- workShop: this.WORKSHOP,
- releaseNo: this.formData.releaseNo,
- // staffNo: 'HMCS',
- staffNo: this.$loginInfo.account,
- iqcStatus: this.PSTYPE,
- department: this.WORKSHOP, // 浣跨敤WORKSHOP鏇夸唬鏈畾涔夌殑DEPARTMENT
- EMERGENCY: this.formData.emergencyStatus ? "1" : "0" // 纭繚绱ф�ユ斁琛岀姸鎬佹纭紶閫�
- };
- }
+ // 缁熶竴鎺ㄩ�佺粰HMCS锛屼笉绠″摢涓处鍙�
+ this.QcIssueResultDetailes = {
+ fbatchQty: this.formData.fcovertQty,
+ itemName: (() => {
+ const combined = `${this.formData.itemName || ''} ${this.formData.itemModel || ''}`.trim();
+ // 鎴柇澶勭悊锛氳秴杩�1000瀛楃淇濈暀鍓�1000浣�
+ return combined.length > 1000 ? combined.substring(0, 1000) : combined;
+ })(),
+ itemNo: this.formData.itemNo,
+ suppName: this.formData.suppName,
+ appicationReason: this.formData.fngDesc,
+ badReason: this.badreason,
+ remark: this.remarks || '',
+ workShop: this.WORKSHOP,
+ releaseNo: this.formData.releaseNo,
+ staffNo: 'HMCS', // 缁熶竴鎺ㄩ�佺粰HMCS
+ iqcStatus: this.PSTYPE,
+ department: this.WORKSHOP, // 浣跨敤WORKSHOP鏇夸唬鏈畾涔夌殑DEPARTMENT
+ EMERGENCY: this.formData.emergencyStatus ? "1" : "0" // 纭繚绱ф�ユ斁琛岀姸鎬佹纭紶閫�
+ };
console.log("鎻愪氦鐨勭揣鎬ユ斁琛岀姸鎬侊細", this.formData.emergencyStatus ? "1" : "0");
console.log("瀹屾暣鐨勬彁浜ゆ暟鎹細", this.QcIssueResultDetailes);
@@ -745,9 +984,9 @@
this.pstypeIndex = this.pstypeOptions.indexOf(this.PSTYPE);
- // 纭繚PHSY瀛楁琚纭缃�
- this.formData.PHSY = data.PHSY;
- this.PHSY = data.PHSY || ''; // 鍚屾椂璁剧疆椤甸潰缁戝畾鐨凱HSY鍙橀噺
+ // 纭繚PHSY瀛楁琚纭缃紙鍏煎澶у皬鍐欙級
+ this.formData.PHSY = data.PHSY || data.phsy;
+ this.PHSY = (data.PHSY || data.phsy || '').toString(); // 鍚屾椂璁剧疆椤甸潰缁戝畾鐨凱HSY鍙橀噺
console.log("鍔犺浇鐨勭揣鎬ユ斁琛岀姸鎬�:", this.formData.emergencyStatus);
this.$post({
@@ -760,6 +999,16 @@
let tableData = res1.data.tbBillList
//褰撳凡妫�楠屼釜鏁伴兘涓嶄负绌烘椂鎸夌収妫�娴嬬粨鏋勬帓搴�
tableData.sort((a, b) => {
+ // 棣栧厛鎸塅stand鎺掑簭锛欶stand涓嶄负绌虹殑鎺掑湪鍓嶉潰
+ const aHasFstand = a.fstand !== null && a.fstand !== undefined;
+ const bHasFstand = b.fstand !== null && b.fstand !== undefined;
+ if (aHasFstand && !bHasFstand) {
+ return -1;
+ } else if (!aHasFstand && bHasFstand) {
+ return 1;
+ }
+
+ // 鐒跺悗鎸夋楠岀粨鏋滄帓搴�
if (a.result === '鍚堟牸' && b.result === '鏈畬鎴�') {
return -1;
} else if (a.result === '鏈畬鎴�' && b.result === '鍚堟牸') {
@@ -807,11 +1056,13 @@
this.drawingShow = false
this.imageShow = false
this.productionShow = false
+ this.itemShow=false
},
drawingCancel() {
this.drawingShow = false
this.imageShow = false
this.productionShow = false
+ this.itemShow=false
},
fetchDrawingNumber() {
@@ -861,7 +1112,7 @@
});
this.drawingShow = true
},
-
+
//鍥剧焊鐩稿叧鏂囨。
openDrawings(item) {
@@ -1306,20 +1557,571 @@
},
addDestruction() {
// 娣诲姞鐮村潖瀹為獙鐨勯�昏緫
- this.destructionPopup = !this.destructionPopup;
- this.PHSY = this.formData.PHSY || '';
+ this.destructionPopup = true;
+
+ // 姣忔鐐瑰嚮閮芥煡璇㈡槸鍚﹀凡鏈夌牬鍧忓疄楠岃褰�
+ this.checkPhsyRecord();
+ },
+
+ // 鏌ヨ鐮村潖瀹為獙璁板綍鏄惁瀛樺湪
+ checkPhsyRecord() {
+ uni.showLoading({
+ title: '鏌ヨ鐮村潖瀹為獙璁板綍...'
+ });
+
+ this.$post({
+ url: "/LLJ/CheckPhsyRecord",
+ data: {
+ billNo: this.formData.lotNo, // 浣跨敤鍒拌揣鍗曞彿
+ releaseNo: this.formData.releaseNo // 浣跨敤妫�楠屽崟鍙�
+ }
+ }).then(res => {
+ uni.hideLoading();
+ if (res.status === 0) {
+ const hasRecord = res.data.exists;
+ if (hasRecord) {
+ // 鏈夎褰曪紝鏄剧ず鐗╂枡淇℃伅锛屽彧鏄剧ず淇敼銆佸垹闄ゃ�佽繑鍥炴寜閽�
+ this.showExistingRecord();
+ } else {
+ // 鏃犺褰曪紝鏄剧ず鎵弿鐣岄潰
+ this.showScanInterface();
+ }
+ } else {
+ uni.showToast({
+ title: res.message || '鏌ヨ澶辫触',
+ icon: 'none'
+ });
+ this.destructionPopup = false;
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('鏌ヨ鐮村潖瀹為獙璁板綍澶辫触:', err);
+ uni.showToast({
+ title: '鏌ヨ澶辫触锛岃閲嶈瘯',
+ icon: 'none'
+ });
+ this.destructionPopup = false;
+ });
+ },
+
+ // 鏄剧ず宸叉湁璁板綍
+ showExistingRecord() {
+ // 璁剧疆宸叉湁璁板綍鐘舵��
+ this.hasExistingRecord = true;
+ // 鑾峰彇鐮村潖瀹為獙璁板綍涓殑鐗╂枡淇℃伅
+ this.getPhsyRecordInfo();
+ },
+
+ // 鑾峰彇鐮村潖瀹為獙璁板綍淇℃伅
+ getPhsyRecordInfo() {
+ uni.showLoading({
+ title: '鑾峰彇鐮村潖瀹為獙璁板綍...'
+ });
+
+ this.$post({
+ url: "/LLJ/GetPhsyRecordInfo",
+ data: {
+ billNo: this.formData.lotNo, // 浣跨敤鍒拌揣鍗曞彿
+ releaseNo: this.formData.releaseNo // 浣跨敤妫�楠屽崟鍙�
+ }
+ }).then(res => {
+ uni.hideLoading();
+ if (res.status === 0 && res.data && res.data.tbBillList && res.data.tbBillList.length > 0) {
+ // 鑾峰彇鍒扮牬鍧忓疄楠岃褰曪紝璁剧疆鐗╂枡淇℃伅
+ const record = res.data.tbBillList[0];
+ this.scannedMaterialInfo = {
+ itemBarcode: record.itemBarcode,
+ itemNo: record.itemNo,
+ itemName: record.itemName,
+ itemModel: record.itemModel,
+ billNo: record.billNo,
+ oldQty: record.yqty
+ };
+ // 璁剧疆鐮村潖瀹為獙鏁伴噺
+ this.destructionQuantity = record.cqty ? record.cqty.toString() : '';
+ } else {
+ // 濡傛灉娌℃湁鑾峰彇鍒拌缁嗕俊鎭紝鏄剧ず鎻愮ず
+ uni.showToast({
+ title: '宸插瓨鍦ㄧ牬鍧忓疄楠岃褰�',
+ icon: 'none',
+ duration: 1500
+ });
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('鑾峰彇鐮村潖瀹為獙璁板綍澶辫触:', err);
+ uni.showToast({
+ title: '鑾峰彇璁板綍澶辫触锛岃閲嶈瘯',
+ icon: 'none'
+ });
+ });
+ },
+
+ // 鏄剧ず鎵弿鐣岄潰
+ showScanInterface() {
+ // 璁剧疆鏃犺褰曠姸鎬�
+ this.hasExistingRecord = false;
+ // 濡傛灉宸茬粡鏈夋壂鎻忕殑鐗╂枡淇℃伅锛岀洿鎺ユ樉绀虹粨鏋滄楠�
+ if (this.scannedMaterialInfo) {
+ // 淇濇寔褰撳墠鎵弿淇℃伅锛屼笉閲嶇疆
+ return;
+ }
+
+ // 濡傛灉娌℃湁鎵弿淇℃伅锛岄噸缃墍鏈夌浉鍏虫暟鎹�
+ this.scannedMaterialInfo = null;
+ this.destructionQuantity = '';
this.isInteger = true;
},
+
+ // 鎵弿浜岀淮鐮�
+ scanQRCode() {
+ // #ifdef APP-PLUS
+ // APP鐜浣跨敤uni.scanCode
+ uni.scanCode({
+ success: (res) => {
+ console.log('鎵弿缁撴灉:', res.result);
+ this.processQRCodeResult(res.result);
+ },
+ fail: (err) => {
+ console.error('鎵弿澶辫触:', err);
+ uni.showToast({
+ title: '鎵弿澶辫触锛岃閲嶈瘯',
+ icon: 'none'
+ });
+ }
+ });
+ // #endif
+
+ // #ifdef H5
+ // H5鐜鎻愮ず鐢ㄦ埛鎵嬪姩杈撳叆
+ uni.showModal({
+ title: '浜岀淮鐮佹壂鎻�',
+ content: 'H5鐜鏆備笉鏀寔鎽勫儚澶存壂鎻忥紝璇疯緭鍏ヤ簩缁寸爜鍐呭',
+ editable: true,
+ placeholderText: '璇疯緭鍏ヤ簩缁寸爜鍐呭',
+ success: (res) => {
+ if (res.confirm && res.content) {
+ this.processQRCodeResult(res.content);
+ }
+ }
+ });
+ // #endif
+
+ // #ifdef MP
+ // 灏忕▼搴忕幆澧冧娇鐢╳x.scanCode
+ wx.scanCode({
+ success: (res) => {
+ console.log('鎵弿缁撴灉:', res.result);
+ this.processQRCodeResult(res.result);
+ },
+ fail: (err) => {
+ console.error('鎵弿澶辫触:', err);
+ uni.showToast({
+ title: '鎵弿澶辫触锛岃閲嶈瘯',
+ icon: 'none'
+ });
+ }
+ });
+ // #endif
+ },
+
+ // 澶勭悊浜岀淮鐮佹壂鎻忕粨鏋�
+ processQRCodeResult(qrCodeResult) {
+ if (!qrCodeResult) {
+ uni.showToast({
+ title: '浜岀淮鐮佸唴瀹逛负绌�',
+ icon: 'none'
+ });
+ return;
+ }
+
+ // 鏄剧ず鍔犺浇鎻愮ず
+ uni.showLoading({
+ title: '鏌ヨ鐗╂枡淇℃伅...'
+ });
+
+ // 璋冪敤鍚庣鎺ュ彛鏌ヨ鐗╂枡淇℃伅
+ this.$post({
+ url: "/LLJ/GetMaterialByBarcode",
+ data: {
+ itemBarcode: qrCodeResult,
+ currentBillNo: this.formData.lotNo // 浼犻�掑綋鍓嶆楠屽崟鐨勫埌璐у崟鍙�
+ }
+ }).then(res => {
+ uni.hideLoading();
+ if (res.status === 0 && res.data && res.data.tbBillList && res.data.tbBillList.length > 0) {
+ // 鏌ヨ鎴愬姛锛岄獙璇佺墿鏂橧D鏄惁涓庢楠屽崟涓�鑷�
+ const scannedMaterial = res.data.tbBillList[0];
+
+ // 妫�鏌ユ壂鎻忕殑鐗╂枡ID鏄惁涓庡綋鍓嶆楠屽崟鐨勭墿鏂橧D涓�鑷�
+ if (this.formData.itemId && scannedMaterial.itemId &&
+ this.formData.itemId.toString() !== scannedMaterial.itemId.toString()) {
+ // 鐗╂枡ID涓嶄竴鑷达紝鏄剧ず閿欒淇℃伅
+ this.scannedMaterialInfo = null;
+ uni.showModal({
+ title: '鐗╂枡涓嶅尮閰�',
+ content: '鎵鐨勬潯鐮佷笉涓鸿妫�楠屽崟鐗╂枡锛岃閲嶆柊鎵弿',
+ showCancel: false
+ });
+ return;
+ }
+
+ // 鐗╂枡ID楠岃瘉閫氳繃锛屾樉绀虹墿鏂欎俊鎭�
+ this.scannedMaterialInfo = scannedMaterial;
+ // 淇濆瓨鎵弿鍒扮殑鏉$爜鍊硷紝鐢ㄤ簬鍚庣画璋冪敤瀛樺偍杩囩▼
+ this.scannedMaterialInfo.itemBarcode = qrCodeResult;
+ uni.showToast({
+ title: '鏌ヨ鎴愬姛',
+ icon: 'success'
+ });
+ } else {
+ // 鏌ヨ澶辫触锛屾樉绀洪敊璇俊鎭�
+ this.scannedMaterialInfo = null;
+ uni.showModal({
+ title: '鏌ヨ澶辫触',
+ content: res.message || '鏈壘鍒板搴旂殑鐗╂枡淇℃伅锛岃妫�鏌ヤ簩缁寸爜鏄惁姝g‘',
+ showCancel: false
+ });
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('鏌ヨ鐗╂枡淇℃伅澶辫触:', err);
+ this.scannedMaterialInfo = null;
+ uni.showModal({
+ title: '鏌ヨ澶辫触',
+ content: '缃戠粶閿欒锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶈瘯',
+ showCancel: false
+ });
+ });
+ },
+
+ // 娴嬭瘯杈撳叆
+ testInput() {
+ this.destructionQuantity = '5';
+ this.validateInteger();
+ uni.showToast({
+ title: '娴嬭瘯杈撳叆瀹屾垚',
+ icon: 'success'
+ });
+ },
+
+ // 鐐瑰嚮杈撳叆妗�
+ focusInput() {
+ // 浣跨敤uni-app鐨勮緭鍏ュ脊绐�
+ uni.showModal({
+ title: '杈撳叆鐮村潖瀹為獙鏁伴噺',
+ content: `鍙敤鏁伴噺: ${this.scannedMaterialInfo.oldQty}`,
+ editable: true,
+ placeholderText: '璇疯緭鍏ユ暟閲�',
+ success: (res) => {
+ if (res.confirm && res.content) {
+ this.destructionQuantity = res.content;
+ this.validateInteger();
+ }
+ }
+ });
+ },
+
+ // 楠岃瘉杈撳叆鏄惁涓烘暣鏁�
+ validateInteger() {
+ if (!this.destructionQuantity) {
+ this.isInteger = true;
+ return;
+ }
+
+ const value = this.destructionQuantity.toString().trim();
+ // 鍙厑璁告鏁存暟
+ this.isInteger = /^[1-9]\d*$/.test(value);
+ },
+
+ // 纭鐮村潖瀹為獙
+ confirmDestruction() {
+ if (!this.isInteger || !this.destructionQuantity) {
+ uni.showToast({
+ title: '璇疯緭鍏ユ湁鏁堢殑鏁存暟鏁伴噺',
+ icon: 'none'
+ });
+ return;
+ }
+
+ // 妫�鏌ユ壂鎻忕殑鐗╂枡淇℃伅鏄惁瀛樺湪
+ if (!this.scannedMaterialInfo) {
+ uni.showToast({
+ title: '璇峰厛鎵弿鐗╂枡浜岀淮鐮�',
+ icon: 'none'
+ });
+ return;
+ }
+
+ // 楠岃瘉鐮村潖瀹為獙鏁伴噺涓嶈兘澶т簬鍙敤鏁伴噺
+ const destructionQty = parseInt(this.destructionQuantity);
+ const availableQty = parseInt(this.scannedMaterialInfo.oldQty);
+
+ if (destructionQty > availableQty) {
+ uni.showModal({
+ title: '鏁伴噺閿欒',
+ content: `鐮村潖瀹為獙鏁伴噺(${destructionQty})涓嶈兘澶т簬鍙敤鏁伴噺(${availableQty})锛岃閲嶆柊濉啓鎴栭噸鏂版壂鐮侊紒`,
+ showCancel: false
+ });
+ return;
+ }
+
+ // 鏄剧ず鍔犺浇鎻愮ず
+ uni.showLoading({
+ title: '璋冪敤瀛樺偍杩囩▼涓�...'
+ });
+
+ // 璋冪敤鐮村潖瀹為獙瀛樺偍杩囩▼
+ this.$post({
+ url: "/LLJ/CallPhsyUpdateProcedure",
+ data: {
+ itemBarcode: this.scannedMaterialInfo.itemBarcode || this.scannedMaterialInfo.itemNo, // 浣跨敤鎵弿鐨勬潯鐮�
+ yqty: availableQty, // 鎵爜鏌ヨ鍑烘潵鐨勬潯鐮佹暟閲�
+ cqty: destructionQty, // 濉啓鐨勭牬鍧忓疄楠屾暟閲�
+ billNo: this.scannedMaterialInfo.billNo, // 鏌ヨ鍒扮殑鍒拌揣鍗曞彿
+ lx: 1, // 鎿嶄綔绫诲瀷锛�1鏂板
+ releaseNo: this.formData.releaseNo, // 妫�楠屽崟鍙�
+ itemId: this.formData.itemId // 妫�楠屽崟鐨勭墿鏂橧D
+ }
+ }).then(res => {
+ uni.hideLoading();
+
+ // 妫�鏌ュ瓨鍌ㄨ繃绋嬭繑鍥炵殑缁撴灉
+ if (res.status === 0) {
+ // 瀛樺偍杩囩▼鎵ц鎴愬姛
+ this.formData.PHSY = this.destructionQuantity;
+ this.destructionPopup = false;
+ this.hasExistingRecord = true; // 璁剧疆涓烘湁璁板綍鐘舵��
+ uni.showToast({
+ title: '鐮村潖瀹為獙璁板綍淇濆瓨鎴愬姛',
+ icon: 'success',
+ duration: 2000
+ });
+ // 绔嬪嵆閲嶆柊鍔犺浇鏁版嵁纭繚鍚屾
+ setTimeout(() => {
+ this.init();
+ }, 500);
+ } else {
+ // 瀛樺偍杩囩▼鎵ц澶辫触锛屾樉绀洪敊璇俊鎭�
+ uni.showModal({
+ title: '鎿嶄綔澶辫触',
+ content: res.message || '鐮村潖瀹為獙璁板綍淇濆瓨澶辫触',
+ showCancel: false
+ });
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('璋冪敤瀛樺偍杩囩▼澶辫触锛�', err);
+ uni.showModal({
+ title: '缃戠粶閿欒',
+ content: '璋冪敤瀛樺偍杩囩▼澶辫触锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶈瘯',
+ showCancel: false
+ });
+ });
+ },
+
+ // 淇敼鐮村潖瀹為獙锛堝彧淇敼鏁伴噺锛�
+ modifyDestruction() {
+ // 鏄剧ず鏁伴噺杈撳叆鐣岄潰
+ uni.showModal({
+ title: '淇敼鐮村潖瀹為獙鏁伴噺',
+ content: '璇疯緭鍏ユ柊鐨勭牬鍧忓疄楠屾暟閲�',
+ editable: true,
+ placeholderText: '璇疯緭鍏ユ暟閲�',
+ success: (res) => {
+ if (res.confirm && res.content) {
+ const newQuantity = parseInt(res.content);
+ if (isNaN(newQuantity) || newQuantity <= 0) {
+ uni.showToast({
+ title: '璇疯緭鍏ユ湁鏁堢殑姝f暣鏁�',
+ icon: 'none'
+ });
+ return;
+ }
+
+ // 璋冪敤淇敼瀛樺偍杩囩▼
+ this.callModifyProcedure(newQuantity);
+ }
+ }
+ });
+ },
+
+ // 璋冪敤淇敼瀛樺偍杩囩▼
+ callModifyProcedure(newQuantity) {
+ uni.showLoading({
+ title: '淇敼涓�...'
+ });
+
+ // 鑾峰彇褰撳墠鎵弿鐨勭墿鏂欎俊鎭�
+ const itemBarcode = (this.scannedMaterialInfo && this.scannedMaterialInfo.itemBarcode) ||
+ (this.scannedMaterialInfo && this.scannedMaterialInfo.itemNo) || '';
+ const yqty = (this.scannedMaterialInfo && this.scannedMaterialInfo.oldQty) || 0;
+
+ this.$post({
+ url: "/LLJ/CallPhsyUpdateProcedure",
+ data: {
+ itemBarcode: itemBarcode, // 浣跨敤鎵弿鐨勬潯鐮�
+ yqty: yqty, // 浣跨敤鎵爜鏌ヨ鍑烘潵鐨勬潯鐮佹暟閲�
+ cqty: newQuantity, // 鏂扮殑鐮村潖瀹為獙鏁伴噺
+ billNo: this.formData.lotNo, // 鍒拌揣鍗曞彿
+ lx: 2, // 鎿嶄綔绫诲瀷锛�2淇敼
+ releaseNo: this.formData.releaseNo, // 妫�楠屽崟鍙�
+ itemId: this.formData.itemId // 妫�楠屽崟鐨勭墿鏂橧D
+ }
+ }).then(res => {
+ uni.hideLoading();
+
+ if (res.status === 0) {
+ // 淇敼鎴愬姛
+ this.formData.PHSY = newQuantity.toString();
+ this.PHSY = newQuantity.toString();
+ this.destructionPopup = false;
+
+ uni.showToast({
+ title: '淇敼鎴愬姛',
+ icon: 'success',
+ duration: 2000
+ });
+
+ // 閲嶆柊鍔犺浇鏁版嵁
+ setTimeout(() => {
+ this.init();
+ }, 500);
+ } else {
+ uni.showModal({
+ title: '淇敼澶辫触',
+ content: res.message || '淇敼澶辫触',
+ showCancel: false
+ });
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('淇敼澶辫触锛�', err);
+ uni.showModal({
+ title: '缃戠粶閿欒',
+ content: '淇敼澶辫触锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶈瘯',
+ showCancel: false
+ });
+ });
+ },
+
+ // 鍒犻櫎鐮村潖瀹為獙
+ deleteDestruction() {
+ uni.showModal({
+ title: '纭鍒犻櫎',
+ content: '纭畾瑕佸垹闄ゅ綋鍓嶇殑鐮村潖瀹為獙璁板綍鍚楋紵',
+ success: (res) => {
+ if (res.confirm) {
+ // 璋冪敤瀛樺偍杩囩▼鍒犻櫎璁板綍
+ this.callDeleteProcedure();
+ }
+ }
+ });
+ },
+
+ // 璋冪敤鍒犻櫎瀛樺偍杩囩▼
+ callDeleteProcedure() {
+ uni.showLoading({
+ title: '鍒犻櫎涓�...'
+ });
+
+ // 鑾峰彇褰撳墠鎵弿鐨勭墿鏂欎俊鎭�
+ const itemBarcode = (this.scannedMaterialInfo && this.scannedMaterialInfo.itemBarcode) ||
+ (this.scannedMaterialInfo && this.scannedMaterialInfo.itemNo) || '';
+ const yqty = (this.scannedMaterialInfo && this.scannedMaterialInfo.oldQty) || 0;
+ const cqty = parseFloat(this.destructionQuantity) || 0; // 浣跨敤褰撳墠璁板綍鐨勭牬鍧忔暟閲�
+
+ this.$post({
+ url: "/LLJ/CallPhsyUpdateProcedure",
+ data: {
+ itemBarcode: itemBarcode, // 浣跨敤鎵弿鐨勬潯鐮�
+ yqty: yqty, // 浣跨敤鎵爜鏌ヨ鍑烘潵鐨勬潯鐮佹暟閲�
+ cqty: cqty, // 浣跨敤褰撳墠璁板綍鐨勭牬鍧忔暟閲�
+ billNo: this.formData.lotNo, // 鍒拌揣鍗曞彿
+ lx: 3, // 鎿嶄綔绫诲瀷锛�3鍒犻櫎
+ releaseNo: this.formData.releaseNo, // 妫�楠屽崟鍙�
+ itemId: this.formData.itemId // 妫�楠屽崟鐨勭墿鏂橧D
+ }
+ }).then(res => {
+ uni.hideLoading();
+
+ if (res.status === 0) {
+ // 鍒犻櫎鎴愬姛
+ this.scannedMaterialInfo = null;
+ this.destructionQuantity = '';
+ this.isInteger = true;
+ this.formData.PHSY = '';
+ this.PHSY = '';
+ this.hasExistingRecord = false;
+ this.destructionPopup = false;
+
+ uni.showToast({
+ title: '鍒犻櫎鎴愬姛',
+ icon: 'success',
+ duration: 2000
+ });
+
+ // 閲嶆柊鍔犺浇鏁版嵁
+ setTimeout(() => {
+ this.init();
+ }, 500);
+ } else {
+ uni.showModal({
+ title: '鍒犻櫎澶辫触',
+ content: res.message || '鍒犻櫎澶辫触',
+ showCancel: false
+ });
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('鍒犻櫎澶辫触锛�', err);
+ uni.showModal({
+ title: '缃戠粶閿欒',
+ content: '鍒犻櫎澶辫触锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶈瘯',
+ showCancel: false
+ });
+ });
+ },
+
+ // 閲嶇疆鐮村潖瀹為獙锛堣繑鍥炰笂涓�姝ワ級
+ resetDestruction() {
+ this.scannedMaterialInfo = null;
+ this.destructionQuantity = '';
+ this.isInteger = true;
+ this.hasExistingRecord = false;
+ this.destructionPopup = false; // 鐩存帴鍏抽棴寮圭獥锛岃繑鍥炲埌琛ㄥ崟
+ },
+
+ // 鍏抽棴鐮村潖瀹為獙寮圭獥
+ closeDestructionPopup() {
+ this.destructionPopup = false;
+ // 閲嶇疆鎵�鏈夌浉鍏虫暟鎹�
+ this.scannedMaterialInfo = null;
+ this.destructionQuantity = '';
+ this.isInteger = true;
+ },
+
editDestruction() {
+ // 楠岃瘉杈撳叆鏄惁涓烘暣鏁版垨绌哄瓧绗︿覆
if(this.PHSY === '') {
this.isInteger = true;
} else {
const isInteger = /^-?\d+$/.test(this.PHSY);
this.isInteger = isInteger;
if (!isInteger) {
+ uni.showToast({
+ title: '璇疯緭鍏ユ暣鏁板�兼垨鐣欑┖',
+ icon: 'none',
+ duration: 2000
+ });
return;
}
}
+
+ // 鏄剧ず鍔犺浇鎻愮ず
+ uni.showLoading({
+ title: '淇濆瓨涓�...'
+ });
this.$post({
url: "/LLJ/savePhsyGid",
@@ -1329,20 +2131,42 @@
PHSY: this.PHSY
}
}).then(res => {
- if (res.data.tbBillList > 0) {
+ uni.hideLoading();
+ if (res.data && res.data.tbBillList > 0) {
this.formData.PHSY = this.PHSY === '' ? null : this.PHSY;
this.destructionPopup = false;
+ uni.showToast({
+ title: '淇濆瓨鎴愬姛',
+ icon: 'success',
+ duration: 2000
+ });
// 绔嬪嵆閲嶆柊鍔犺浇鏁版嵁纭繚鍚屾
setTimeout(() => {
this.init();
}, 500);
+ } else {
+ uni.showToast({
+ title: '淇濆瓨澶辫触',
+ icon: 'none',
+ duration: 2000
+ });
}
}).catch(err => {
+ uni.hideLoading();
console.error('淇濆瓨澶辫触锛�', err);
+ uni.showToast({
+ title: '淇濆瓨澶辫触锛岃閲嶈瘯',
+ icon: 'none',
+ duration: 2000
+ });
})
},
clearDestruction() {
- this.PHSY = '';
+ // 鏄剧ず鍔犺浇鎻愮ず
+ uni.showLoading({
+ title: '娓呴櫎涓�...'
+ });
+
this.$post({
url: "/LLJ/savePhsyGid",
data: {
@@ -1351,16 +2175,35 @@
PHSY: ''
}
}).then(res => {
- if (res.data.tbBillList > 0) {
+ uni.hideLoading();
+ if (res.data && res.data.tbBillList > 0) {
this.formData.PHSY = null;
+ this.PHSY = '';
this.destructionPopup = false;
+ uni.showToast({
+ title: '娓呴櫎鎴愬姛',
+ icon: 'success',
+ duration: 2000
+ });
// 绔嬪嵆閲嶆柊鍔犺浇鏁版嵁纭繚鍚屾
setTimeout(() => {
this.init();
}, 500);
+ } else {
+ uni.showToast({
+ title: '娓呴櫎澶辫触',
+ icon: 'none',
+ duration: 2000
+ });
}
}).catch(err => {
+ uni.hideLoading();
console.error('娓呴櫎澶辫触锛�', err);
+ uni.showToast({
+ title: '娓呴櫎澶辫触锛岃閲嶈瘯',
+ icon: 'none',
+ duration: 2000
+ });
})
},
viewAttachmentInfo() {
@@ -1420,6 +2263,59 @@
'ppt', 'pptx', // PowerPoint婕旂ず鏂囩
'csv' // CSV鏂囦欢
].includes(ext);
+ },
+
+ // 鑾峰彇鏂囦欢绫诲瀷鍥炬爣
+ getFileTypeIcon(filename) {
+ if (!filename) return '馃搫';
+ const ext = filename.trim().split('.').pop().toLowerCase();
+ const iconMap = {
+ 'pdf': '馃摃',
+ 'jpg': '馃柤锔�', 'jpeg': '馃柤锔�', 'png': '馃柤锔�', 'gif': '馃柤锔�', 'bmp': '馃柤锔�', 'webp': '馃柤锔�',
+ 'txt': '馃摑', 'log': '馃摑', 'md': '馃摑',
+ 'doc': '馃摌', 'docx': '馃摌',
+ 'xls': '馃搳', 'xlsx': '馃搳',
+ 'ppt': '馃摍', 'pptx': '馃摍',
+ 'csv': '馃搳',
+ 'zip': '馃摝', 'rar': '馃摝', '7z': '馃摝',
+ 'dwg': '馃彈锔�', 'dxf': '馃彈锔�'
+ };
+ return iconMap[ext] || '馃搫';
+ },
+
+ // 鑾峰彇鏂囦欢绫诲瀷CSS绫�
+ getFileTypeClass(filename) {
+ if (!filename) return 'file-unknown';
+ const ext = filename.trim().split('.').pop().toLowerCase();
+ const classMap = {
+ 'pdf': 'file-pdf',
+ 'jpg': 'file-image', 'jpeg': 'file-image', 'png': 'file-image', 'gif': 'file-image', 'bmp': 'file-image', 'webp': 'file-image',
+ 'txt': 'file-text', 'log': 'file-text', 'md': 'file-text',
+ 'doc': 'file-word', 'docx': 'file-word',
+ 'xls': 'file-excel', 'xlsx': 'file-excel',
+ 'ppt': 'file-powerpoint', 'pptx': 'file-powerpoint',
+ 'csv': 'file-excel',
+ 'zip': 'file-archive', 'rar': 'file-archive', '7z': 'file-archive',
+ 'dwg': 'file-cad', 'dxf': 'file-cad'
+ };
+ return classMap[ext] || 'file-unknown';
+ },
+
+ // 鏍煎紡鍖栨棩鏈�
+ formatDate(dateString) {
+ if (!dateString) return '';
+ try {
+ const date = new Date(dateString);
+ return date.toLocaleDateString('zh-CN', {
+ year: 'numeric',
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ } catch (e) {
+ return dateString;
+ }
},
// 澶勭悊闄勪欢涓嬭浇閿欒
handleAttachmentError(item) {
@@ -1571,7 +2467,7 @@
showFilePreview(content, fileName) {
this.previewContent = content;
this.previewTitle = fileName;
- this.previewItemNo = this.selectedAttachment?.itemNo || '';
+ this.previewItemNo = (this.selectedAttachment && this.selectedAttachment.itemNo) || '';
this.previewType = this.getFileType(fileName);
this.showFilePreviewPopup = true;
},
@@ -1929,6 +2825,163 @@
// #endif
},
+
+ // 鍏ㄥ眬鍫电┐鐩稿叧鏂规硶
+ // 妫�鏌ユ楠岄」鐩槸鍚︽湁绌存暟
+ hasHoleCount(fcheckItem) {
+ if (!fcheckItem) return false;
+ const match = fcheckItem.match(/[锛�(](\d+)绌碵锛�)]/);
+ return match ? true : false;
+ },
+
+ // 鑾峰彇绌存暟
+ getHoleCount(fcheckItem) {
+ if (!fcheckItem) return 0;
+ const match = fcheckItem.match(/[锛�(](\d+)绌碵锛�)]/);
+ return match ? parseInt(match[1]) : 0;
+ },
+
+ // 鎵撳紑鍏ㄥ眬鍫电┐瀵硅瘽妗�
+ openGlobalBlockHoleDialog() {
+ console.log('鐐瑰嚮鍫电┐璁剧疆鎸夐挳');
+ console.log('tableData:', this.tableData);
+
+ // 妫�鏌ユ槸鍚︽湁鏈夊紑绌存暟鐨勬楠岄」鐩�
+ const hasHoleItems = this.tableData.some(item => this.hasHoleCount(item.fcheckItem));
+ console.log('hasHoleItems:', hasHoleItems);
+
+ if (!hasHoleItems) {
+ uni.showModal({
+ title: '鎻愮ず',
+ content: '褰撳墠妫�楠屽崟娌℃湁鏈夊紑绌存暟鐨勬楠岄」鐩�',
+ showCancel: false
+ });
+ return;
+ }
+
+ this.globalBlockHoleInput = '';
+ this.globalBlockHolePopup = true;
+ console.log('璁剧疆globalBlockHolePopup涓簍rue');
+ this.validateGlobalBlockHoleInput();
+ },
+
+ // 鍏抽棴鍏ㄥ眬鍫电┐瀵硅瘽妗�
+ closeGlobalBlockHoleDialog() {
+ this.globalBlockHolePopup = false;
+ this.globalBlockHoleInput = '';
+ this.globalBlockHoleError = '';
+ this.isGlobalBlockHoleValid = false;
+ },
+
+
+ // 澶勭悊鍏ㄥ眬鍫电┐杈撳叆锛堜繚鐣欏師鏂规硶浠ラ槻鍏朵粬鍦版柟璋冪敤锛�
+ onGlobalBlockHoleInput(e) {
+ console.log('杈撳叆浜嬩欢瑙﹀彂:', e);
+ // 鍏煎涓嶅悓鐨勪簨浠舵牸寮�
+ const value = e.detail ? e.detail.value : e.target ? e.target.value : e;
+ console.log('杈撳叆鍊�:', value);
+ this.globalBlockHoleInput = value;
+ this.validateGlobalBlockHoleInput();
+ },
+
+ // 楠岃瘉鍏ㄥ眬鍫电┐杈撳叆
+ validateGlobalBlockHoleInput() {
+ const input = this.globalBlockHoleInput.trim();
+ if (!input) {
+ this.globalBlockHoleError = '';
+ this.isGlobalBlockHoleValid = false;
+ return;
+ }
+
+ // 楠岃瘉鏍煎紡锛�1,2,3 鎴� 1锛�2锛�3
+ const blockedHoles = input.split(/[,锛宂/).map(s => s.trim()).filter(s => s);
+
+ // 妫�鏌ユ槸鍚﹂兘鏄湁鏁堟暟瀛�
+ const isValid = blockedHoles.every(hole => {
+ const num = parseInt(hole);
+ return !isNaN(num) && num > 0;
+ });
+
+ if (!isValid) {
+ this.globalBlockHoleError = '璇疯緭鍏ユ湁鏁堢殑绌村彿锛岀敤閫楀彿鍒嗛殧';
+ this.isGlobalBlockHoleValid = false;
+ return;
+ }
+
+ // 妫�鏌ユ槸鍚︽湁閲嶅
+ const uniqueHoles = [...new Set(blockedHoles.map(h => parseInt(h)))];
+ if (uniqueHoles.length !== blockedHoles.length) {
+ this.globalBlockHoleError = '涓嶈兘杈撳叆閲嶅鐨勭┐鍙�';
+ this.isGlobalBlockHoleValid = false;
+ return;
+ }
+
+ this.globalBlockHoleError = '';
+ this.isGlobalBlockHoleValid = true;
+ },
+
+ // 纭鍏ㄥ眬鍫电┐
+ confirmGlobalBlockHole() {
+ if (!this.isGlobalBlockHoleValid) return;
+
+ uni.showLoading({
+ title: '璁剧疆鍫电┐涓�...'
+ });
+
+ // 鑾峰彇鎵�鏈夋湁寮�绌存暟鐨勬楠岄」鐩�
+ const holeItems = this.tableData.filter(item => this.hasHoleCount(item.fcheckItem));
+
+ // 鎵归噺璋冪敤鍚庣鎺ュ彛璁剧疆鍫电┐
+ const promises = holeItems.map(item => {
+ return this.$post({
+ url: "/LLJ/SetBlockedHoles",
+ data: {
+ releaseNo: this.formData.releaseNo,
+ blockedHoles: this.globalBlockHoleInput,
+ itemId: item.id
+ }
+ });
+ });
+
+ Promise.all(promises).then(results => {
+ uni.hideLoading();
+
+ // 妫�鏌ユ墍鏈夎姹傛槸鍚︽垚鍔�
+ const failedCount = results.filter(res => res.status !== 0).length;
+
+ if (failedCount === 0) {
+ uni.showToast({
+ title: `鎴愬姛涓�${holeItems.length}涓楠岄」鐩缃牭绌碻,
+ icon: 'success',
+ duration: 2000
+ });
+
+ // 绔嬪嵆鍏抽棴瀵硅瘽妗�
+ this.closeGlobalBlockHoleDialog();
+
+ // 绔嬪嵆閲嶆柊鍔犺浇鏁版嵁纭繚鍚屾
+ setTimeout(() => {
+ this.init();
+ }, 500);
+ } else {
+ uni.showModal({
+ title: '閮ㄥ垎璁剧疆澶辫触',
+ content: `${failedCount}涓楠岄」鐩缃け璐ワ紝璇烽噸璇昤,
+ showCancel: false
+ });
+ }
+ }).catch(err => {
+ uni.hideLoading();
+ console.error('鍏ㄥ眬鍫电┐璁剧疆澶辫触:', err);
+ uni.showModal({
+ title: '缃戠粶閿欒',
+ content: '鍫电┐璁剧疆澶辫触锛岃妫�鏌ョ綉缁滆繛鎺ュ悗閲嶈瘯',
+ showCancel: false
+ });
+ });
+ },
+
+
}
}
</script>
@@ -1944,6 +2997,39 @@
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
min-height: 100vh;
position: relative;
+ transition: all 0.3s ease;
+ }
+
+ /* 鏈淮鎶や笖闈炵揣鎬ユ斁琛岃〃鍗曠殑绱壊鏍峰紡 */
+ .inspection-sheet.unmaintained-form {
+ background: linear-gradient(135deg, #f8f4ff 0%, #f0e6ff 100%);
+ border: 2px solid #9c27b0;
+ box-shadow: 0 0 20px rgba(156, 39, 176, 0.2);
+ }
+
+ .inspection-sheet.unmaintained-form .sheet-header {
+ border-bottom: 2px solid #9c27b0;
+ }
+
+ .inspection-sheet.unmaintained-form .sheet-header h1 {
+ color: #6a1b9a;
+ }
+
+ .inspection-sheet.unmaintained-form .inspection-number {
+ color: #9c27b0;
+ }
+
+ .inspection-sheet.unmaintained-form .material-info {
+ border: 1px solid #e1bee7;
+ background-color: rgba(156, 39, 176, 0.05);
+ }
+
+ .inspection-sheet.unmaintained-form .info-label {
+ color: #6a1b9a;
+ }
+
+ .inspection-sheet.unmaintained-form .info-value {
+ color: #4a148c;
}
/* 澶撮儴鏍峰紡 */
@@ -2266,9 +3352,14 @@
align-items: center;
z-index: 1000; /* 鎻愰珮灞傜骇锛岀‘淇濆湪鍥哄畾鎸夐挳涓婃柟 */
}
+
+ /* 鍏ㄥ眬鍫电┐璁剧疆瀵硅瘽妗嗛渶瑕佹洿楂樼殑z-index */
+ .global-block-hole-popup {
+ z-index: 1001;
+ }
/* 寮圭獥鏁翠綋缇庡寲 */
- .popup, .attachment-detail-popup {
+ .popup {
background: #fff;
border-radius: 16px;
box-shadow: 0 8px 32px rgba(60,60,60,0.18);
@@ -2280,123 +3371,9 @@
max-height: 80vh; /* 闄愬埗鏈�澶ч珮搴︼紝閬垮厤琚簳閮ㄦ寜閽伄鎸� */
overflow-y: auto; /* 鍐呭杩囧鏃跺彲婊氬姩 */
}
- .attachment-popup-title {
- font-size: 22px;
- font-weight: 700;
- color: #222;
- margin-bottom: 8px;
- letter-spacing: 1px;
- text-align: center;
- }
- .attachment-popup-divider {
- height: 1px;
- background: linear-gradient(90deg,#e0e7ef 0%,#f5f7fa 100%);
- margin-bottom: 18px;
- }
+
.attachment-detail-content {
margin-bottom: 18px;
- }
- .attachment-detail-row {
- display: flex;
- align-items: center;
- margin-bottom: 8px;
- font-size: 15px;
- }
- .attachment-label {
- min-width: 80px;
- color: #1976d2;
- font-weight: 500;
- margin-right: 8px;
- }
- .attachment-preview-area {
- margin: 18px 0 8px 0;
- border-radius: 10px;
- background: #f8fafc;
- padding: 10px;
- box-shadow: 0 2px 8px rgba(60,60,60,0.06);
- }
- .attachment-download-area {
- margin: 18px 0 8px 0;
- text-align: center;
- }
- .attachment-download-link {
- display: inline-block;
- padding: 7px 18px;
- background: linear-gradient(90deg,#4f8cff 0%,#1976d2 100%);
- color: #fff;
- border-radius: 6px;
- font-weight: 500;
- text-decoration: none;
- transition: background 0.2s;
- box-shadow: 0 2px 8px rgba(60,60,60,0.08);
- }
- .attachment-download-link:hover {
- background: linear-gradient(90deg,#1976d2 0%,#4f8cff 100%);
- }
- .attachment-detail-empty {
- color: #888;
- text-align: center;
- margin: 30px 0;
- font-size: 16px;
- }
- .attachment-popup-close {
- margin-top: 18px;
- width: 100%;
- background: linear-gradient(90deg,#e0e0e0 0%,#f5f7fa 100%);
- color: #444;
- border-radius: 8px;
- font-size: 16px;
- padding: 10px 0;
- border: none;
- font-weight: 600;
- letter-spacing: 1px;
- transition: background 0.2s, color 0.2s;
- box-shadow: 0 2px 8px rgba(60,60,60,0.06);
- }
- .attachment-popup-close:hover {
- background: linear-gradient(90deg,#bdbdbd 0%,#e0e0e0 100%);
- color: #1976d2;
- }
-
- /* 闄勪欢璇︽儏椤甸潰鐨勬搷浣滄寜閽� */
- .attachment-actions-detail {
- margin: 20px 0;
- display: flex;
- gap: 12px;
- justify-content: center;
- flex-wrap: wrap;
- }
- .attachment-action-btn {
- padding: 10px 20px;
- border: none;
- border-radius: 8px;
- font-size: 14px;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.3s ease;
- display: flex;
- align-items: center;
- justify-content: center;
- min-width: 120px;
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
- }
- .attachment-action-btn.preview-btn {
- background: linear-gradient(135deg, #4CAF50, #45a049);
- color: white;
- }
- .attachment-action-btn.preview-btn:hover {
- background: linear-gradient(135deg, #45a049, #3d8b40);
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0,0,0,0.15);
- }
- .attachment-action-btn.download-btn {
- background: linear-gradient(135deg, #2196F3, #1976D2);
- color: white;
- }
- .attachment-action-btn.download-btn:hover {
- background: linear-gradient(135deg, #1976D2, #1565C0);
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0,0,0,0.15);
}
/* 鏂囦欢棰勮寮圭獥鏍峰紡 */
@@ -2515,84 +3492,321 @@
background: linear-gradient(135deg, #bdbdbd, #9e9e9e);
transform: translateY(-1px);
}
- /* 鍒楄〃寮圭獥缇庡寲锛堜繚鐣欏師鏈夛級 */
- .attachment-list {
- padding: 0;
+ /* 闄勪欢鐩稿叧鏍峰紡 */
+ .attachment-list-popup {
+ width: 80vw;
+ max-width: 800px;
+ max-height: 85vh;
+ }
+
+ .attachment-detail-popup {
+ width: 70vw;
+ max-width: 600px;
+ }
+
+ .attachment-popup-header {
+ padding: 16px;
+ border-bottom: 1px solid #eee;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background-color: white;
+ }
+
+ .attachment-popup-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #2c3e50;
margin: 0;
- list-style: none;
- max-height: 300px;
+ }
+
+ .attachment-close-btn {
+ padding: 8px 16px;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ background-color: white;
+ font-size: 14px;
+ transition: all 0.2s;
+ color: #2c3e50;
+ }
+
+ .attachment-close-btn:hover {
+ background-color: #f8f9fa;
+ }
+
+ .attachment-popup-content {
+ padding: 16px;
+ max-height: 60vh;
overflow-y: auto;
}
- .attachment-list li {
+
+ /* 鍔犺浇鐘舵�� */
+ .attachment-loading {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+ gap: 16px;
+ }
+
+ .loading-spinner {
+ width: 32px;
+ height: 32px;
+ border: 3px solid #f3f3f3;
+ border-top: 3px solid #3498db;
+ border-radius: 50%;
+ animation: spin 1s linear infinite;
+ }
+
+ @keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+ }
+
+ .loading-text {
+ font-size: 14px;
+ color: #7f8c8d;
+ }
+
+ /* 绌虹姸鎬� */
+ .attachment-empty {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 40px 20px;
+ gap: 12px;
+ text-align: center;
+ }
+
+ .empty-icon {
+ font-size: 36px;
+ opacity: 0.6;
+ }
+
+ .empty-text {
+ font-size: 16px;
+ color: #7f8c8d;
+ font-weight: 500;
+ }
+
+ .empty-hint {
+ font-size: 14px;
+ color: #95a5a6;
+ }
+
+ /* 闄勪欢鍒楄〃甯冨眬 */
+ .attachment-list {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ }
+
+ .attachment-item {
+ background-color: white;
+ border-radius: 8px;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+ overflow: hidden;
+ transition: all 0.3s;
+ border: 1px solid #eee;
+ }
+
+ .attachment-item:hover {
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
+ }
+
+ .attachment-info {
+ padding: 16px;
+ border-bottom: 1px solid #eee;
display: flex;
align-items: center;
- justify-content: space-between;
- padding: 12px 0;
- border-bottom: 1px solid #f0f0f0;
+ gap: 16px;
}
- .attachment-info {
- flex: 1;
- margin-right: 10px;
- }
- .attachment-name {
- color: #3498db;
- cursor: pointer;
- font-weight: 500;
- transition: color 0.2s;
- display: block;
- margin-bottom: 4px;
- }
- .attachment-name:hover {
- color: #217dbb;
- text-decoration: underline;
- }
- .attachment-meta {
- font-size: 12px;
- }
- .attachment-type {
- color: #7f8c8d;
- font-style: italic;
- }
- .attachment-actions {
+
+ .file-type-badge {
+ width: 40px;
+ height: 40px;
+ border-radius: 8px;
display: flex;
- gap: 8px;
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+ background: #f8f9fa;
+ border: 2px solid #e9ecef;
flex-shrink: 0;
}
- .attachment-list .secondary-btn {
- padding: 4px 10px;
- font-size: 13px;
- border-radius: 3px;
- background: #f5f7fa;
- color: #333;
- border: 1px solid #dbe2ea;
- transition: background 0.2s, color 0.2s;
+
+ .file-type-badge.large {
+ width: 56px;
+ height: 56px;
+ font-size: 28px;
}
- .attachment-list .secondary-btn:hover {
- background: #e6f0fa;
- color: #1976d2;
+
+ .file-type-badge.file-pdf { background: #ffe6e6; border-color: #ffcccc; }
+ .file-type-badge.file-image { background: #e6f3ff; border-color: #cce7ff; }
+ .file-type-badge.file-text { background: #e6ffe6; border-color: #ccffcc; }
+ .file-type-badge.file-word { background: #e6f0ff; border-color: #cce0ff; }
+ .file-type-badge.file-excel { background: #e6ffe6; border-color: #ccffcc; }
+ .file-type-badge.file-powerpoint { background: #fff0e6; border-color: #ffe0cc; }
+ .file-type-badge.file-archive { background: #f0e6ff; border-color: #e0ccff; }
+ .file-type-badge.file-cad { background: #e6fff0; border-color: #ccffe0; }
+ .file-type-badge.file-unknown { background: #f5f5f5; border-color: #e0e0e0; }
+
+ .attachment-details {
+ flex: 1;
+ min-width: 0;
}
- .preview-btn {
- background: #e8f5e8 !important;
- color: #2e7d2e !important;
- border-color: #a5d6a5 !important;
+
+ .attachment-name {
+ font-size: 16px;
+ font-weight: 600;
+ color: #2c3e50;
+ cursor: pointer;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ margin-bottom: 8px;
+ transition: color 0.2s;
}
- .preview-btn:hover {
- background: #d4eecc !important;
- color: #1e5f1e !important;
+
+ .attachment-name:hover {
+ color: #3498db;
}
- .attachment-popup-close {
- margin-top: 18px;
- width: 100%;
- background: #e0e0e0;
- color: #444;
+
+ .attachment-meta {
+ display: flex;
+ gap: 16px;
+ font-size: 12px;
+ color: #95a5a6;
+ }
+
+ .meta-type {
+ background-color: #ecf0f1;
+ padding: 2px 6px;
+ border-radius: 10px;
+ color: #7f8c8d;
+ }
+
+ .meta-version {
+ background-color: #e8f5e8;
+ padding: 2px 6px;
+ border-radius: 10px;
+ color: #2e7d32;
+ }
+
+ .meta-date {
+ background-color: #fff3e0;
+ padding: 2px 6px;
+ border-radius: 10px;
+ color: #f57c00;
+ }
+
+ .attachment-actions {
+ padding: 12px 16px;
+ border-top: 1px solid #eee;
+ display: flex;
+ gap: 8px;
+ background-color: #f8f9fa;
+ }
+
+ /* 鎸夐挳鏍峰紡 */
+ .btn-secondary {
+ padding: 8px 16px;
+ border: 1px solid #ddd;
border-radius: 4px;
- font-size: 15px;
- padding: 8px 0;
- border: none;
- transition: background 0.2s;
+ background-color: white;
+ font-size: 14px;
+ transition: all 0.2s;
+ color: #2c3e50;
+ flex: 1;
}
- .attachment-popup-close:hover {
- background: #bdbdbd;
+
+ .btn-secondary:hover {
+ background-color: #f8f9fa;
+ }
+
+ .btn-primary {
+ padding: 8px 16px;
+ border: 1px solid #3498db;
+ border-radius: 4px;
+ background-color: #3498db;
+ color: white;
+ font-size: 14px;
+ transition: all 0.2s;
+ flex: 1;
+ }
+
+ .btn-primary:hover {
+ background-color: #2980b9;
+ }
+
+ .btn-success {
+ padding: 8px 16px;
+ border: 1px solid #2ecc71;
+ border-radius: 4px;
+ background-color: #2ecc71;
+ color: white;
+ font-size: 14px;
+ transition: all 0.2s;
+ flex: 1;
+ }
+
+ .btn-success:hover {
+ background-color: #27ae60;
+ }
+
+ /* 闄勪欢璇︽儏鏍峰紡 */
+ .attachment-detail-header {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ margin-bottom: 20px;
+ padding-bottom: 16px;
+ border-bottom: 1px solid #eee;
+ }
+
+ .attachment-detail-title {
+ font-size: 18px;
+ font-weight: 600;
+ color: #2c3e50;
+ flex: 1;
+ word-break: break-all;
+ }
+
+ .attachment-detail-info {
+ margin-bottom: 20px;
+ }
+
+ .info-row {
+ display: flex;
+ margin-bottom: 12px;
+ gap: 16px;
+ }
+
+ .info-item {
+ flex: 1;
+ }
+
+ .info-label {
+ display: block;
+ font-size: 12px;
+ color: #7f8c8d;
+ margin-bottom: 4px;
+ }
+
+ .info-content {
+ font-size: 14px;
+ color: #2c3e50;
+ line-height: 1.5;
+ }
+
+ .attachment-detail-actions {
+ padding: 12px 16px;
+ border-top: 1px solid #eee;
+ display: flex;
+ gap: 8px;
+ background-color: #f8f9fa;
}
/* 鍝嶅簲寮忚璁� */
@@ -2670,4 +3884,677 @@
flex-direction: column;
align-items: center;
}
+
+ /* 鎵弿鎸夐挳鏍峰紡 */
+ .scan-btn {
+ background: linear-gradient(135deg, #4CAF50, #45a049);
+ color: white;
+ border: none;
+ border-radius: 8px;
+ padding: 12px 20px;
+ font-size: 14px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+ }
+
+ .scan-btn:hover {
+ background: linear-gradient(135deg, #45a049, #3d8b40);
+ transform: translateY(-1px);
+ box-shadow: 0 4px 8px rgba(0,0,0,0.15);
+ }
+
+ /* 鐗╂枡淇℃伅鏄剧ず鏍峰紡 */
+ .material-info-display {
+ margin-top: 16px;
+ padding: 16px;
+ background: linear-gradient(135deg, #f8f9fa, #e9ecef);
+ border-radius: 8px;
+ border: 1px solid #dee2e6;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
+ }
+
+ .material-info-display h4 {
+ margin: 0 0 12px 0;
+ color: #495057;
+ font-size: 16px;
+ font-weight: 600;
+ text-align: center;
+ }
+
+ .material-detail {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ }
+
+ .detail-row {
+ display: flex;
+ align-items: center;
+ padding: 6px 0;
+ border-bottom: 1px solid #e9ecef;
+ }
+
+ .detail-row:last-child {
+ border-bottom: none;
+ }
+
+ .detail-label {
+ min-width: 80px;
+ font-weight: 600;
+ color: #6c757d;
+ font-size: 14px;
+ }
+
+ .detail-value {
+ flex: 1;
+ color: #212529;
+ font-size: 14px;
+ font-weight: 500;
+ word-break: break-all;
+ }
+
+ .detail-value.barcode-value {
+ font-family: 'Courier New', monospace;
+ font-weight: 600;
+ color: #2c3e50;
+ background-color: #f8f9fa;
+ padding: 4px 8px;
+ border-radius: 4px;
+ border: 1px solid #dee2e6;
+ font-size: 13px;
+ letter-spacing: 0.5px;
+ }
+
+ /* 鐮村潖瀹為獙寮圭獥鏍峰紡 */
+ .destruction-popup {
+ width: 90vw;
+ max-width: 500px;
+ min-height: 300px;
+ }
+
+ /* 鎵弿姝ラ鏍峰紡 */
+ .scan-step {
+ text-align: center;
+ padding: 40px 20px;
+ }
+
+ /* 宸叉湁璁板綍姝ラ鏍峰紡 */
+ .existing-record-step {
+ padding: 20px;
+ text-align: center;
+ }
+
+ .existing-icon {
+ font-size: 48px;
+ text-align: center;
+ margin-bottom: 16px;
+ }
+
+ .existing-title {
+ font-size: 18px;
+ font-weight: 600;
+ color: #2c3e50;
+ text-align: center;
+ margin-bottom: 12px;
+ }
+
+ .existing-description {
+ font-size: 14px;
+ color: #7f8c8d;
+ text-align: center;
+ margin-bottom: 20px;
+ }
+
+ /* 褰撳墠鐮村潖瀹為獙鏁伴噺鏄剧ず */
+ .current-phsy-display {
+ margin: 20px 0;
+ padding: 16px;
+ background: linear-gradient(135deg, #f8f9fa, #e9ecef);
+ border-radius: 8px;
+ border: 1px solid #dee2e6;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
+ }
+
+ .phsy-info {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ }
+
+ .phsy-label {
+ font-size: 16px;
+ font-weight: 600;
+ color: #495057;
+ }
+
+ .phsy-value {
+ font-size: 18px;
+ font-weight: 700;
+ color: #e74c3c;
+ background-color: #fff;
+ padding: 4px 12px;
+ border-radius: 4px;
+ border: 1px solid #e74c3c;
+ }
+
+ .scan-icon {
+ font-size: 64px;
+ margin-bottom: 20px;
+ opacity: 0.8;
+ }
+
+ .scan-title {
+ font-size: 20px;
+ font-weight: 600;
+ color: #2c3e50;
+ margin-bottom: 12px;
+ }
+
+ .scan-description {
+ font-size: 14px;
+ color: #7f8c8d;
+ margin-bottom: 30px;
+ line-height: 1.5;
+ }
+
+ /* 鎵弿姝ラ鎸夐挳甯冨眬 */
+ .scan-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ align-items: center;
+ }
+
+ /* 缁撴灉姝ラ鏍峰紡 */
+ .result-step {
+ padding: 20px;
+ }
+
+ .scan-success-icon {
+ font-size: 48px;
+ text-align: center;
+ margin-bottom: 16px;
+ }
+
+ .scan-success-title {
+ font-size: 18px;
+ font-weight: 600;
+ color: #27ae60;
+ text-align: center;
+ margin-bottom: 20px;
+ }
+
+ /* 鐮村潖瀹為獙鎿嶄綔鎸夐挳鏍峰紡 */
+ .destruction-actions {
+ display: flex;
+ gap: 8px;
+ margin-top: 24px;
+ justify-content: center;
+ flex-wrap: wrap;
+ }
+
+ .destruction-btn {
+ padding: 10px 16px;
+ border: none;
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ min-width: 80px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 1;
+ max-width: 120px;
+ }
+
+ .destruction-btn.confirm-btn {
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: white;
+ box-shadow: 0 2px 8px rgba(39, 174, 96, 0.3);
+ }
+
+ .destruction-btn.confirm-btn:hover:not(:disabled) {
+ background: linear-gradient(135deg, #229954, #27ae60);
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(39, 174, 96, 0.4);
+ }
+
+ .destruction-btn.confirm-btn:disabled {
+ background: #bdc3c7;
+ color: #7f8c8d;
+ cursor: not-allowed;
+ transform: none;
+ box-shadow: none;
+ }
+
+ .destruction-btn.cancel-btn {
+ background: linear-gradient(135deg, #95a5a6, #7f8c8d);
+ color: white;
+ box-shadow: 0 2px 8px rgba(149, 165, 166, 0.3);
+ }
+
+ .destruction-btn.cancel-btn:hover {
+ background: linear-gradient(135deg, #7f8c8d, #6c7b7d);
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(149, 165, 166, 0.4);
+ }
+
+ .destruction-btn.modify-btn {
+ background: linear-gradient(135deg, #f39c12, #e67e22);
+ color: white;
+ box-shadow: 0 2px 8px rgba(243, 156, 18, 0.3);
+ }
+
+ .destruction-btn.modify-btn:hover {
+ background: linear-gradient(135deg, #e67e22, #d35400);
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(243, 156, 18, 0.4);
+ }
+
+ .destruction-btn.delete-btn {
+ background: linear-gradient(135deg, #e74c3c, #c0392b);
+ color: white;
+ box-shadow: 0 2px 8px rgba(231, 76, 60, 0.3);
+ }
+
+ .destruction-btn.delete-btn:hover {
+ background: linear-gradient(135deg, #c0392b, #a93226);
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(231, 76, 60, 0.4);
+ }
+
+ /* 琛ㄥ崟杈撳叆妗嗘牱寮忎紭鍖� */
+ .form-input {
+ width: 100%;
+ padding: 12px 16px;
+ border: 2px solid #e9ecef;
+ border-radius: 8px;
+ font-size: 16px;
+ transition: border-color 0.3s ease;
+ box-sizing: border-box;
+ background-color: #fff !important;
+ color: #333 !important;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-user-select: text !important;
+ -moz-user-select: text !important;
+ -ms-user-select: text !important;
+ user-select: text !important;
+ pointer-events: auto !important;
+ opacity: 1 !important;
+ z-index: 1 !important;
+ }
+
+ .form-input:focus {
+ border-color: #3498db;
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);
+ background-color: #fff;
+ }
+
+ /* 绠�鍗曡緭鍏ユ鏍峰紡 - 鍙傝�僑J.vue */
+ .info-input {
+ flex: 1;
+ padding: 12px 16px;
+ border: 2px solid #ddd;
+ border-radius: 6px;
+ background-color: white;
+ font-size: 16px;
+ width: 100%;
+ box-sizing: border-box;
+ min-height: 44px;
+ line-height: 1.4;
+ }
+
+ .info-input:focus {
+ border-color: #3498db;
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);
+ }
+
+ /* 杈撳叆妗嗗寘瑁呭櫒 */
+ .input-wrapper {
+ position: relative;
+ width: 100%;
+ }
+
+ /* 鐮村潖瀹為獙杈撳叆妗嗙壒娈婃牱寮� */
+ .destruction-input {
+ background-color: #fff !important;
+ border: 2px solid #e9ecef !important;
+ color: #333 !important;
+ font-size: 16px !important;
+ padding: 12px 16px !important;
+ width: 100% !important;
+ box-sizing: border-box !important;
+ -webkit-user-select: text !important;
+ -moz-user-select: text !important;
+ -ms-user-select: text !important;
+ user-select: text !important;
+ -webkit-appearance: none !important;
+ -moz-appearance: none !important;
+ appearance: none !important;
+ pointer-events: auto !important;
+ opacity: 1 !important;
+ z-index: 1 !important;
+ }
+
+ .destruction-input:focus {
+ border-color: #3498db !important;
+ background-color: #fff !important;
+ outline: none !important;
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1) !important;
+ }
+
+ .destruction-input:disabled {
+ background-color: #f5f5f5 !important;
+ color: #999 !important;
+ cursor: not-allowed !important;
+ }
+
+ /* uni-easyinput 鏍峰紡 */
+ .destruction-input-uni {
+ width: 100% !important;
+ }
+
+ .destruction-input-uni .uni-easyinput__content {
+ border: 2px solid #e9ecef !important;
+ border-radius: 8px !important;
+ background-color: #fff !important;
+ }
+
+ .destruction-input-uni .uni-easyinput__content-input {
+ font-size: 16px !important;
+ color: #333 !important;
+ padding: 12px 16px !important;
+ }
+
+ /* 妯℃嫙杈撳叆妗嗘牱寮� */
+ .fake-input {
+ width: 100%;
+ padding: 12px 16px;
+ border: 2px solid #e9ecef;
+ border-radius: 8px;
+ background-color: #fff;
+ font-size: 16px;
+ color: #333;
+ cursor: pointer;
+ transition: border-color 0.3s ease;
+ box-sizing: border-box;
+ min-height: 44px;
+ display: flex;
+ align-items: center;
+ }
+
+ .fake-input:hover {
+ border-color: #3498db;
+ }
+
+ .fake-input.error {
+ border-color: #e74c3c;
+ }
+
+ .fake-input .placeholder {
+ color: #999;
+ }
+
+ /* 绠�鍖栫殑杈撳叆妗嗘牱寮� */
+ .simple-input {
+ width: 100%;
+ padding: 12px 16px;
+ border: 2px solid #e9ecef;
+ border-radius: 8px;
+ font-size: 16px;
+ color: #333;
+ background-color: #fff;
+ box-sizing: border-box;
+ outline: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+ -webkit-tap-highlight-color: transparent;
+ }
+
+ .simple-input:focus {
+ border-color: #3498db;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+ }
+
+ /* 閲嶆柊璁捐鐨勮緭鍏ュ尯鍩熸牱寮� */
+ .input-section {
+ margin: 20px 0;
+ padding: 20px;
+ background: #f8f9fa;
+ border-radius: 12px;
+ border: 1px solid #e9ecef;
+ }
+
+ .input-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #2c3e50;
+ margin-bottom: 12px;
+ text-align: center;
+ }
+
+ .input-container {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 8px;
+ }
+
+ .input-box {
+ width: 200px;
+ height: 50px;
+ border: 2px solid #3498db;
+ border-radius: 8px;
+ background-color: #fff;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+ }
+
+ .input-box:hover {
+ border-color: #2980b9;
+ box-shadow: 0 4px 8px rgba(0,0,0,0.15);
+ transform: translateY(-1px);
+ }
+
+ .input-box:active {
+ transform: translateY(0);
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+ }
+
+ .input-value {
+ font-size: 18px;
+ font-weight: 600;
+ color: #2c3e50;
+ }
+
+ .input-placeholder {
+ font-size: 16px;
+ color: #7f8c8d;
+ font-style: italic;
+ }
+
+ .error-tip {
+ text-align: center;
+ color: #e74c3c;
+ font-size: 14px;
+ margin-top: 8px;
+ }
+
+ .form-label {
+ display: block;
+ font-weight: 600;
+ color: #2c3e50;
+ margin-bottom: 8px;
+ font-size: 14px;
+ }
+
+ .form-group {
+ margin-bottom: 20px;
+ }
+
+ /* 閿欒淇℃伅鏍峰紡 */
+ .error-message {
+ color: #e74c3c;
+ font-size: 12px;
+ margin-top: 4px;
+ text-align: center;
+ }
+
+ /* 鍫电┐鐩稿叧鏍峰紡 */
+ .block-hole-btn {
+ background-color: #f39c12;
+ color: white;
+ padding: 6px 12px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 12px;
+ transition: all 0.3s ease;
+ }
+
+ .block-hole-btn:hover:not(.disabled) {
+ background-color: #e67e22;
+ transform: translateY(-1px);
+ }
+
+ .block-hole-btn.disabled {
+ background-color: #bdc3c7;
+ color: #7f8c8d;
+ cursor: not-allowed;
+ }
+
+ .blocked-info {
+ color: #e74c3c;
+ font-size: 12px;
+ margin-left: 8px;
+ font-weight: bold;
+ }
+
+ .block-hole-popup,
+ .global-block-hole-popup {
+ width: 80vw;
+ max-width: 500px;
+ min-height: 300px;
+ }
+
+ .block-hole-content {
+ padding: 20px;
+ }
+
+ .hole-info {
+ margin-bottom: 20px;
+ padding: 15px;
+ background-color: #f8f9fa;
+ border-radius: 8px;
+ border: 1px solid #e9ecef;
+ }
+
+ .hole-info .info-label {
+ font-weight: 600;
+ color: #495057;
+ margin-bottom: 8px;
+ display: block;
+ }
+
+ .input-section {
+ margin-bottom: 20px;
+ }
+
+ .input-label {
+ font-weight: 600;
+ color: #495057;
+ margin-bottom: 8px;
+ display: block;
+ }
+
+ .block-hole-input {
+ width: 100%;
+ padding: 12px 16px;
+ border: 2px solid #e9ecef;
+ border-radius: 8px;
+ font-size: 16px;
+ transition: border-color 0.3s ease;
+ box-sizing: border-box;
+ background-color: #fff !important;
+ color: #333 !important;
+ -webkit-user-select: text !important;
+ -moz-user-select: text !important;
+ -ms-user-select: text !important;
+ user-select: text !important;
+ pointer-events: auto !important;
+ opacity: 1 !important;
+ /* 绉婚櫎z-index锛岄伩鍏嶉伄鎸″脊绐� */
+ }
+
+ .block-hole-input:focus {
+ border-color: #3498db;
+ outline: none;
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.1);
+ }
+
+ .block-hole-actions {
+ display: flex;
+ gap: 12px;
+ justify-content: center;
+ margin-top: 20px;
+ }
+
+ .block-hole-btn.confirm {
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: white;
+ padding: 12px 24px;
+ min-width: 100px;
+ }
+
+ .block-hole-btn.confirm:hover:not(:disabled) {
+ background: linear-gradient(135deg, #229954, #27ae60);
+ }
+
+ .block-hole-btn.confirm:disabled {
+ background: #bdc3c7;
+ color: #7f8c8d;
+ cursor: not-allowed;
+ }
+
+ .block-hole-btn.cancel {
+ background: linear-gradient(135deg, #95a5a6, #7f8c8d);
+ color: white;
+ padding: 12px 24px;
+ min-width: 100px;
+ }
+
+ .block-hole-btn.cancel:hover {
+ background: linear-gradient(135deg, #7f8c8d, #6c7b7d);
+ }
+
+
+ .blocked-holes-info {
+ color: #e74c3c;
+ font-weight: bold;
+ margin-left: 8px;
+ }
</style>
\ No newline at end of file
--
Gitblit v1.9.3