From 7c803e1ce6c6d9765a99203544bf200ecd52aa2d Mon Sep 17 00:00:00 2001 From: cnf <3200815559@qq.com> Date: 星期三, 17 九月 2025 14:04:40 +0800 Subject: [PATCH] 首检巡检入库检修改,增加bom物料plm图纸查看 --- pages/QC/XJ/Add.vue | 3099 +++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 2,350 insertions(+), 749 deletions(-) diff --git a/pages/QC/XJ/Add.vue b/pages/QC/XJ/Add.vue index 0bfe3bf..c675b58 100644 --- a/pages/QC/XJ/Add.vue +++ b/pages/QC/XJ/Add.vue @@ -1,354 +1,832 @@ <template> - <view class="container"> - <!-- 澶撮儴 --> - <view class="header"> - <view class="title">宸℃椤圭洰鏄庣粏</view> - <view class="order-number">宸℃鍗曞彿: {{formData.releaseNo}}</view> - </view> - - <!-- 鍩烘湰淇℃伅 --> - <view class="section"> - <view class="section-header">鍩烘湰淇℃伅</view> - <view class="section-body"> - <view class="info-grid"> - <view class="info-item"> - <view class="info-label">妫�楠屽崟鍙�</view> - <view class="info-value">{{ formData.releaseNo }}</view> - </view> - <view class="info-item"> - <view class="info-label">鍒涘缓浜�</view> - <view class="info-value">{{ formData.createBy }}</view> - </view> - <view class="info-item"> - <view class="info-label">鍒涘缓鏃堕棿</view> - <view class="info-value">{{ formData.createDate }}</view> - </view> - <view class="info-item"> - <view class="info-label">绾夸綋缂栧彿</view> - <picker v-if="isUpdate" class="picker-input" name="selector" :range="DAA020List" - @change="onDaa020Change"> - <view class="picker-value">{{ DAA020List[DAA020Index] || '璇烽�夋嫨' }}</view> - </picker> - <view v-else class="info-value">{{ formData.daa020 }}</view> - </view> - <view class="info-item"> - <view class="info-label">鐗╂枡缂栫爜</view> - <picker v-if="isUpdate" class="picker-input" name="selector" :range="ItemList" - @change="onItemChange"> - <view class="picker-value">{{ ItemList[ItemIndex] || '璇烽�夋嫨' }}</view> - </picker> - <view v-else class="info-value">{{ formData.itemNo }}</view> - </view> - <view class="info-item"> - <view class="info-label">璁″垝缂栧彿</view> - <picker v-if="isUpdate" class="picker-input" name="selector" :range="DAA001List" - @change="onDaa001Change"> - <view class="picker-value">{{ DAA001List[DAA001Index] || '璇烽�夋嫨' }}</view> - </picker> - <view v-else class="info-value">{{ formData.billNo }}</view> - </view> - <view class="info-item"> - <view class="info-label">鐗╂枡鍚嶇О</view> - <view class="info-value">{{ formData.itemName }}</view> - </view> - <view class="info-item"> - <view class="info-label">瑙勬牸鍨嬪彿</view> - <view class="info-value">{{ formData.itemModel }}</view> - </view> - <view class="info-item"> - <view class="info-label">宸ュ崟鏁伴噺</view> - <view class="info-value highlight">{{ formData.planQty }}</view> - </view> - <view class="info-item" v-if="formData.remarks"> - <view class="info-label">涓嶅悎鏍兼弿杩�</view> - <view class="info-value danger">{{ formData.remarks }}</view> + <view class="container"> + <!-- 澶撮儴 --> + <view class="header"> + <view class="title">宸℃椤圭洰鏄庣粏</view> + <view class="order-number">宸℃鍗曞彿: {{formData.releaseNo}}</view> + </view> + + <!-- 鍩烘湰淇℃伅 --> + <view class="section"> + <view class="section-header">鍩烘湰淇℃伅</view> + <view class="section-body"> + <view class="info-grid"> + <view class="info-item"> + <view class="info-label">妫�楠屽崟鍙�</view> + <view class="info-value">{{ formData.releaseNo }}</view> + </view> + <view class="info-item"> + <view class="info-label">鍒涘缓浜�</view> + <view class="info-value">{{ formData.createBy }}</view> + </view> + <view class="info-item"> + <view class="info-label">鍒涘缓鏃堕棿</view> + <view class="info-value">{{ formData.createDate }}</view> + </view> + <view class="info-item"> + <view class="info-label">鐢熶骇杞﹂棿</view> + <picker v-if="isUpdate" class="picker-input" name="selector" :range="departmentList" range-key="departmentname" + @change="onDepartmentChange"> + <view class="picker-value">{{ getSelectedDepartmentName() || '璇烽�夋嫨杞﹂棿' }}</view> + </picker> + <view v-else class="info-value">{{ WORKSHOP }}</view> + </view> + <view class="info-item"> + <view class="info-label">绾夸綋缂栧彿</view> + <picker v-if="isUpdate" class="picker-input" name="selector" :range="filteredDAA020List" + @change="onDaa020Change"> + <view class="picker-value">{{ filteredDAA020List[DAA020Index] || '璇烽�夋嫨' }}</view> + </picker> + <view v-else class="info-value">{{ formData.daa020 }}</view> + </view> + <view class="info-item"> + <view class="info-label">宸ュ崟鍗曞彿</view> + <picker v-if="isUpdate" class="picker-input" name="selector" :range="DAA001List" + @change="onDaa001Change"> + <view class="picker-value">{{ DAA001List[DAA001Index] || '璇烽�夋嫨' }}</view> + </picker> + <view v-else class="info-value">{{ formData.billNo }}</view> + </view> + <view class="info-item"> + <view class="info-label">鐗╂枡缂栫爜</view> + <view class="info-value">{{ formData.itemNo }}</view> + </view> + <view class="info-item"> + <view class="info-label">鐗╂枡鍚嶇О</view> + <view class="info-value">{{ formData.itemName }}</view> + </view> + <view class="info-item"> + <view class="info-label">瑙勬牸鍨嬪彿</view> + <view class="info-value">{{ formData.itemModel }}</view> + </view> + <view class="info-item"> + <view class="info-label">宸ュ崟鏁伴噺</view> + <view class="info-value highlight">{{ formData.planQty }}</view> + </view> + <view class="info-item" v-if="formData.remarks"> + <view class="info-label">涓嶅悎鏍兼弿杩�</view> + <view class="info-value danger">{{ formData.remarks }}</view> + </view> </view> </view> </view> - </view> - - <!-- 妫�楠岄」鐩� --> - <view class="section" v-if="tableData.length > 0"> - <view class="section-header">妫�楠岄」鐩�</view> - <view class="section-body"> - <view class="inspection-table"> - <table> - <thead> - <tr> - <th width="20%" style="text-align: center;">妫�楠岄」鐩�</th> - <th width="50%" style="text-align: center;">妫�楠屾弿杩�</th> - <th width="15%" style="text-align: center;">璁板綍(鐐瑰嚮)</th> - </tr> - </thead> - <tbody> - <tr v-for="(item, index) in tableData" :key="index"> - <td>{{ item.projName }}</td> - <td> - <view v-if="item.result=='鍚堟牸'" class="watermark approved"> - {{ getStatusText(item.result) }} - </view> - <view v-if="item.result=='涓嶅悎鏍�'" class="watermark rejected"> - {{ getStatusText(item.result) }} - </view> - <view v-if="item.result==null || item.result=='鏈畬鎴�'" class="watermark pending"> - {{ getStatusText(item.result) }} - </view> - <view class="description-text">{{ item.projName }}</view> - </td> - <td> - <button v-if="item.isCheck >= item.levelNum" class="record-btn" @click="toDetail(item)">鏌ョ湅</button> - <button v-else class="record-btn" @click="toDetail(item)">濉啓</button> - </td> - </tr> - </tbody> - </table> - </view> - </view> - </view> - - <!-- 鎿嶄綔鎸夐挳 --> - <view class="action-buttons"> - <button class="action-btn primary" v-if="isUpdate && !isShowTable" @click="getItem">鍒涘缓妫�楠屽崟骞剁敓鎴愰儴鍒嗛粯璁ゅ��</button> - <button class="action-btn secondary" v-if="!isUpdate && !isShowTable" @click="toImage">涓婁紶/鏌ョ湅鍥剧墖</button> - <button class="action-btn danger" v-if="!isUpdate && !formData.fcheckResu && !isShowTable" @click="removeXJ">鍒犻櫎鍗曟嵁</button> - <button class="action-btn warning" v-if="!isUpdate && !isShowTable" @click="saveRemarks">娣诲姞涓嶅悎鏍兼弿杩�</button> - <button class="action-btn primary" v-if="isShowTable" @click="getTable">鑾峰彇妫�楠岄」鐩�</button> - <button class="action-btn primary" v-if="isShowTable && isUpdate" @click="saveTable">鐢熸垚妫�楠岄」鐩�</button> - </view> - <!-- 淇敼涓嶅悎鏍兼弿杩板脊鍑烘 --> - <view v-if="remarksPopup" class="overlay"> - <view class="popup"> - <view class="popup-header"> - <h3>淇敼涓嶅悎鏍兼弿杩�</h3> - </view> - <view class="popup-content"> - <view class="input-group"> - <view class="input-label">涓嶅悎鏍兼弿杩帮細</view> - <input class="input-field" type="text" v-model="remarks" placeholder="璇疯緭鍏ヤ笉鍚堟牸鎻忚堪"/> + + <!-- 妫�楠岄」鐩� --> + <view class="section" v-if="tableData.length > 0"> + <view class="section-header">妫�楠岄」鐩�</view> + <view class="section-body"> + <view class="inspection-table"> + <table> + <thead> + <tr> + <th width="20%" style="text-align: center;">妫�楠岄」鐩�</th> + <th width="50%" style="text-align: center;">妫�楠屾弿杩�</th> + <th width="15%" style="text-align: center;">璁板綍(鐐瑰嚮)</th> + </tr> + </thead> + <tbody> + <tr v-for="(item, index) in tableData" :key="index"> + <td>{{ item.projName }}</td> + <td> + <view v-if="item.result=='鍚堟牸'" class="watermark approved"> + {{ getStatusText(item.result) }} + </view> + <view v-if="item.result=='涓嶅悎鏍�'" class="watermark rejected"> + {{ getStatusText(item.result) }} + </view> + <view v-if="item.result==null || item.result=='鏈畬鎴�'" class="watermark pending"> + {{ getStatusText(item.result) }} + </view> + <view class="description-text">{{ item.projName }}</view> + </td> + <td> + <button v-if="item.isCheck >= item.levelNum" class="record-btn" @click="toDetail(item)">鏌ョ湅</button> + <button v-else class="record-btn" @click="toDetail(item)">濉啓</button> + </td> + </tr> + </tbody> + </table> </view> </view> - <view class="popup-actions"> - <button class="action-btn primary" @click="editRemarks">淇敼</button> - <button class="action-btn secondary" @click="remarksPopup = !remarksPopup">鍙栨秷</button> + </view> + + <!-- 鎿嶄綔鎸夐挳 --> + <view class="action-buttons"> + <!-- 鏂板缓鍗曟嵁鏃剁殑鍒涘缓鎸夐挳 --> + <button class="action-btn primary" v-if="isUpdate && !isShowTable" @click="save"> + 鍒涘缓妫�楠屽崟骞剁敓鎴愰儴鍒嗛粯璁ゅ�� + </button> + + <!-- 宸叉湁鍗曟嵁鐨勬搷浣滄寜閽� --> + <button class="action-btn secondary" v-if="!isUpdate && !isShowTable" @click="toImage">涓婁紶/鏌ョ湅鍥剧墖</button> + <button class="action-btn secondary" v-if="!isUpdate && !isShowTable" @click="fetchDrawingNumber(formData.itemNo)"> + 璋冨彇PLM鍥剧焊 + </button> + <button class="action-btn secondary" v-if="!isUpdate && !isShowTable" @click="getBom"> + Bom鐢ㄦ枡娓呭崟 + </button> + <button class="action-btn secondary" v-if="!isUpdate && !isShowTable" @click="viewAttachmentInfo">鏌ョ湅闄勪欢淇℃伅</button> + + <button class="action-btn danger" v-if="!isUpdate && !formData.fcheckResu && !isShowTable && formData.fsubmit !== 1" @click="removeXJ">鍒犻櫎鍗曟嵁</button> + <button class="action-btn warning" v-if="!isUpdate && !isShowTable && formData.fsubmit !== 1" @click="saveRemarks">娣诲姞涓嶅悎鏍兼弿杩�</button> + + <!-- 妫�楠岄」鐩鐞嗘寜閽� --> + <button class="action-btn primary" v-if="isShowTable" @click="getTable">鑾峰彇妫�楠岄」鐩�</button> + <button class="action-btn primary" v-if="isShowTable && isUpdate" @click="saveTable">鐢熸垚妫�楠岄」鐩�</button> + <button class="action-btn success" v-if="!isUpdate && !isShowTable && formData.fsubmit !== 1" @click="getGenUpdate">鑾峰彇妫�楠岄」鐩�</button> + <button class="action-btn success" v-if="!isUpdate && !isShowTable && formData.fsubmit !== 1" @click="submitInspection">鎻愪氦妫�楠�</button> + </view> + <!-- 淇敼涓嶅悎鏍兼弿杩板脊鍑烘 --> + <view v-if="remarksPopup" class="overlay"> + <view class="popup"> + <view class="popup-header"> + <h3>淇敼涓嶅悎鏍兼弿杩�</h3> + </view> + <view class="popup-content"> + <view class="input-group"> + <view class="input-label">涓嶅悎鏍兼弿杩帮細</view> + <input class="input-field" type="text" v-model="remarks" placeholder="璇疯緭鍏ヤ笉鍚堟牸鎻忚堪"/> + </view> + </view> + <view class="popup-actions"> + <button class="action-btn primary" @click="editRemarks">淇敼</button> + <button class="action-btn secondary" @click="remarksPopup = !remarksPopup">鍙栨秷</button> + </view> </view> </view> + + <!-- 闄勪欢鍒楄〃寮圭獥 --> + <view v-if="showAttachmentPopup" class="overlay"> + <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> + </div> + </view> + </view> + + <!-- 闄勪欢璇︽儏寮圭獥 --> + <view v-if="showAttachmentDetail" class="overlay"> + <view class="popup attachment-detail-popup"> + <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> + </view> + </view> + + + <view class="barcode"> + <u-modal :show="itemShow" title="鐗╂枡鏄庣粏" @confirm="drawingConfirm" @cancel="itemCancel" + 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" > + <div >{{item.itemName}}</div> + </uni-td> + <uni-td align="center" > + <div>{{item.itemModel}}</div> + </uni-td> + <uni-td align="center" class="click-wd"> + <div @click="fetchDrawingNumber(item.itemNo)">璋冨彇鍥剧焊</div> + </uni-td> + </uni-tr> + </uni-table> + </u-modal> + </view> + + <view class="barcode"> + <u-modal :show="drawingShow" 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">鏈夋棤鍏宠仈PDF鏂囦欢</uni-th> + <uni-th align="center" width="90">鑳藉惁鎵撳紑鏂囦欢</uni-th> + <uni-th align="center" width="150">鎿嶄綔锛堢偣鍑伙級</uni-th> + </uni-tr> + <uni-tr v-for="(item,index) in (drawing || [])" style="height: 100px;"> + <uni-td align="center">{{item.fName}}</uni-td> + <uni-td align="center" style="font-size:25px;"> + <div v-if="item.fRelevantObject==' '" style="color: #E47470;">脳</div> + <div style="color: #90BA87;" v-else>鈭�</div> + </uni-td> + <uni-td align="center" style="font-size:25px;"> + <div v-if="item.isSupported || item.fRelevantObject!=' '" style="color: #90BA87;">鈭�</div> + <div style="color: #E47470;" v-else>脳</div> + </uni-td> + <uni-td align="center" class="click-wd"> + <div @click="openDrawings(item)">鎵撳紑鏂囨。</div> + </uni-td> + </uni-tr> + </uni-table> + </u-modal> + </view> + + <!-- 鏂囦欢棰勮寮圭獥 --> + <view v-if="showFilePreviewPopup" class="overlay"> + <view class="popup file-preview-popup"> + <h3 class="file-preview-title">{{ previewTitle }}</h3> + <div class="file-preview-divider"></div> + <div class="file-preview-content"> + <!-- 鏂囨湰鍐呭棰勮 --> + <pre v-if="previewType === 'text'">{{ previewContent }}</pre> + + <!-- 鍥剧墖鍐呭棰勮 --> + <view v-else-if="previewType === 'image'" class="image-preview-container"> + <image + :src="previewContent" + mode="aspectFit" + class="preview-image-clickable" + @click="previewImageInPopup" + style="width: 100%; max-height: 400px; cursor: pointer;" + /> + <div class="image-zoom-hint">鐐瑰嚮鍥剧墖鍙斁澶ф煡鐪�</div> + </view> + + <!-- Excel 绛� Office 鏂囦欢鎻愮ず --> + <view v-else-if="previewType === 'excel'" class="unsupported-preview"> + <view class="unsupported-icon">馃搳</view> + <view class="unsupported-text">Excel 鏂囦欢鏆備笉鏀寔鍦ㄧ嚎棰勮</view> + <view class="unsupported-hint">璇风偣鍑讳笅杞芥寜閽幏鍙栧畬鏁存枃浠�</view> + </view> + + <!-- 涓嶆敮鎸佺殑鏂囦欢绫诲瀷 --> + <view v-else class="unsupported-preview"> + <view class="unsupported-icon">馃搫</view> + <view class="unsupported-text">姝ゆ枃浠舵牸寮忔殏涓嶆敮鎸侀瑙�</view> + <view class="unsupported-hint">璇风偣鍑讳笅杞芥寜閽幏鍙栧畬鏁存枃浠�</view> + </view> + </div> + <div class="file-preview-actions"> + <button v-if="previewType !== 'text'" class="file-preview-btn download-btn" @click="downloadPreviewFile">馃摜 涓嬭浇鏂囦欢</button> + <button class="file-preview-btn close-btn" @click="closeFilePreview">鍏抽棴</button> + </div> + </view> + </view> + + </view> + </template> + + <script> + export default { + data() { + return { + formData: { + id: "", + releaseNo: "", + createBy: "", + createDate: "", + daa020: "", + daa002: "", // 娣诲姞浜у搧ID瀛楁 + itemNo: "", + itemName: "", // 娣诲姞鐗╂枡鍚嶇О + itemModel: "", // 娣诲姞瑙勬牸鍨嬪彿 + billNo: "", + catQty: "", + detailMem: "", + taskNo: "", + fcheckResu: "", + fsubmit: 0, // 娣诲姞鎻愪氦鐘舵�佸瓧娈� + boardModel: "", + planQty: "", + mocode: "", + boardStyle: "" + }, + + DAA020List: [], + DAA020Index: -1, + filteredDAA020List: [], + + DAA001List: [], + DAA001Index: -1, + schemeResult: [], - </view> -</template> + isShowTable: false, -<script> -export default { - data() { - return { - formData: { - id: "", - releaseNo: "", - createBy: "", - createDate: "", - daa020: "", - itemNo: "", - billNo: "", - catQty: "", - detailMem: "", - taskNo: "", - fcheckResu: "", - boardModel: "", - planQty: "", - mocode: "", - boardStyle: "" - }, + lineList: [], + + lineNo: "", + + tableData: [], + drawing: [], + + isSubmit: true, + + isUpdate: true, + + isShowTable: false, + + drawingShow: false, + itemShow: false, + + remarks: "", + remarksPopup: false, + + // 閮ㄩ棬閫夋嫨鐩稿叧 + departmentList: [], + selectedDepartment: '', + WORKSHOP: '', + + // 闄勪欢鐩稿叧鏁版嵁 + showAttachmentPopup: false, + showAttachmentDetail: false, + showFilePreviewPopup: false, + attachments: [], + attachmentsLoading: false, + selectedAttachment: null, + previewTitle: '', + previewContent: '', + previewType: '', + previewFileUrl: '' - DAA020List: [], - DAA020Index: -1, - - DAA001List: [], - DAA001Index: -1, - schemeResult: [], - - isShowTable: false, - - ItemList: [], - ItemIndex: -1, - boardItems: [], - - lineList: [], - - lineNo: "", - - tableData: [], - - isSubmit: true, - - isUpdate: true, - - remarks: "", - remarksPopup: false, - }; - }, - onLoad(options) { - //options涓寘鍚簡url闄勫甫鐨勫弬鏁� - - let params = options; - - if (params["id"]) { - this.isUpdate = false; - this.formData.id = params["id"]; - this.formData.releaseNo = params["releaseNo"]; - //getQaItemXj02 - this.init(); - } else { - //鍒濆鍖栨楠屽崟鍙� - this.$post({ - url: "/XJ/getMaxReleaseNo" - }).then(res => { - this.formData.releaseNo = res.data.tbBillList; - this.formData.createBy = this.$loginInfo.account; - this.formData.createDate = this.$getDate("yyyy-mm-dd"); - }); - - //杞﹂棿涓嬫媺妗嗙殑鍒濆鍖� - this.$post({ - url: "/XJ/getLineAll" - }).then(res => { - this.lineList = res.data.tbBillList; - this.DAA020List = res.data.tbBillList.map(item => item.lineName); - }) - } - }, - methods: { - getStatusClass(result) { - if (result === '鍚堟牸') return 'status-pass'; - if (result === '涓嶅悎鏍�') return 'status-fail'; - return 'status-pending'; + }; }, - - getStatusText(status) { - const statusMap = { - approved: '鍚堟牸', - rejected: '涓嶅悎鏍�', - pending: '寰呯‘璁�' - } - if (status == null || status == '鏈畬鎴�') { - return statusMap['pending'] || '寰呯‘璁�'; - } else if (status == '鍚堟牸') { - return statusMap['approved'] || '鍚堟牸'; + onLoad(options) { + //options涓寘鍚簡url闄勫甫鐨勫弬鏁� + + let params = options; + + if (params["id"]) { + this.isUpdate = false; + this.formData.id = params["id"]; + this.formData.releaseNo = params["releaseNo"]; + //getQaItemXj02 + this.init(); + + // 濡傛灉鏄粠鍒楄〃椤甸潰鐐瑰嚮鏌ョ湅闄勪欢鎸夐挳璺宠浆杩囨潵鐨勶紝鑷姩鎵撳紑闄勪欢寮圭獥 + if (params["showAttachments"] === "true") { + this.$nextTick(() => { + this.viewAttachmentInfo(); + }); + } } else { - return statusMap['rejected'] || '涓嶅悎鏍�'; + //鍒濆鍖栨楠屽崟鍙� + this.$post({ + url: "/XJ/getMaxReleaseNo" + }).then(res => { + this.formData.releaseNo = res.data.tbBillList; + this.formData.createBy = this.$loginInfo.account; + this.formData.createDate = this.$getDate("yyyy-mm-dd"); + }); + + //杞﹂棿涓嬫媺妗嗙殑鍒濆鍖� + this.$post({ + url: "/XJ/getLineAll" + }).then(res => { + this.lineList = res.data.tbBillList; + this.DAA020List = res.data.tbBillList.map(item => item.lineName); + this.filteredDAA020List = this.DAA020List; // 鍒濆鏃舵樉绀烘墍鏈夌嚎浣� + }) + + // 鑾峰彇閮ㄩ棬鍒楄〃 + this.loadDepartments(); } }, - - removeXJ() { - if (this.formData.id) { + methods: { + getStatusClass(result) { + if (result === '鍚堟牸') return 'status-pass'; + if (result === '涓嶅悎鏍�') return 'status-fail'; + return 'status-pending'; + }, + + getStatusText(status) { + const statusMap = { + approved: '鍚堟牸', + rejected: '涓嶅悎鏍�', + pending: '寰呯‘璁�' + } + if (status == null || status == '鏈畬鎴�') { + return statusMap['pending'] || '寰呯‘璁�'; + } else if (status == '鍚堟牸') { + return statusMap['approved'] || '鍚堟牸'; + } else { + return statusMap['rejected'] || '涓嶅悎鏍�'; + } + }, + + removeXJ() { + if (this.formData.id) { + this.$post({ + url: "/XJ/removeXJ", + data: { + id: this.formData.id + } + }).then(res => { + if (res.data.tbBillList > 0) { + this.$showMessage("鍒犻櫎鎴愬姛"); + //鍏抽棴褰撳墠椤甸潰锛岃繑鍥炰笂涓�椤甸潰鎴栧绾ч〉闈� + uni.navigateBack(); + } else { + this.$showMessage("鍒犻櫎澶辫触"); + } + }); + } else { + this.$showMessage("璇峰厛閫夋嫨妫�楠屽崟鍙�"); + } + }, + save() { + // 楠岃瘉蹇呭~瀛楁 - 鍊熼壌SJ鐨勯獙璇侀�昏緫锛屼絾淇濇寔XJ鐨勫瓧娈甸獙璇� + if (!this.formData.billNo) { + this.$showMessage("璇烽�夋嫨宸ュ崟鍗曞彿"); + return; + } + + if (!this.formData.itemNo) { + this.$showMessage("鐗╂枡淇℃伅鑾峰彇澶辫触锛岃閲嶆柊閫夋嫨宸ュ崟"); + return; + } + + if (!this.tableData || this.tableData.length === 0) { + this.$showMessage("姝ょ墿鏂欐病鏈夊惎鐢ㄧ殑妫�楠岄」鐩紝璇风淮鎶�!"); + return; + } + + const saveData = { + ReleaseNo: this.formData.releaseNo, + ItemNo: this.formData.itemNo, + BillNo: this.formData.billNo, + DepartmentId: this.selectedDepartment, // 鍙娇鐢ㄩ儴闂↖D + WorkShop: null, // 鏄庣‘璁剧疆涓簄ull锛岄伩鍏嶆暟鎹簱瀛楁閿欒 + ItemId: this.formData.daa002, // 浣跨敤宸ュ崟涓殑浜у搧ID + PlanQty: this.formData.planQty, + CreateBy: this.formData.createBy, + CreateDate: this.formData.createDate, + FcheckDate: new Date(), + Remarks: this.formData.remarks || "" + }; + + // 璋冭瘯淇℃伅 + console.log("鍒涘缓妫�楠屽崟鏁版嵁:", { + formData: this.formData, + selectedDepartment: this.selectedDepartment, + WORKSHOP: this.WORKSHOP, + saveData: saveData, + tableData: this.tableData + }); + + this.$post({ + url: "/XJ/save", + data: { + from: saveData, + userNo: this.$loginInfo.account, + items: this.tableData + } + }).then(res => { + if (res.data.tbBillList) { + this.formData.id = res.data.tbBillList; + + // 濡傛灉杩斿洖浜嗗畬鏁寸殑妫�楠岄」鐩俊鎭紝鏇存柊tableData + if (res.data.xjDto && res.data.xjDto.items) { + this.tableData = res.data.xjDto.items; + } + + this.$showMessage("鍒涘缓妫�楠屽崟骞剁敓鎴愰粯璁ゅ�兼垚鍔�"); + this.isUpdate = false; + + // 鏇存柊formData鐨勫叾浠栧瓧娈� + this.formData = { ...this.formData, ...saveData }; + } else { + this.$showMessage("鍒涘缓妫�楠屽崟澶辫触锛岃妫�鏌ユ暟鎹�"); + } + }).catch(err => { + console.error("鍒涘缓妫�楠屽崟閿欒:", err); + this.$showMessage("鍒涘缓妫�楠屽崟澶辫触锛�" + (err.message || "鏈煡閿欒")); + }); + }, + + // 鍔犺浇閮ㄩ棬鍒楄〃 + loadDepartments() { this.$post({ - url: "/XJ/removeXJ", - data: { - id: this.formData.id - } + url: "/XJ/getDepartmentsWithLines" }).then(res => { - if (res.data.tbBillList > 0) { - this.$showMessage("鍒犻櫎鎴愬姛"); - //鍏抽棴褰撳墠椤甸潰锛岃繑鍥炰笂涓�椤甸潰鎴栧绾ч〉闈� - uni.navigateBack(); + if (res.status === 0) { + this.departmentList = res.data.tbBillList; } else { - this.$showMessage("鍒犻櫎澶辫触"); + this.$showMessage("鑾峰彇閮ㄩ棬鍒楄〃澶辫触"); } }); - } else { - this.$showMessage("璇峰厛閫夋嫨妫�楠屽崟鍙�"); - } - }, - getItem() { - - if (this.isSubmit) { - this.$showMessage("姝ょ墿鏂欐棤鍚敤鐨勬楠岄」鐩紝璇风淮鎶�!"); - return; - } - - if (!this.formData.billNo) { - this.$showMessage("璇烽�夋嫨璁″垝缂栧彿"); - return; - } - - this.$post({ - url: "/XJ/save", - data: { - from: this.formData, - userNo: this.$loginInfo.account, - items: this.tableData + }, + + // 閮ㄩ棬閫夋嫨鍙樺寲澶勭悊 + onDepartmentChange(e) { + const index = e.detail.value; + if (index >= 0 && index < this.departmentList.length) { + const selectedDept = this.departmentList[index]; + this.selectedDepartment = selectedDept.departmentid; + this.WORKSHOP = selectedDept.departmentname; + + // 鏍规嵁閫変腑鐨勯儴闂ㄨ繃婊ょ嚎浣撳垪琛� + this.filterLinesByDepartment(selectedDept.departmentid); + + // 淇濆瓨閮ㄩ棬閫夋嫨 + this.saveDepartmentSelection(); } - }).then(res => { - this.formData.id = res.data.tbBillList; - this.$showMessage("鐢熸垚妫�楠岄」鐩垚鍔�"); - this.init(); - this.isUpdate = false; - }); - }, - //鐢熶骇绾垮埆閫夋嫨骞跺垵濮嬭瘽宸ュ崟鍙� - onDaa020Change(event) { - //鑾峰彇鐢熶骇绾垮埆鐨勪笅鏍囧湴鍧� - this.DAA020Index = event.mp.detail.value; - - this.lineNo = this.lineList[this.DAA020Index].lineNo; - - this.$post({ - url: "/XJ/getBoardItem", - data: { - lineNo: this.lineNo + }, + + // 鑾峰彇閫変腑鐨勯儴闂ㄥ悕绉� + getSelectedDepartmentName() { + if (!this.selectedDepartment) return ''; + const dept = this.departmentList.find(item => item.departmentid === this.selectedDepartment); + return dept ? dept.departmentname : ''; + }, + + // 淇濆瓨閮ㄩ棬閫夋嫨 + saveDepartmentSelection() { + if (this.formData.id && this.selectedDepartment) { + this.$post({ + url: "/XJ/saveDepartmentSelection", + data: { + id: this.formData.id, + departmentId: this.selectedDepartment, + departmentName: this.WORKSHOP + } + }).then(res => { + if (res.status === 0) { + this.$showMessage("閮ㄩ棬閫夋嫨宸蹭繚瀛�"); + } + }); } - }).then(res => { - //濉厖宸ュ崟鍙风殑鏁版嵁婧� - this.boardItems = res.data.tbBillList; - this.ItemList = this.boardItems.map(item => item.itemName); - //鍙樹负榛樿绌哄�肩殑鐘舵�� - this.ItemIndex = -1; - }) + }, + + // 鏍规嵁閮ㄩ棬杩囨护绾夸綋鍒楄〃 + filterLinesByDepartment(departmentId) { + this.$post({ + url: "/XJ/getLinesByDepartment", + data: { + departmentId: departmentId + } + }).then(res => { + if (res.status === 0) { + this.filteredDAA020List = res.data.tbBillList.map(item => item.lineName); + this.lineList = res.data.tbBillList; + // 閲嶇疆绾夸綋閫夋嫨绱㈠紩 + this.DAA020Index = -1; + this.formData.daa020 = ''; + } else { + this.$showMessage("鑾峰彇绾夸綋鍒楄〃澶辫触"); + } + }); + }, + + //鐢熶骇绾垮埆閫夋嫨骞跺垵濮嬪寲宸ュ崟鍙� + onDaa020Change(event) { + //鑾峰彇鐢熶骇绾垮埆鐨勪笅鏍囧湴鍧� + this.DAA020Index = event.mp.detail.value; - }, - onItemChange(event) { - this.ItemIndex = event.mp.detail.value; - this.formData.itemNo = this.boardItems[this.ItemIndex].itemNo;//涓昏鏄敼杩欓噷 - this.formData.itemId = this.boardItems[this.ItemIndex].id;//涓昏鏄敼杩欓噷 - this.formData.itemName = this.boardItems[this.ItemIndex].itemName;//涓昏鏄敼杩欓噷 - this.formData.itemModel = this.boardItems[this.ItemIndex].itemModel;//涓昏鏄敼杩欓噷 - this.$post({ - url: "/XJ/getDaa001", - data: { - daa020: this.lineNo, - item: this.formData.itemNo - } - }).then(res => { - //濉厖宸ュ崟鍙风殑鏁版嵁婧� - this.schemeResult = res.data.tbBillList; - this.DAA001List = this.schemeResult.map(s => s.daa001); - //鍙樹负榛樿绌哄�肩殑鐘舵�� - this.DAA001Index = -1; + this.lineNo = this.lineList[this.DAA020Index].lineNo; + // 璁剧疆绾夸綋缂栧彿鍒癴ormData + this.formData.daa020 = this.lineList[this.DAA020Index].lineName; - this.formData.billNo = ""; - }) - }, - //閫夊彇宸ュ崟濉厖鐗╂枡鍙峰拰鍏朵粬淇℃伅 - onDaa001Change(event) { - this.DAA001Index = event.mp.detail.value; - this.formData.billNo = this.schemeResult[this.DAA001Index].daa001; - this.formData.planQty = this.schemeResult[this.DAA001Index].daa008; - //琛ㄥ崟涓殑閮ㄥ垎瀛楁璧嬪�� - this.$post({ - url: "/XJ/getItem", - data: { - daa001: this.formData.billNo - } - }).then(res => { - let data = res.data.tbBillList[0]; - //褰撹繑鍥炵殑缁撴灉闆嗕负绌烘椂缃┖鍘熸湁鐨勫�� - if (!data) { + this.$post({ + url: "/XJ/getWorkOrderWithItem", // 璋冪敤鏂扮殑API鑾峰彇宸ュ崟璇︾粏淇℃伅 + data: { + daa020: this.lineNo + } + }).then(res => { + //濉厖宸ュ崟鍙风殑鏁版嵁婧� + this.schemeResult = res.data.tbBillList; + this.DAA001List = this.schemeResult.map(s => s.daa001); // 淇敼涓哄皬鍐� + //鍙樹负榛樿绌哄�肩殑鐘舵�� + this.DAA001Index = -1; + this.formData.billNo = ""; + // 娓呯┖鐗╂枡淇℃伅 this.formData.itemNo = ""; + this.formData.itemName = ""; + this.formData.itemModel = ""; this.formData.planQty = ""; this.tableData = []; - return; - } + }) + }, + + //閫夊彇宸ュ崟濉厖鐗╂枡鍙峰拰鍏朵粬淇℃伅 + onDaa001Change(event) { + this.DAA001Index = event.mp.detail.value; + const selectedWorkOrder = this.schemeResult[this.DAA001Index]; + + // 璁剧疆宸ュ崟淇℃伅 + this.formData.billNo = selectedWorkOrder.daa001; // 淇敼涓哄皬鍐� + this.formData.planQty = selectedWorkOrder.daa008; // 淇敼涓哄皬鍐� + this.formData.daa002 = selectedWorkOrder.daa002; // 璁剧疆浜у搧ID + + // 浠庡伐鍗曟暟鎹腑鑾峰彇鐗╂枡淇℃伅 + this.formData.itemNo = selectedWorkOrder.itemNo; // 淇敼涓哄皬鍐� + this.formData.itemName = selectedWorkOrder.itemName; // 淇敼涓哄皬鍐� + this.formData.itemModel = selectedWorkOrder.itemModel; // 淇敼涓哄皬鍐� + + // 鑾峰彇妫�楠岄」鐩� + this.$post({ + url: "/XJ/setJYItem", + data: { + itemNo: this.formData.itemNo + } + }).then(res => { + if (res.data.tbBillList.length > 0) { + this.tableData = res.data.tbBillList; + this.isSubmit = false; + } else { + this.$showMessage("姝ょ墿鏂欐病鏈夊惎鐢ㄧ殑妫�楠岄」鐩紝璇风淮鎶�!"); + this.isSubmit = true; + this.tableData = []; + } + }).catch(err => { + console.error("鑾峰彇妫�楠岄」鐩敊璇�:", err); + this.$showMessage("鑾峰彇妫�楠岄」鐩け璐�"); + this.tableData = []; + }); + }, + init() { + this.$post({ + url: "/XJ/getPage", + data: { + id: this.formData.id, + pageIndex: 1, + limit: 1, + } + }).then(res => { + let data = res.data.tbBillList[0]; + if (data) { + this.formData = data; + + // 涓嶅啀鏍规嵁fsubmit瀛楁淇敼isUpdate鐘舵�� + // 鑰屾槸閫氳繃鎸夐挳鐨剉-if鏉′欢鏉ユ帶鍒舵樉绀� + + this.$post({ + url: "/XJ/getJYItem", + data: { + pid: this.formData.id + } + }).then(res1 => { + let tableData = res1.data.tbBillList + //褰撳凡妫�楠屼釜鏁伴兘涓嶄负绌烘椂鎸夌収妫�娴嬬粨鏋勬帓搴� + tableData.sort((a, b) => { + if (a.result === '鏈畬鎴�' && b.result === '鍚堟牸') { + return -1; + } else if (a.result === '鍚堟牸' && b.result === '鏈畬鎴�') { + return 1; + } else { + return 0; + } + }); + this.tableData = tableData; + if (this.tableData.length === 0) { + this.isShowTable = true; + } + }) + } + }); + }, + toDetail(item) { + if (this.isUpdate) { + uni.showToast({ + icon: "none", + title: "璇峰厛鐢熸垚妫�楠岄」鐩�", + duration: 2000, + }); + } else { + uni.navigateTo({ + url: 'detail?id=' + item.id + '&billNo=' + this.formData.billNo + '&gid=' + this.formData + .id + }); + } + }, saveRemarks() { + this.remarksPopup = !this.remarksPopup; + this.remarks = this.formData.remarks; + }, + editRemarks() { + if (this.remarks) { + //saveRemarksGid + this.$post({ + url: "/XJ/saveRemarksGid", + data: { + gid: this.formData.id, + remarks: this.remarks + } + }).then(res => { + if (res.data.tbBillList > 0) { + this.formData.remarks = this.remarks; + this.remarksPopup = !this.remarksPopup; + this.$showMessage("淇濆瓨鎴愬姛"); + } + }) + } + }, + toImage() { + uni.navigateTo({ + url: 'ImageItem?id=' + this.formData.id + }); + }, + getTable() { this.$post({ url: "/XJ/setJYItem", data: { @@ -357,450 +835,1573 @@ }).then(res => { if (res.data.tbBillList.length > 0) { this.tableData = res.data.tbBillList; // 鍦ㄧ澶村嚱鏁颁腑锛宼his 鎸囧悜澶栧眰浣滅敤鍩熺殑 this - this.isSubmit = false; + this.isShowTable = true; + this.isUpdate = true; } else { this.$showMessage("姝ょ墿鏂欐病鏈夊惎鐢ㄧ殑妫�楠岄」鐩紝璇风淮鎶�!"); - this.isSubmit = true; + this.isShowTable = true; + this.isUpdate = false; this.tableData = []; } }); - }); - }, - init() { - this.$post({ - url: "/XJ/getPage", - data: { - id: this.formData.id, - pageIndex: 1, - limit: 1, + }, + saveTable() { + if (this.tableData.length === 0) { + return; } - }).then(res => { - let data = res.data.tbBillList[0]; - if (data) { - this.formData = data; - - this.$post({ - url: "/XJ/getJYItem", - data: { - pid: this.formData.id - } - }).then(res1 => { - let tableData = res1.data.tbBillList - //褰撳凡妫�楠屼釜鏁伴兘涓嶄负绌烘椂鎸夌収妫�娴嬬粨鏋勬帓搴� - tableData.sort((a, b) => { - if (a.result === '鏈畬鎴�' && b.result === '鍚堟牸') { - return -1; - } else if (a.result === '鍚堟牸' && b.result === '鏈畬鎴�') { - return 1; - } else { - return 0; - } - }); - this.tableData = tableData; - if (this.tableData.length === 0) { - this.isShowTable = true; - } - }) - } - }); - }, - toDetail(item) { - if (this.isUpdate) { - uni.showToast({ - icon: "none", - title: "璇峰厛鐢熸垚妫�楠岄」鐩�", - duration: 2000, - }); - } else { - uni.navigateTo({ - url: 'detail?id=' + item.id + '&billNo=' + this.formData.billNo + '&gid=' + this.formData - .id - }); - } - }, saveRemarks() { - this.remarksPopup = !this.remarksPopup; - this.remarks = this.formData.remarks; - }, - editRemarks() { - if (this.remarks) { - //saveRemarksGid this.$post({ - url: "/XJ/saveRemarksGid", + url: "/XJ/saveItem", data: { gid: this.formData.id, - remarks: this.remarks + items: this.tableData, + userNo: this.$loginInfo.account } }).then(res => { - if (res.data.tbBillList > 0) { - this.formData.remarks = this.remarks; - this.remarksPopup = !this.remarksPopup; - this.$showMessage("淇濆瓨鎴愬姛"); - } - }) - } - }, - toImage() { - uni.navigateTo({ - url: 'ImageItem?id=' + this.formData.id - }); - }, - getTable() { - this.$post({ - url: "/XJ/setJYItem", - data: { - itemNo: this.formData.itemNo - } - }).then(res => { - if (res.data.tbBillList.length > 0) { - this.tableData = res.data.tbBillList; // 鍦ㄧ澶村嚱鏁颁腑锛宼his 鎸囧悜澶栧眰浣滅敤鍩熺殑 this - this.isShowTable = true; - this.isUpdate = true; - } else { - this.$showMessage("姝ょ墿鏂欐病鏈夊惎鐢ㄧ殑妫�楠岄」鐩紝璇风淮鎶�!"); - this.isShowTable = true; + this.formData.id = res.data.tbBillList; + this.isShowTable = false; this.isUpdate = false; - this.tableData = []; + this.init(); + }) + }, + submitInspection() { + if (this.formData.id) { + this.$post({ + url: "/XJ/SjSubmit", + data: { + id: this.formData.id, + userNo: this.$loginInfo.account + } + }).then(res => { + if (res.data.tbBillList) { + this.$showMessage("鎻愪氦鎴愬姛"); + this.init(); + } + }); } - }); + }, + getGenUpdate() { + if (!this.formData.id || !this.formData.releaseNo) { + this.$showMessage("璇峰厛淇濆瓨妫�楠屽崟锛�"); + return; + } + this.$post({ + url: "/XJ/GenUpdate", + data: { + id: this.formData.id, + no: this.formData.releaseNo, + user: this.$loginInfo.account + } + }).then(res => { + if (res.data.result === 0) { + this.$showMessage("鑾峰彇妫�楠岄」鐩垚鍔�"); + this.init(); + } else { + this.$showMessage(res.data.message || "鑾峰彇澶辫触"); + } + }); + }, + + // 闄勪欢鐩稿叧鏂规硶 + viewAttachmentInfo() { + this.showAttachmentPopup = true; + this.attachmentsLoading = true; + this.attachments = []; + this.$post({ + url: "/XJ/getAttachments", + data: { itemNo: this.formData.itemNo } + }).then(res => { + this.attachmentsLoading = false; + if (res.status === 0) { + this.attachments = res.data.tbBillList; + // 涓烘瘡涓檮浠惰缃粯璁ゅ彲鐢ㄧ姸鎬� + this.attachments.forEach((item, index) => { + this.$set(item, 'ftpAvailable', true); + this.$set(item, 'checking', false); + }); + } else if (res.status === 1 && res.message === "璇ユ楠屽崟鏈笂浼犻檮浠朵俊鎭紒") { + uni.showToast({ title: res.message, icon: "none" }); + } else { + uni.showToast({ title: "鑾峰彇闄勪欢澶辫触", icon: "none" }); + } + }); + }, + + closeAttachmentPopup() { + this.showAttachmentPopup = false; + }, + + showAttachmentDetailDialog(item) { + this.selectedAttachment = item; + this.showAttachmentPopup = false; + this.showAttachmentDetail = true; + }, + + closeAttachmentDetail() { + this.showAttachmentDetail = false; + this.selectedAttachment = null; + this.showAttachmentPopup = true; + }, + + isPreviewable(filename) { + if (!filename) return false; + const ext = filename.trim().split('.').pop().toLowerCase(); + return [ + 'pdf', + 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', + 'txt', 'log', 'md', + 'doc', 'docx', + 'xls', 'xlsx', + 'ppt', 'pptx', + '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; + } + }, + + downloadAttachment(item) { + const fileName = item.fattach.replace(/[\s\u3000\r\n]+/g, '').trim(); + const downloadUrl = this.$store.state.serverInfo.serverAPI + "/XJ/DownloadFtpFile?itemNo=" + + encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + + "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer); + + uni.downloadFile({ + url: downloadUrl, + success: (res) => { + if (res.statusCode === 200) { + uni.showToast({ title: '涓嬭浇鎴愬姛', icon: 'success' }); + } else { + uni.showToast({ title: '涓嬭浇澶辫触', icon: 'none' }); + } + }, + fail: (err) => { + console.error('涓嬭浇澶辫触锛�', err); + uni.showToast({ title: '涓嬭浇澶辫触锛岃閲嶈瘯', icon: 'none' }); + } + }); + }, + + previewFtpFile(item) { + const fileName = item.fattach.replace(/[\s\u3000\r\n]+/g, '').trim(); + const fileExt = fileName.split('.').pop().toLowerCase(); + + if (!this.isPreviewable(fileName)) { + uni.showModal({ + title: '涓嶆敮鎸侀瑙�', + content: '璇ユ枃浠剁被鍨嬩笉鏀寔鍦ㄧ嚎棰勮锛岃涓嬭浇鍚庢煡鐪�', + showCancel: false + }); + return; + } + + const previewUrl = this.$store.state.serverInfo.serverAPI + "/XJ/PreviewFtpFile?itemNo=" + + encodeURIComponent(item.itemNo) + "&fileName=" + encodeURIComponent(fileName) + + "&ftpServer=" + encodeURIComponent(this.$store.state.serverInfo.ftpServer); + + if (['pdf'].includes(fileExt)) { + this.previewPdfFile(previewUrl, fileName); + } else if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(fileExt)) { + this.previewImageFile(previewUrl, fileName); + } else if (['txt'].includes(fileExt)) { + this.previewTextFile(previewUrl, fileName); + } else { + this.previewOfficeFile(previewUrl, fileName); + } + }, + + previewPdfFile(url, fileName) { + this.previewTitle = fileName; + this.previewContent = url; + this.previewType = 'pdf'; + this.previewFileUrl = url; + this.showFilePreviewPopup = true; + this.showAttachmentDetail = false; + }, + + previewImageFile(url, fileName) { + this.previewTitle = fileName; + this.previewContent = url; + this.previewType = 'image'; + this.previewFileUrl = url; + this.showFilePreviewPopup = true; + this.showAttachmentDetail = false; + }, + + previewTextFile(url, fileName) { + this.previewTitle = fileName; + this.previewType = 'text'; + this.previewFileUrl = url; + this.showFilePreviewPopup = true; + this.showAttachmentDetail = false; + + uni.request({ + url: url, + method: 'GET', + success: (res) => { + this.previewContent = res.data; + }, + fail: (err) => { + this.previewContent = '棰勮澶辫触锛岃涓嬭浇鍚庢煡鐪�'; + } + }); + }, + + drawingConfirm() { + this.drawingShow = false + this.imageShow = false + this.productionShow = false + this.itemShow=false + }, + drawingCancel() { + this.drawingShow = false + this.imageShow = false + this.productionShow = false + // const item = '83040700101' + const item = this.formData.billNo; + console.log(this.formData.billNo ); + console.log('daa001:', item); + console.log('ItemNo:', this.formData.itemNo); + + const url = this.$store.state.serverInfo.serverAPI + "/LLJ/getWomdab"; + // 鎴栬�呭鏋滆矾寰勪笉鍚岋紝璇蜂娇鐢ㄦ纭殑绔偣 + // const url = "http://192.168.0.100:10054/api/getWomdab" + + let _this = this; + + uni.request({ + url: url, + method: 'POST', + header: { + 'Content-Type': 'application/json' + }, + data: { + daa001: item, // 鏍规嵁DTO灞炴�у悕浼犻�� + ItemNo: this.formData.itemNo // 娉ㄦ剰澶у皬鍐欏尮閰� + }, + success: (response) => { + console.log(response); + console.log("-------------------------------------"); + // 鏍规嵁鍚庣杩斿洖鐨勬暟鎹粨鏋勮繘琛岃皟鏁� + if (response.data.status === 1) { + // 鐘舵�佷负1琛ㄧず娌℃湁鏁版嵁 + _this.drawing = []; + + } else if (response.data.status === 0) { + // 鐘舵�佷负0琛ㄧず鎴愬姛 + if (response.data.data && response.data.data.tbBillList) { + _this.drawing = response.data.data.tbBillList; + + // 閬嶅巻鏁版嵁锛屽垽鏂枃浠跺悗缂�骞舵坊鍔犲瓧娈� + _this.drawing.forEach((file) => { + // 鑾峰彇鏂囦欢鍚嶇殑鍚庣紑 + const fileExtension = file.fName ? file.fName.split('.').pop().toLowerCase() : ''; + + // 瀹氫箟鏀寔鐨勬枃浠剁被鍨� + const supportedExtensions = ['jpg', 'pdf', 'xlsx', 'doc', 'docx', 'xls']; + + // 鍒ゆ柇鏄惁鏀寔璇ユ枃浠剁被鍨� + file.isSupported = supportedExtensions.includes(fileExtension); + }); + } else { + _this.drawing = []; + } + } else { + // 鍏朵粬鐘舵�佺爜澶勭悊 + _this.drawing = []; + uni.showToast({ + title: response.data.message || '璇锋眰澶辫触', + icon: 'none' + }); + } + }, + fail: (error) => { + uni.showToast({ + title: '璇锋眰鍥剧焊閾炬帴澶辫触', + icon: 'none' + }); + console.error('璇锋眰澶辫触:', error); + } + }); + }, + itemCancel() { + this.itemShow=false + }, + + fetchDrawingNumber(itemNo) { + // const item = '83040700101' + const item = itemNo; + console.log(itemNo) + // console.log(item) + const url = this.$store.state.serverInfo.serverAPI +"/PLM/RetrieveDrawings?ItemNo=" + item + + // const item = '5.06.04.4002'; + // const url = "http://192.168.0.100:10054/api/PLM/RetrieveDrawings?ItemNo=" + item + + let _this = this; + + uni.request({ + url: url, + method: 'POST', + success: (response) => { + console.log(response) + if (response.data.data == '杩斿洖缁撴灉涓虹┖') { + _this.drawing = [] + } else { + _this.drawing = response.data.data + // 閬嶅巻鏁版嵁锛屽垽鏂枃浠跺悗缂�骞舵坊鍔犲瓧娈� + _this.drawing.forEach((file) => { + // 鑾峰彇鏂囦欢鍚嶇殑鍚庣紑 + const fileExtension = file.fName.split('.').pop() + .toLowerCase(); + + // 瀹氫箟鏀寔鐨勬枃浠剁被鍨� + const supportedExtensions = ['jpg', 'pdf', 'xlsx', 'doc', + 'docx', + 'xls' + ]; + + // 鍒ゆ柇鏄惁鏀寔璇ユ枃浠剁被鍨� + file.isSupported = supportedExtensions.includes(fileExtension); + }); + } + }, + fail: (error) => { + uni.showToast({ + title: '璇锋眰鍥剧焊閾炬帴澶辫触', + icon: 'none' + }); + } + }); + this.drawingShow = true + }, + + getBom(){ + // const item = '83040700101' + const item = this.formData.billNo; + console.log(this.formData.billNo ); + console.log('daa001:', item); + console.log('ItemNo:', this.formData.itemNo); + + const url = this.$store.state.serverInfo.serverAPI + "/LLJ/getWomdab"; + // 鎴栬�呭鏋滆矾寰勪笉鍚岋紝璇蜂娇鐢ㄦ纭殑绔偣 + // const url = "http://192.168.0.100:10054/api/getWomdab" + + let _this = this; + + uni.request({ + url: url, + method: 'POST', + header: { + 'Content-Type': 'application/json' + }, + data: { + daa001: item, // 鏍规嵁DTO灞炴�у悕浼犻�� + ItemNo: this.formData.itemNo // 娉ㄦ剰澶у皬鍐欏尮閰� + }, + success: (response) => { + console.log(response); + console.log("-------------------------------------"); + // 鏍规嵁鍚庣杩斿洖鐨勬暟鎹粨鏋勮繘琛岃皟鏁� + if (response.data.status === 1) { + // 鐘舵�佷负1琛ㄧず娌℃湁鏁版嵁 + _this.drawing = []; + uni.showToast({ + title: response.data.message || '璇ユ楠屽崟鏈笂浼犻檮浠朵俊鎭�', + icon: 'none' + }); + } else if (response.data.status === 0) { + // 鐘舵�佷负0琛ㄧず鎴愬姛 + if (response.data.data && response.data.data.tbBillList) { + _this.drawing = response.data.data.tbBillList; + + // 閬嶅巻鏁版嵁锛屽垽鏂枃浠跺悗缂�骞舵坊鍔犲瓧娈� + _this.drawing.forEach((file) => { + // 鑾峰彇鏂囦欢鍚嶇殑鍚庣紑 + const fileExtension = file.fName ? file.fName.split('.').pop().toLowerCase() : ''; + + // 瀹氫箟鏀寔鐨勬枃浠剁被鍨� + const supportedExtensions = ['jpg', 'pdf', 'xlsx', 'doc', 'docx', 'xls']; + + // 鍒ゆ柇鏄惁鏀寔璇ユ枃浠剁被鍨� + file.isSupported = supportedExtensions.includes(fileExtension); + }); + } else { + _this.drawing = []; + } + } else { + // 鍏朵粬鐘舵�佺爜澶勭悊 + _this.drawing = []; + uni.showToast({ + title: response.data.message || '璇锋眰澶辫触', + icon: 'none' + }); + } + }, + fail: (error) => { + uni.showToast({ + title: '璇锋眰鍥剧焊閾炬帴澶辫触', + icon: 'none' + }); + console.error('璇锋眰澶辫触:', error); + } + }); + this.itemShow = true + }, + + //鍥剧焊鐩稿叧鏂囨。 + openDrawings(item) { + console.log("jkjoi", item) + if (item.fRelevantObject.length > 2) { + // 鐢熸垚璇锋眰URL锛堢畝鍖栫紪鐮侀�昏緫锛� + const encodedName = encodeURIComponent(item.fName); + const url = this.$store.state.serverInfo.serverAPI+`/PLM/OpenDrawingsGet?fileId=${item.fRelevantObject}&fName=${encodedName}`; + console.log('璇锋眰URL:', url); + + const now = new Date(); + const timestamp = [ + now.getFullYear(), + String(now.getMonth() + 1).padStart(2, '0'), + String(now.getDate()).padStart(2, '0'), + String(now.getHours()).padStart(2, '0'), + String(now.getMinutes()).padStart(2, '0'), + String(now.getSeconds()).padStart(2, '0') + ].join(''); + + // 鐢熸垚鏂版枃浠跺悕锛堝熀纭�鍚峗鏃堕棿鎴�.鍚庣紑锛� + this.fileName = `${item.fName}_${timestamp}.pdf`; + console.log('鏂版枃浠跺悕:', this.fileName); + + uni.downloadFile({ + url: url, + success: (res) => { + console.log(res); + let fileName = this.fileName; + let fileExt = fileName.split('.').pop(); + // let newFilePath = "_doc/uniapp_temp_1742877118745/download" + "/" + fileName; + // console.log('newFilePath', newFilePath) + if (fileExt === 'xls' || fileExt === 'xlsx' || fileExt === 'pdf'|| fileExt === 'jpg'|| fileExt === 'png') { + plus.io.resolveLocalFileSystemURL(res.tempFilePath, (entry) => { + // 鑾峰彇鏂囦欢鎵�鍦ㄧ殑鐩綍 + entry.getParent((parentEntry) => { + let newFileName = this.fileName; // 鏂扮殑鏂囦欢鍚� + + // 绉诲姩骞堕噸鍛藉悕鏂囦欢 + entry.moveTo( + parentEntry, + newFileName, + (newEntry) => { + console.log('閲嶅懡鍚嶆垚鍔�:', newEntry.fullPath); + + // 鎵撳紑 Excel 鏂囦欢 + plus.runtime.openFile(newEntry.fullPath, {}, (e) => { + console.error('鏃犳硶鎵撳紑 Excel 鏂囦欢:', e); + }); + + // let pages = getCurrentPages(); + // let beforePage = pages[pages.length - 2]; + // uni.navigateBack({ + // delta: 1, //杩斿洖鐨勯〉闈㈡暟锛屽鏋滀负1琛ㄧず杩斿洖涓婁竴椤� + // success: (event) => { + // beforePage.$vm.reload() + // } + // }); + + }, + (err) => { + console.error('閲嶅懡鍚嶅け璐�:', err); + } + ); + }, (err) => { + console.error('鑾峰彇鐖剁洰褰曞け璐�:', err); + }); + }, (err) => { + console.error('鑾峰彇鏂囦欢澶辫触:', err); + }); + } else { + console.error('鏂囦欢鏍煎紡涓嶅尮閰�:', fileExt); + uni.showToast({ + title: '鏂囦欢鏍煎紡涓嶆敮鎸�', + icon: 'none' + }); + } + } + }) + uni.request({ + url: url, + method: 'POST', + responseType: 'arraybuffer', + success: (response) => { + console.log(response.data) + if (!response) { + uni.showToast({ + title: "鍗忚棰勮澶辫触", + duration: 2000 + }); + } + + }, + fail: (error) => { + console.log(error) + uni.showToast({ + title: '璇锋眰棰勮閾炬帴澶辫触', + icon: 'none' + }); + } + }); + } + else + { + uni.showToast({ + title: '璇锋眰棰勮閾炬帴澶辫触', + icon: 'none' + }); + } + }, + + previewOfficeFile(url, fileName) { + this.previewTitle = fileName; + this.previewContent = ''; + this.previewType = 'excel'; + this.previewFileUrl = url; + this.showFilePreviewPopup = true; + this.showAttachmentDetail = false; + }, + + closeFilePreview() { + this.showFilePreviewPopup = false; + this.showAttachmentDetail = true; + }, + + downloadPreviewFile() { + if (this.previewFileUrl && this.selectedAttachment) { + this.downloadAttachment(this.selectedAttachment); + } + }, + + previewImageInPopup() { + // 鍦ㄦ柊绐楀彛涓墦寮�鍥剧墖杩涜鏀惧ぇ鏌ョ湅 + if (this.previewContent) { + uni.previewImage({ + urls: [this.previewContent], + current: this.previewContent + }); + } + } + }, - saveTable() { - if (this.tableData.length === 0) { - return; - } - this.$post({ - url: "/XJ/saveItem", - data: { - gid: this.formData.id, - items: this.tableData, - userNo: this.$loginInfo.account - } - }).then(res => { - this.formData.id = res.data.tbBillList; - this.isShowTable = false; - this.isUpdate = false; + onShow() { + //姣忔杩涘叆椤甸潰閮戒細鎵ц鐨勬柟娉� + if (this.formData.id) { this.init(); - }) + } } - }, - onShow() { - //姣忔杩涘叆椤甸潰閮戒細鎵ц鐨勬柟娉� - if (this.formData.id) { - this.init(); - } - } -}; -</script> -<style scoped> -/* 鍩虹鏍峰紡 */ -.container { - padding: 10px; - background-color: #f5f7fa; - min-height: 100vh; -} - -/* 澶撮儴鏍峰紡 */ -.header { - background-color: white; - padding: 20px; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); - margin-bottom: 20px; -} - -.title { - font-size: 20px; - font-weight: 600; - color: #2c3e50; - margin-bottom: 8px; -} - -.order-number { - font-size: 14px; - color: #3498db; - font-weight: 500; -} - -/* 鍖哄煙鏍峰紡 */ -.section { - background-color: white; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); - margin-bottom: 20px; - overflow: hidden; -} - -.section-header { - background-color: #f8f9fa; - padding: 15px 20px; - border-bottom: 1px solid #eee; - font-size: 16px; - font-weight: 600; - color: #2c3e50; -} - -.section-body { - padding: 20px; -} - -/* 淇℃伅缃戞牸 */ -.info-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 15px; -} - -.info-item { - display: flex; - flex-direction: column; - gap: 5px; -} - -.info-label { - font-size: 12px; - color: #7f8c8d; - font-weight: 500; -} - -.info-value { - font-size: 14px; - color: #2c3e50; -} - -.info-value.highlight { - font-weight: 600; - color: #3498db; - font-size: 16px; -} - -.info-value.danger { - color: #e74c3c; - font-weight: 500; -} - -/* 閫夋嫨鍣ㄦ牱寮� */ -.picker-input { - border: 1px solid #ddd; - border-radius: 4px; - padding: 8px 12px; - background-color: white; - cursor: pointer; -} - -.picker-value { - font-size: 14px; - color: #2c3e50; -} - -/* 妫�楠岄」鐩〃鏍� */ -.inspection-table { - width: 100%; - border-radius: 8px; - overflow: hidden; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); - margin: 25px 0; -} - -.inspection-table table { - width: 100%; - border-collapse: collapse; -} - -.inspection-table th { - background-color: #f8f9fa; - color: #34495e; - padding: 12px 15px; - font-weight: bold; - text-align: left; - border: 1px solid #ddd; -} - -.inspection-table td { - padding: 12px 15px; - text-align: left; - border: 1px solid #ddd; -} - -.inspection-table tr:nth-child(even) { - background-color: #f9f9f9; -} - -.inspection-table tr:hover { - background-color: #f1f5f9; -} - -/* 姘村嵃鏍峰紡 */ -.watermark { - position: absolute; - font-size: 40px; - font-weight: bold; - opacity: 1; - z-index: 1; - pointer-events: none; - transform: rotate(-15deg); - width: 100%; - text-align: center; - top: 50%; - left: 50%; - transform: translate(-50%, -50%) rotate(-15deg); -} - -.watermark.approved { - color: #2ecc71; -} - -.watermark.rejected { - color: #e74c3c; -} - -.watermark.pending { - color: #f39c12; -} - -/* 鎻忚堪鏂囨湰瀹瑰櫒 */ -.description-text { - position: relative; - z-index: 2; - padding: 25px; - background-color: rgba(255, 255, 255, 0.7); -} - -/* 璋冩暣琛ㄦ牸鍗曞厓鏍� */ -.inspection-table td:nth-child(2) { - position: relative; - overflow: hidden; - padding: 0; -} - -.record-btn { - padding: 6px 12px; - background-color: #f8f9fa; - border: 1px solid #ddd; - border-radius: 3px; - cursor: pointer; - transition: all 0.2s; - font-size: 14px; - color: #333; -} - -.record-btn:hover { - background-color: #e9ecef; -} - - -/* 鎿嶄綔鎸夐挳 */ -.action-buttons { - display: flex; - flex-direction: column; - gap: 10px; - margin-bottom: 20px; -} - -.action-btn { - padding: 12px 20px; - border: none; - border-radius: 6px; - font-size: 14px; - font-weight: 500; - cursor: pointer; - transition: all 0.2s; -} - -.action-btn.primary { - background-color: #3498db; - color: white; -} - -.action-btn.secondary { - background-color: #95a5a6; - color: white; -} - -.action-btn.danger { - background-color: #e74c3c; - color: white; -} - -.action-btn.warning { - background-color: #f39c12; - color: white; -} - -/* 寮瑰嚭妗嗘牱寮� */ -.overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.5); - display: flex; - justify-content: center; - align-items: center; - z-index: 1000; -} - -.popup { - background-color: white; - border-radius: 8px; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); - width: 90%; - max-width: 400px; - max-height: 80vh; - overflow-y: auto; -} - -.popup-header { - padding: 20px; - border-bottom: 1px solid #eee; -} - -.popup-header h3 { - font-size: 18px; - font-weight: 600; - color: #2c3e50; - margin: 0; -} - -.popup-content { - padding: 20px; -} - -.input-group { - display: flex; - flex-direction: column; - gap: 8px; -} - -.input-label { - font-size: 14px; - color: #7f8c8d; - font-weight: 500; -} - -.input-field { - padding: 8px 12px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 14px; - background-color: white; -} - -.popup-actions { - padding: 20px; - border-top: 1px solid #eee; - display: flex; - gap: 10px; - justify-content: flex-end; -} - -/* 鍝嶅簲寮忚璁� */ -@media (max-width: 768px) { - .info-grid { - grid-template-columns: 1fr; + }; + </script> + <style scoped> + /* 鍩虹鏍峰紡 */ + .container { + padding: 10px; + background-color: #f5f7fa; + min-height: 100vh; } - .action-buttons { - flex-direction: column; + /* 澶撮儴鏍峰紡 */ + .header { + background-color: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); + margin-bottom: 20px; } -} -</style> \ No newline at end of file + + .title { + font-size: 20px; + font-weight: 600; + color: #2c3e50; + margin-bottom: 8px; + } + + .order-number { + font-size: 14px; + color: #3498db; + font-weight: 500; + } + + /* 鍖哄煙鏍峰紡 */ + .section { + background-color: white; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); + margin-bottom: 20px; + overflow: hidden; + } + + .section-header { + background-color: #f8f9fa; + padding: 15px 20px; + border-bottom: 1px solid #eee; + font-size: 16px; + font-weight: 600; + color: #2c3e50; + } + + .section-body { + padding: 20px; + } + + /* 淇℃伅缃戞牸 */ + .info-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 15px; + } + + .info-item { + display: flex; + flex-direction: column; + gap: 5px; + } + + .info-label { + font-size: 12px; + color: #7f8c8d; + font-weight: 500; + } + + .info-value { + font-size: 14px; + color: #2c3e50; + } + + .info-value.highlight { + font-weight: 600; + color: #3498db; + font-size: 16px; + } + + .info-value.danger { + color: #e74c3c; + font-weight: 500; + } + + /* 閫夋嫨鍣ㄦ牱寮� */ + .picker-input { + border: 1px solid #ddd; + border-radius: 4px; + padding: 8px 12px; + background-color: white; + cursor: pointer; + } + + .picker-value { + font-size: 14px; + color: #2c3e50; + } + + /* 妫�楠岄」鐩〃鏍� */ + .inspection-table { + width: 100%; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + margin: 25px 0; + } + + .inspection-table table { + width: 100%; + border-collapse: collapse; + } + + .inspection-table th { + background-color: #f8f9fa; + color: #34495e; + padding: 12px 15px; + font-weight: bold; + text-align: left; + border: 1px solid #ddd; + } + + .inspection-table td { + padding: 12px 15px; + text-align: left; + border: 1px solid #ddd; + } + + .inspection-table tr:nth-child(even) { + background-color: #f9f9f9; + } + + .inspection-table tr:hover { + background-color: #f1f5f9; + } + + /* 姘村嵃鏍峰紡 */ + .watermark { + position: absolute; + font-size: 40px; + font-weight: bold; + opacity: 1; + z-index: 1; + pointer-events: none; + transform: rotate(-15deg); + width: 100%; + text-align: center; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-15deg); + } + + .watermark.approved { + color: #2ecc71; + } + + .watermark.rejected { + color: #e74c3c; + } + + .watermark.pending { + color: #f39c12; + } + + /* 鎻忚堪鏂囨湰瀹瑰櫒 */ + .description-text { + position: relative; + z-index: 2; + padding: 25px; + background-color: rgba(255, 255, 255, 0.7); + } + + /* 璋冩暣琛ㄦ牸鍗曞厓鏍� */ + .inspection-table td:nth-child(2) { + position: relative; + overflow: hidden; + padding: 0; + } + + .record-btn { + padding: 6px 12px; + background-color: #f8f9fa; + border: 1px solid #ddd; + border-radius: 3px; + cursor: pointer; + transition: all 0.2s; + font-size: 14px; + color: #333; + } + + .record-btn:hover { + background-color: #e9ecef; + } + + + /* 鎿嶄綔鎸夐挳 */ + .action-buttons { + display: flex; + flex-direction: column; + gap: 10px; + margin-bottom: 20px; + } + + .action-btn { + padding: 12px 20px; + border: none; + border-radius: 6px; + font-size: 14px; + font-weight: 500; + cursor: pointer; + transition: all 0.2s; + } + + .action-btn.primary { + background-color: #3498db; + color: white; + } + + .action-btn.secondary { + background-color: #95a5a6; + color: white; + } + + .action-btn.danger { + background-color: #e74c3c; + color: white; + } + + .action-btn.warning { + background-color: #f39c12; + color: white; + } + + .action-btn.success { + background-color: #2ecc71; + color: white; + } + + .action-btn.info { + background-color: #17a2b8; + color: white; + } + + .action-btn.small { + padding: 6px 12px; + font-size: 12px; + } + + /* 寮瑰嚭妗嗘牱寮� */ + .overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + } + + .popup { + background-color: white; + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + width: 90%; + max-width: 400px; + max-height: 80vh; + overflow-y: auto; + } + + .popup-header { + padding: 20px; + border-bottom: 1px solid #eee; + } + + .popup-header h3 { + font-size: 18px; + font-weight: 600; + color: #2c3e50; + margin: 0; + } + + .popup-content { + padding: 20px; + } + + .input-group { + display: flex; + flex-direction: column; + gap: 8px; + } + + .input-label { + font-size: 14px; + color: #7f8c8d; + font-weight: 500; + } + + .input-field { + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; + background-color: white; + } + + /* 闄勪欢鐩稿叧鏍峰紡 */ + .no-attachments { + text-align: center; + padding: 40px 20px; + color: #7f8c8d; + } + + .attachments-list { + max-height: 400px; + overflow-y: auto; + } + + .attachment-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px; + border: 1px solid #eee; + border-radius: 4px; + margin-bottom: 8px; + background-color: #f8f9fa; + } + + .attachment-info { + flex: 1; + display: flex; + flex-direction: column; + gap: 4px; + } + + .attachment-name { + font-weight: 500; + color: #2c3e50; + } + + .attachment-type { + font-size: 12px; + color: #7f8c8d; + } + + .attachment-date { + font-size: 12px; + color: #95a5a6; + } + + .attachment-actions { + display: flex; + gap: 8px; + } + + .popup-actions { + padding: 20px; + border-top: 1px solid #eee; + display: flex; + gap: 10px; + justify-content: flex-end; + } + + /* 闄勪欢寮圭獥鏍峰紡 */ + .attachment-list { + padding: 0; + margin: 0; + list-style: none; + max-height: 300px; + overflow-y: auto; + } + + .attachment-list li { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 0; + border-bottom: 1px solid #f0f0f0; + } + + .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 { + display: flex; + gap: 8px; + 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; + } + + .attachment-list .secondary-btn:hover { + background: #e6f0fa; + color: #1976d2; + } + + .preview-btn { + background: #e8f5e8 !important; + color: #2e7d2e !important; + border-color: #a5d6a5 !important; + } + + .preview-btn:hover { + background: #d4eecc !important; + color: #1e5f1e !important; + } + + /* 闄勪欢寮圭獥閫氱敤鏍峰紡 */ + .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; + } + + .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-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; + } + + /* 闄勪欢鍒楄〃甯冨眬 - 鎸夌収LLJ鐨勫崱鐗囬鏍� */ + .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; + gap: 16px; + } + + .file-type-badge { + width: 40px; + height: 40px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + background: #f8f9fa; + border: 2px solid #e9ecef; + flex-shrink: 0; + } + + .file-type-badge.large { + width: 56px; + height: 56px; + font-size: 28px; + } + + .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; + } + + .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; + } + + .attachment-name:hover { + color: #3498db; + } + + .attachment-card-body { + padding: 16px 20px 20px; + } + + .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; + } + + /* 鎸夐挳鏍峰紡 - 鎸夌収LLJ椋庢牸 */ + .btn-secondary { + padding: 8px 16px; + border: 1px solid #ddd; + border-radius: 4px; + background-color: white; + font-size: 14px; + transition: all 0.2s; + color: #2c3e50; + flex: 1; + } + + .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; + } + + /* 鏂囦欢棰勮寮圭獥鏍峰紡 */ + .file-preview-popup { + width: 80vw; + max-width: 800px; + max-height: 80vh; + } + + .file-preview-title { + padding: 20px; + margin: 0; + font-size: 16px; + font-weight: 600; + color: #2c3e50; + border-bottom: 1px solid #eee; + word-break: break-all; + } + + .file-preview-content { + padding: 20px; + max-height: 60vh; + overflow-y: auto; + } + + .file-preview-content pre { + white-space: pre-wrap; + word-wrap: break-word; + font-family: 'Courier New', monospace; + font-size: 12px; + line-height: 1.4; + background: #f8f9fa; + padding: 15px; + border-radius: 4px; + border: 1px solid #e9ecef; + } + + .image-preview-container { + text-align: center; + } + + .image-zoom-hint { + margin-top: 10px; + font-size: 12px; + color: #7f8c8d; + } + + .unsupported-preview { + text-align: center; + padding: 40px 20px; + } + + .unsupported-icon { + font-size: 48px; + margin-bottom: 16px; + } + + .unsupported-text { + font-size: 16px; + color: #7f8c8d; + margin-bottom: 8px; + } + + .unsupported-hint { + font-size: 14px; + color: #95a5a6; + } + + .file-preview-actions { + padding: 15px 20px; + border-top: 1px solid #eee; + display: flex; + gap: 10px; + justify-content: center; + } + + .file-preview-btn { + padding: 8px 16px; + border-radius: 4px; + border: none; + font-size: 14px; + cursor: pointer; + transition: all 0.2s; + } + + .file-preview-btn.download-btn { + background: #2ecc71; + color: white; + } + + .file-preview-btn.close-btn { + background: #95a5a6; + color: white; + } + + .file-preview-btn:hover { + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0,0,0,0.15); + } + + /* 鍝嶅簲寮忚璁� */ + @media (max-width: 768px) { + .info-grid { + grid-template-columns: 1fr; + } + + .action-buttons { + flex-direction: column; + } + + /* 闄勪欢寮圭獥鍝嶅簲寮� */ + .attachment-list-popup { + width: 95vw; + margin: 10px; + } + + .attachment-detail-popup { + width: 95vw; + margin: 10px; + } + + .file-preview-popup { + width: 95vw; + } + + .attachment-grid { + grid-template-columns: 1fr; + gap: 16px; + } + + .attachment-card { + margin: 0; + } + + .attachment-card-actions { + flex-direction: column; + gap: 8px; + } + + .action-btn { + width: 100%; + justify-content: center; + } + + .attachment-detail-actions { + flex-direction: column; + gap: 12px; + } + + .detail-action-btn { + width: 100%; + } + + .attachment-popup-header { + padding: 16px 20px; + } + + .attachment-popup-title { + font-size: 18px; + } + + .attachment-icon { + font-size: 20px; + } + } + + @media (max-width: 480px) { + .attachment-popup-content { + padding: 16px; + } + + .attachment-card-header { + padding: 16px 16px 12px; + } + + .attachment-card-body { + padding: 12px 16px 16px; + } + + .file-type-icon { + width: 40px; + height: 40px; + font-size: 20px; + } + + .file-type-icon.large { + width: 56px; + height: 56px; + font-size: 28px; + } + } + </style> \ No newline at end of file -- Gitblit v1.9.3