.claude/settings.local.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
CLAUDE.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/LLJ/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/RKJ/Add.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/RKJ/List.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/RKJ/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/SJ/Add.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/SJ/List.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/SJ/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/XJ/Add.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/XJ/List.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/XJ/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
store/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
.claude/settings.local.json
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ { "permissions": { "allow": [ "Bash(git add:*)" ], "deny": [] } } CLAUDE.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,89 @@ # CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview This is a Vue.js 2 + UniApp mobile application called "GS-MES-AP" (StandardPda-Browse) for manufacturing quality control and warehouse management. The application is designed for PDA (Personal Digital Assistant) devices used in manufacturing environments. ## Key Technologies - **Framework**: Vue.js 2 + UniApp (uni-app v2.0.2) - **State Management**: Vuex - **UI Components**: uView UI v2.0.38, Vant v2.13.7 - **Build Tool**: Vue CLI with @dcloudio/vue-cli-plugin-uni - **Platform**: Multi-platform (Android/iOS app, H5, various mini-programs) ## Development Commands Since this is a UniApp project, standard npm scripts are not present. Development should be done through: - **HBuilderX IDE**: The recommended development environment for UniApp - **Build**: Use HBuilderX to build for different platforms - **Debug**: Use HBuilderX's built-in debugger or device debugging ## Architecture Overview ### Core Structure - **Entry Point**: `main.js` - Sets up Vue instance, store, and global prototypes - **State Management**: `store/index.js` - Vuex store with server configuration - **Routing**: `pages.json` - UniApp page configuration (not Vue Router) - **App Configuration**: `manifest.json` - App metadata and platform-specific settings ### Key Directories - `pages/` - Application pages organized by feature modules - `BasePages/` - Core pages (login, main, user profile) - `QC/` - Quality Control modules (æ¥ææ£éª, 馿£, å·¡æ£, å ¥åºæ£) - `Warehouse/` - Warehouse management modules - `fileView/` - File viewing components (PDF, Excel, Word, images) - `components/` - Reusable UI components - `common/` - Shared utilities and global mixins - `utils/` - Utility functions for printing, scanning, messaging - `static/` - Static assets (images, icons, sounds) ### Quality Control (QC) Modules - **LLJ (æ¥ææ£éª)**: Incoming material inspection - **SJ (馿£)**: First article inspection - **XJ (å·¡æ£)**: Patrol inspection - **RKJ (å ¥åºæ£)**: Warehouse inspection - **THL (鿢æ)**: Return/exchange material confirmation ### Core Features - **Barcode/QR Code Scanning**: Custom PDA integration via `utils/scanCode.js` - **Image Capture**: Camera integration for quality documentation - **File Viewing**: PDF, Excel, Word, and image preview capabilities - **Bluetooth Printing**: Barcode and receipt printing via `components/kk-printer/` - **Offline Storage**: Local data persistence using uni.storage APIs ### API Integration - **Server Configuration**: Located in `store/index.js` - **Request Handling**: Global methods `$get`, `$post`, `$uni_request` in `main.js` - **Authentication**: User info stored in `$loginInfo` prototype ### PDA Hardware Integration - **Barcode Scanning**: Android broadcast receiver implementation in `utils/scanCode.js` - **Camera Access**: Native camera API through UniApp - **Bluetooth Printing**: Thermal printer integration ## Development Guidelines ### Working with QC Modules Each QC module follows a consistent pattern: - `List.vue` - Data listing with pull-to-refresh - `Add.vue` - Form for creating new entries - `detail.vue` - Detailed view/editing - `ImageItem.vue` - Image capture and upload ### Adding New Features 1. Create page in appropriate `pages/` subdirectory 2. Add page configuration to `pages.json` 3. Use global API methods (`$get`, `$post`) for server communication 4. Follow existing patterns for form handling and data validation ### Testing - Test on actual PDA devices for barcode scanning functionality - Verify camera and printing features on target hardware - Test offline storage and sync capabilities ## Important Notes - This is a PDA-specific application with hardware dependencies - Server API endpoint is configured in `store/index.js` - Image uploads are base64 encoded and sent to `/Base/saveImage` - All text content is in Chinese (simplified) - Application supports multiple deployment targets (Android, iOS, H5) pages/QC/LLJ/detail.vue
@@ -7,12 +7,14 @@ </view> <!-- æ ç¾æ --> <view class="tabs"> <view v-for="(tab, index) in tabs" :key="index" class="tab" :class="{active: currentTab === index}" @tap="switchTab(index,tab.id)"> {{ tab.fcheckItem }} <scroll-view class="tabs" scroll-x="true" :show-scrollbar="false"> <view class="tabs-container"> <view v-for="(tab, index) in tabs" :key="index" class="tab" :class="{active: currentTab === index}" @tap="switchTab(index,tab.id)"> {{ tab.fcheckItem }} </view> </view> </view> </scroll-view> <view class="tab-content"> <!-- åºæ¬ä¿¡æ¯ --> <view class="section"> @@ -731,17 +733,25 @@ } .tabs { display: flex; background-color: $bg-color; border-bottom: 1px solid $border-color; width: 100%; white-space: nowrap; .tabs-container { display: flex; min-width: 100%; } .tab { flex: 1; flex: none; min-width: 120px; text-align: center; padding: 12px 0; padding: 12px 16px; border-right: 1px solid $border-color; color: #666; transition: all 0.3s; white-space: nowrap; &:last-child { border-right: none; pages/QC/RKJ/Add.vue
@@ -1,148 +1,151 @@ <template> <view> <view class="form-container"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.releaseNo"/> <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="form-group"> <label class="form-label">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="formData.createBy"/> <view class="info-item"> <view class="info-label">å建人</view> <view class="info-value">{{ formData.createBy }}</view> </view> <view class="form-group"> <label class="form-label">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="formData.createDate"/> <view class="info-item"> <view class="info-label">å建æ¶é´</view> <view class="info-value">{{ formData.createDate }}</view> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">ç产线å«:</text> <view class="info-item"> <view class="info-label">ç产线å«</view> <superwei-combox v-if="isUpdate" :candidates="DAA020List" placeholder="è¯·éæ©æè¾å ¥" v-model="formData.lineName" @select="onDaa020Change" class="picker form-input" style="border: none;"></superwei-combox> <input v-else class="form-input" disabled="true" type="text" v-model="formData.daa015"/> class="picker-input"></superwei-combox> <view v-else class="info-value">{{ formData.daa015 }}</view> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">å·¥åå·:</text> <view class="info-item"> <view class="info-label">å·¥åå·</view> <superwei-combox v-if="isUpdate" :candidates="DAA001List" placeholder="è¯·éæ©æè¾å ¥" v-model="formData.billNo" @select="onDaa001Change" class="picker form-input" style="border: none;"></superwei-combox> <input v-else class="form-input" disabled="true" type="text" v-model="formData.billNo"/> class="picker-input"></superwei-combox> <view v-else class="info-value">{{ formData.billNo }}</view> </view> <view class="form-group"> <label class="form-label">éæ£æ¹æ¬¡:</label> <input class="form-input" type="text" v-model="formData.rbillNo" :readonly="true" /> <view class="info-item"> <view class="info-label">éæ£æ¹æ¬¡</view> <input class="info-input" type="text" v-model="formData.rbillNo" :readonly="true" /> </view> <view class="form-group"> <label class="form-label">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemNo"/> <view class="info-item"> <view class="info-label">ç©æç¼ç </view> <view class="info-value">{{ formData.itemNo }}</view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemName"/> </view> <view class="info-item"> <view class="info-label">产ååç§°</view> <view class="info-value">{{ formData.itemName }}</view> </view> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemModel"/> <view class="info-item"> <view class="info-label">è§æ ¼åå·</view> <view class="info-value">{{ formData.itemModel }}</view> </view> <view class="form-group"> <label class="form-label">鿣æ°é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.quantity"/> <view class="info-item"> <view class="info-label">鿣æ°é</view> <view class="info-value highlight">{{ formData.quantity }}</view> </view> <view class="form-group"> <label class="form-label">æ¥å·¥äºº:</label> <input class="form-input" disabled="true" type="text" v-model="formData.bgr"/> <view class="info-item"> <view class="info-label">æ¥å·¥äºº</view> <view class="info-value">{{ formData.bgr }}</view> </view> <view class="form-group"> <label class="form-label">æ£éªç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fcheckResu"/> <view class="info-item"> <view class="info-label">æ£éªç»æ</view> <view class="info-value">{{ formData.fcheckResu }}</view> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks"/> <view class="info-item" v-if="formData.remarks"> <view class="info-label">ä¸åæ ¼æè¿°</view> <view class="info-value danger">{{ formData.remarks }}</view> </view> </form> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" class="th" style="color: #FFFFFF;">æ£éªé¡¹ç®</uni-th> <uni-th align="center" class="th" style="color: #FFFFFF">æ¯å¦åæ ¼</uni-th> <uni-th align="center" class="th" style="color: #FFFFFF">è®°å½(ç¹å»)</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index"> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.projName"/> </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.result"/> </uni-td> <uni-td> <view class="uni-group"> <button v-if="item.isCheck >=item.levelNum" type="default" @click="toDetail(item)"> {{ item.levelNum + '/' + item.isCheck }} </button> <button v-else type="warn" @click="toDetail(item)"> {{ item.levelNum + '/' + item.isCheck }} </button> </view> </uni-td> </uni-tr> </uni-table> </view> <view class="plus-button"> <button type="warn" v-if="isUpdate && !isShowTable" @click="getItem">çææ£éªå</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable" @click="toImage">ä¸ä¼ /æ¥çå¾ç</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable && this.formData.fsubmit != 1" @click="cleanResult">æ¸ é¤æ£éªç»æ</button> </view> <!-- <view class="plus-button"> <button type="warn" v-if="!isUpdate && !formData.fcheckResu && !isShowTable" @click="removeXJ">å é¤åæ®</button> </view> --> <view class="plus-button"> <button type="warn" v-if="isShowTable" @click="getTable">è·åæ£éªé¡¹ç®</button> </view> <view class="plus-button"> <button type="warn" v-if="isShowTable && isUpdate" @click="saveTable">çææ£éªé¡¹ç®</button> </view> <view v-if="showPopup" 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="remarks"/> </view> <button type="warn" @click="edit">ä¿®æ¹</button> <button @click="showPopup = !showPopup">åæ¶</button> </form> </view> </view> </view> </template> <!-- æ£éªé¡¹ç® --> <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 warning" v-if="!isUpdate && !isShowTable" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> <button class="action-btn danger" v-if="!isUpdate && !isShowTable && this.formData.fsubmit != 1" @click="cleanResult">æ¸ é¤æ£éªç»æ</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="showPopup" 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="edit">ä¿®æ¹</button> <button class="action-btn secondary" @click="showPopup = !showPopup">åæ¶</button> </view> </view> </view> </view> </template> <script> export default { @@ -218,6 +221,27 @@ } }, 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({ @@ -491,79 +515,248 @@ }; </script> <style> .form-group { <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; align-items: center; border-bottom: 1px solid #c9c9c9; flex-direction: column; gap: 5px; } .form-label { margin-bottom: 0; padding: 5px; } .form-input { flex: 1; margin-bottom: 0; padding: 5px; } .picker { flex: 1; margin-bottom: 0; padding: 5px; .info-label { font-size: 12px; color: #7f8c8d; font-weight: 500; } .uni-form-item { display: flex; border-bottom: 1px solid #c9c9c9; .info-value { font-size: 14px; color: #2c3e50; } .edit { .info-value.highlight { font-weight: 600; color: #3498db; font-size: 16px; } .info-value.danger { color: #e74c3c; font-weight: 500; } /* è¾å ¥æ¡æ ·å¼ */ .info-input { padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; background-color: white; } /* é»è®¤æ ·å¼ */ .list-container { height: 60vh; /* 设置å表容å¨çé«åº¦ä¸ºå©ä½ç©ºé´ï¼å¹¶åå»è¡¨å容å¨çé«åº¦ */ overflow-y: auto; /* å 许å表容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿å表å 容æ´ç¾è§ */ } /* å¨å°å±å¹è®¾å¤ä¸ï¼éç½®é«åº¦ä¸ºéåºå±å¹ */ @media (max-width: 768px) { .list-container { height: calc(100vh - 500px); /* éå½è°æ´é«åº¦ */ } } .form-container { padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿è¡¨åå 容æ´ç¾è§ */ } .th { background-color: lightskyblue; color: #FFFFFF; } .plus-button { line-height: 59px; font-size: 24px; /* 鿩卿 ·å¼ */ .picker-input { border: 1px solid #ddd; border-radius: 4px; padding: 8px 12px; background-color: white; cursor: pointer; z-index: 1000; margin-bottom: 10px; 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; @@ -574,16 +767,71 @@ display: flex; justify-content: center; align-items: center; z-index: 1000; } .popup { background-color: #fff; 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: 1px solid #ccc; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 68vw; /* 设置宽度为è§å£å®½åº¦ç80% */ height: 25vh; /* 设置é«åº¦ä¸ºè§å£é«åº¦ç80% */ 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; } .action-buttons { flex-direction: column; } } </style> pages/QC/RKJ/List.vue
@@ -1,228 +1,103 @@ <template> <view> <view class="inspection-app"> <!-- å·æ°é¡µé¢åçé¡¶é¨æç¤ºæ¡ --> <view class="tips" :class="{ 'tips-ani': tipShow }">å·æ°æå</view> <view class="newsTab"> <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem" style-type="button" active-color="#87cefa"></uni-segmented-control> <view class="content"> <view v-show="current===0"> <!-- åºäº uni-list ç页é¢å¸å± --> <uni-list> <!-- to 屿§æºå¸¦åæ°è·³è½¬è¯¦æ 页é¢ï¼å½ååªä¸ºåè --> <uni-list-item style="margin-top: 10px;background-color:#EFEFF4;border-radius: 5px;" class="list-item" direction="column" v-for="item in data" :key="item.id" :to="'Add?id='+item.id+'&releaseNo='+item.releaseNo"> <!-- éè¿headerææ§½å®ä¹åè¡¨çæ é¢ --> <template v-slot:header> <view class="form-group uni-title" style="margin-bottom: 0;"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.releaseNo"/> </view> </template> <!-- éè¿bodyææ§½å®ä¹å表å 容æ¾ç¤º --> <template v-slot:body> <view style="margin-top: 0;"> <view class="uni-content"> <view class="uni-note"> <view class="form-group"> <label class="form-label lab">éæ£æ¹æ¬¡å·:</label> <input class="form-input" disabled="true" type="text" v-model="item.billNo"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="item.createDate"/> </view> </view> <view class="uni-note"> <view class="form-group"> <label class="form-label lab">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="item.createBy"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">产线:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa015"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="item.itemNo"/> </view> </view> <!-- <view class="uni-title-sub uni-ellipsis-2">--> <!-- <view class="form-group">--> <!-- <label class="form-label">é¢è²:</label>--> <!-- <input class="form-input" disabled="true" type="text" v-model="item.colorName"/>--> <!-- </view>--> <!-- </view>--> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemName"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemModel"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">鿣æ°é:</label> <input class="form-input" disabled="true" type="text" v-model="item.quantity"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">æ¥å·¥äºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.bgr"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£éªäºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckBy"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£æµç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </view> </view> </view> </view> </template> </uni-list-item> </uni-list> <!-- éè¿ loadMore ç»ä»¶å®ç°ä¸æå è½½ææï¼å¦éèªå®ä¹æ¾ç¤ºå 容ï¼å¯åèï¼https://ext.dcloud.net.cn/plugin?id=29 --> <!-- <uni-load-more v-if="loading || options.status === 'noMore' " :status="options.status" /> --> <!-- <view class="fab" @click="handleFabClick"> <text class="fab-icon">+</text> </view> --> <view class="plus-button" @click="handleFabClick"> + </view> </view> <view v-show="current===1"> <uni-list> <!-- to 屿§æºå¸¦åæ°è·³è½¬è¯¦æ 页é¢ï¼å½ååªä¸ºåè --> <uni-list-item style="margin-top: 10px;background-color:#EFEFF4;border-radius: 5px;" class="list-item" direction="column" v-for="item in data" :key="item.id" :to="'Add?id='+item.id+'&releaseNo='+item.releaseNo"> <!-- éè¿headerææ§½å®ä¹åè¡¨çæ é¢ --> <template v-slot:header> <view class="form-group uni-title" style="margin-bottom: 0;"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.releaseNo"/> </view> </template> <!-- éè¿bodyææ§½å®ä¹å表å 容æ¾ç¤º --> <template v-slot:body> <view style="margin-top: 0;"> <view class="uni-content"> <view class="uni-note"> <view class="form-group"> <label class="form-label lab">éæ£æ¹æ¬¡å·:</label> <input class="form-input" disabled="true" type="text" v-model="item.billNo"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="item.createDate"/> </view> </view> <view class="uni-note"> <view class="form-group"> <label class="form-label lab">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="item.createBy"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">产线:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa015"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="item.itemNo"/> </view> </view> <!-- <view class="uni-title-sub uni-ellipsis-2">--> <!-- <view class="form-group">--> <!-- <label class="form-label">é¢è²:</label>--> <!-- <input class="form-input" disabled="true" type="text" v-model="item.colorName"/>--> <!-- </view>--> <!-- </view>--> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemName"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemModel"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">鿣æ°é:</label> <input class="form-input" disabled="true" type="text" v-model="item.quantity"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">æ¥å·¥äºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.bgr"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£éªäºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckBy"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£æµç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </view> </view> </view> </view> </template> </uni-list-item> </uni-list> <!-- é¡¶é¨çéåº --> <view class="filter-section"> <view class="filter-controls"> <!-- ç¶æåæ¢æ ç¾ --> <view class="status-tabs"> <button :class="['tab-button', current === 0 ? 'active' : '']" @click="onClickItem({currentIndex: 0})"> {{items[0]}} </button> <button :class="['tab-button', current === 1 ? 'active' : '']" @click="onClickItem({currentIndex: 1})"> {{items[1]}} </button> </view> </view> </view> <!-- æ£éªåå表 --> <view class="inspection-list"> <!-- æ£éªåå¡ç --> <view class="inspection-card" v-for="item in data" :key="item.id" @click="navigateToDetail(item)"> <view class="card-header"> <text class="card-title">æ£éªåå·: {{item.releaseNo}}</text> <text class="status pass" v-if="item.fcheckResu === 'åæ ¼'">åæ ¼</text> <text class="status unqualified" v-if="item.fcheckResu === 'ä¸åæ ¼'">ä¸åæ ¼</text> <text class="status pending" v-if="!item.fcheckResu">å¾ æ£éª</text> </view> <view class="card-body"> <view class="info-row"> <view class="info-item"> <text class="info-label">éæ£æ¹æ¬¡å·</text> <text class="info-content">{{item.billNo}}</text> </view> <view class="info-item"> <text class="info-label">产线</text> <text class="info-content">{{item.daa015}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">ç©æä¿¡æ¯</text> <text class="info-content">{{item.itemNo}}<br>{{item.itemName}}</text> </view> <view class="info-item"> <text class="info-label">产ååå·</text> <text class="info-content">{{item.itemModel}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">鿣æ°é</text> <text class="info-content highlight">{{item.quantity}}</text> </view> <view class="info-item"> <text class="info-label">æ¥å·¥äºº</text> <text class="info-content">{{item.bgr}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">æ£éªäºº</text> <text class="info-content">{{item.fcheckBy}}</text> </view> <view class="info-item"> <text class="info-label">å建人</text> <text class="info-content">{{item.createBy}}</text> </view> </view> <view class="meta-info"> <text class="meta-item"> <uni-icons type="calendar" size="14" color="#95a5a6"></uni-icons> {{item.createDate}} </text> <text class="meta-item" v-if="item.fcheckResu"> <uni-icons type="checkmarkempty" size="14" color="#95a5a6"></uni-icons> æ£æµç»æ: {{item.fcheckResu}} </text> </view> </view> <view class="card-actions"> <button class="primary" @click.stop="navigateToDetail(item)"> {{current === 0 ? 'å¼å§æ£éª' : 'æ¥ç详æ '}} </button> </view> </view> </view> <!-- æ°å¢æé® --> <view class="plus-button" @click="handleFabClick"> + </view> </view> </template> @@ -302,6 +177,11 @@ this.init(); } }, navigateToDetail(item) { uni.navigateTo({ url: 'Add?id=' + item.id + '&releaseNo=' + item.releaseNo }); }, }, /** * 䏿巿°åè°å½æ° @@ -336,42 +216,169 @@ }; </script> <style lang="scss"> @import '@/common/uni-ui.scss'; .uni-note { margin-top: 0; <style scoped> /* åºç¡æ ·å¼éç½® */ .inspection-app { padding: 10px; background-color: #f5f7fa; min-height: 100vh; } /* Set the input backgrounds to be gray */ .form-input { background-color: #f2f2f2; /* Or any other shade of gray you prefer */ /* é¡¶é¨çéåº */ .filter-section { margin-bottom: 24px; } /* Ensure automatic adaptation based on page size */ .form-group { .filter-controls { display: flex; justify-content: center; align-items: center; } .status-tabs { display: flex; border-radius: 4px; overflow: hidden; background-color: #ecf0f1; width: 300px; } .tab-button { padding: 0px 16px; border: none; background: none; font-size: 14px; transition: all 0.3s; margin: 0; height: 35px; flex: 1; } .tab-button.active { background-color: #3498db; color: white; } /* æ£éªåå表 */ .inspection-list { display: flex; flex-direction: column; gap: 20px; } /* æ£éªåå¡ç */ .inspection-card { background-color: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); overflow: hidden; transition: all 0.3s; } .card-header { padding: 16px; border-bottom: 1px solid #eee; display: flex; align-items: center; } .form-label { margin-bottom: 0; border-bottom: 1px solid #FFFFFF; padding: 5px; font-size: 12px; width: 80px; /* Adjust the font size as per your requirement */ .card-title { font-size: 16px; font-weight: 600; flex: 1; margin: 0 8px; } .form-input { flex: 1; margin-bottom: 0; border-bottom: 1px solid #c7c7c7; padding: 5px; .status { font-size: 12px; background-color: #FFFFFF; /* Adjust the font size as per your requirement */ padding: 4px 8px; border-radius: 4px; font-weight: 500; } .status.pending { background-color: #f39c12; color: white; } .status.pass { background-color: #00cd00; color: white; } .status.unqualified { background-color: #ff0000; color: white; } .card-body { padding: 16px; } .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; } .highlight { font-weight: 600; color: #2c3e50; font-size: 16px; } .meta-info { display: flex; gap: 16px; font-size: 12px; color: #95a5a6; margin-top: 12px; } .meta-item { display: flex; align-items: center; gap: 4px; } .card-actions { padding: 12px 16px; border-top: 1px solid #eee; display: flex; gap: 8px; } button { padding: 8px 16px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; transition: all 0.2s; flex: 1; } button.primary { background-color: #3498db; color: white; border-color: #2980b9; } .plus-button { @@ -381,7 +388,7 @@ width: 60px; height: 60px; border-radius: 50%; background-color: #007bff; background-color: #3498db; color: #ffffff; text-align: center; line-height: 59px; @@ -389,15 +396,6 @@ cursor: pointer; z-index: 1000; margin-bottom: 35px; } page { display: flex; flex-direction: column; box-sizing: border-box; background-color: #efeff4; min-height: 100%; height: auto; } .tips { @@ -418,36 +416,26 @@ opacity: 1; } .content { width: 100%; /* ååºå¼è®¾è®¡ */ @media (min-width: 768px) { .inspection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); } .info-row { flex-direction: row; } } .list-picture { width: 100%; height: 145px; } .thumb-image { width: 100%; height: 100%; } .ellipsis { display: flex; overflow: hidden; } .uni-ellipsis-1 { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .uni-ellipsis-2 { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; @media (min-width: 300px) { .inspection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); } .info-row { flex-direction: row; } } </style> pages/QC/RKJ/detail.vue
@@ -1,148 +1,204 @@ <template> <view> <view class="form-container"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">项ç®åç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.projName"/> </view> <view class="form-group"> <label class="form-label">è´¨éè¦æ±:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemMod"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ¹æ³:</label> <input class="form-input" disabled="true" type="text" v-model="formData.inspectionMethod"/> </view> <view class="form-group"> <label class="form-label">使ç¨ä»ªè¡¨:</label> <input class="form-input" disabled="true" type="text" v-model="formData.usingInstruments"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.levelNum"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ åç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="formData.qsCode"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.qsName"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ°´å¹³:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fcheckLevel"/> </view> <view class="form-group"> <label class="form-label">æ¥æ¶æ°´å¹³:</label> <input class="form-input" disabled="true" type="text" v-model="formData.facLevel"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.minValue"/> </view> <view class="form-group"> <label class="form-label">æ åå¼:</label> <input class="form-input" disabled="true" type="text" v-model="formData.standardValue"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.maxValue"/> </view> <view class="form-group"> <label class="form-label">ACæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.freQty - 1"/> </view> <view class="form-group"> <label class="form-label">REæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.freQty"/> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.unqualified"/> </view> <view class="form-group"> <label class="form-label">é¢è§ç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="formData.result"/> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks"/> </view> <view class="form-group edit"> <input class="form-input" style="color: red" disabled="true" type="text" value="没ææå¤§å¼åæå°å¼æ¶å¡«å0ï¼æªéè¿æ£éªï¼æ1ï¼éè¿æ£éªï¼"/> </view> <view class="form-group edit"> <label class="form-label">æ£æµç»æ:</label> <input class="form-input" type="number" v-model="formData.fcheckResu"/> </view> <button type="primary" v-if="tableData.length < formData.levelNum" @click="submit">ä¿å</button> </form> </view> <view> <img v-if="isShowImg" :src="base64Image" style="width:100%" @click="previewImage"/> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">ç¼å·</uni-th> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">å¤å®æ è¯</uni-th> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">æ£éªç»æ</uni-th> <uni-th width="150" align="center" style="color: #FFFFFF;background-color: lightskyblue;">ä¿®æ¹ </uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index"> <uni-td align="center"> {{ index + 1 }} </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.fstand"/> </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </uni-td> <uni-td> <view class="uni-group"> <button type="warn" v-if="isNumber" @click="toDetail(item)">ä¿®æ¹</button> <button type="warn" v-if="!isNumber" @click="numberEdit(item)">{{ editResult(item.fcheckResu) }}</button> </view> </uni-td> </uni-tr> </uni-table> <view class="container"> <!-- å¤´é¨ --> <view class="header"> <view class="title">å ¥åºæ£éªé¡¹ç®æç»</view> <view class="order-number">æ£éªåå·: {{formData.id}}</view> </view> <view class="plus-button"> <button type="warn" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> </view> <view v-if="showPopup" class="overlay"> <view class="popup"> <h3>ä¿®æ¹æ£éªç»æ</h3> <form :modelValue="editData"> <view class="form-group"> <label class="form-label">æ£éªç»æ:</label> <input class="form-input" type="text" v-model="editData.fcheckResu"/> <!-- åºæ¬ä¿¡æ¯ --> <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.projName }}</view> </view> <button type="warn" @click="eidt">ä¿®æ¹</button> <button @click="showPopup = !showPopup">åæ¶</button> </form> <view class="info-item" v-if="formData.itemMod"> <view class="info-label">è´¨éè¦æ±</view> <view class="info-value">{{ formData.itemMod }}</view> </view> <view class="info-item" v-if="formData.inspectionMethod"> <view class="info-label">æ£éªæ¹æ³</view> <view class="info-value">{{ formData.inspectionMethod }}</view> </view> <view class="info-item" v-if="formData.usingInstruments"> <view class="info-label">使ç¨ä»ªè¡¨</view> <view class="info-value">{{ formData.usingInstruments }}</view> </view> <view class="info-item"> <view class="info-label">æ£éªæ°</view> <view class="info-value">{{ formData.levelNum }}</view> </view> <view class="info-item" v-if="formData.qsCode"> <view class="info-label">æ£éªæ åç¼ç </view> <view class="info-value">{{ formData.qsCode }}</view> </view> <view class="info-item" v-if="formData.qsName"> <view class="info-label">æ£éªæ ååç§°</view> <view class="info-value">{{ formData.qsName }}</view> </view> <view class="info-item" v-if="formData.fcheckLevel"> <view class="info-label">æ£éªæ°´å¹³</view> <view class="info-value">{{ formData.fcheckLevel }}</view> </view> <view class="info-item" v-if="formData.facLevel"> <view class="info-label">æ¥æ¶æ°´å¹³</view> <view class="info-value">{{ formData.facLevel }}</view> </view> <view class="info-item" v-if="formData.minValue"> <view class="info-label">ä¸é</view> <view class="info-value">{{ formData.minValue }}</view> </view> <view class="info-item" v-if="formData.standardValue"> <view class="info-label">æ åå¼</view> <view class="info-value">{{ formData.standardValue }}</view> </view> <view class="info-item" v-if="formData.maxValue"> <view class="info-label">ä¸é</view> <view class="info-value">{{ formData.maxValue }}</view> </view> </view> </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">ACæ°</view> <view class="info-value">{{formData.freQty ? formData.freQty - 1 : 0}}</view> </view> <view class="info-item"> <view class="info-label">REæ°</view> <view class="info-value">{{formData.freQty || 0}}</view> </view> <view class="info-item"> <view class="info-label">ä¸åæ ¼æ°</view> <view class="info-value">{{formData.unqualified || 0}}</view> </view> </view> <view v-if="formData.result != null" class="result-preview"> <view class="info-label">é¢è§ç»æ</view> <view class="info-value">{{formData.result}}</view> </view> <view v-if="formData.remarks != null" class="result-ng"> <view class="info-label">ä¸åæ ¼æè¿°</view> <view class="info-value danger">{{formData.remarks}}</view> </view> </view> </view> <!-- ç»æå½å ¥ --> <view class="section"> <view class="section-header">æ£éªç»æå½å ¥</view> <view class="section-body"> <view class="inspection-hint"> <view class="hint-text">没ææå¤§å¼åæå°å¼æ¶å¡«å0ï¼æªéè¿æ£éªï¼æ1ï¼éè¿æ£éªï¼</view> </view> <view class="input-group"> <view class="input-wrapper"> <input v-if="tableData.length < formData.levelNum" v-model="formData.fcheckResu" type="number" class="result-input" placeholder="请è¾å ¥æ£éªç»æ" placeholder-class="placeholder" /> <button v-if="(tableData.length < formData.levelNum)" class="btn primary-btn" @click="submit">ä¿åç»æ</button> </view> </view> </view> </view> <!-- å¾çé¢è§ --> <view v-if="isShowImg" class="section"> <view class="section-header">ç¸å ³å¾ç</view> <view class="section-body"> <view class="image-preview" @click="previewImage"> <image :src="base64Image" mode="aspectFit" class="preview-image"/> </view> </view> </view> <!-- ç»æè¡¨æ ¼ --> <view v-if="tableData.length > 0" class="section"> <view class="section-header">æ£éªè®°å½</view> <view class="section-body"> <view class="table-container"> <view class="table-header"> <view class="th">ç¼å·</view> <view class="th">å¤å®æ è¯</view> <view class="th">æ£éªç»æ</view> <view class="th">æä½</view> </view> <view v-for="(item, index) in tableData" :key="index" class="table-row"> <view class="td">{{ index + 1 }}</view> <view class="td"> <view class="result-badge" :class="item.fstand === 'â' ? 'OK' : 'NG'"> {{ item.fstand }} </view> </view> <view class="td"> <view class="result-badge" :class="item.fcheckResu === '1' ? 'OK' : 'NG'"> {{ item.fcheckResu }} </view> </view> <view class="td"> <button v-if="isNumber" class="btn danger-btn" @click="toDetail(item)">ä¿®æ¹</button> <button v-if="!isNumber" class="btn danger-btn" @click="numberEdit(item)">{{ editResult(item.fcheckResu) }}</button> </view> </view> </view> </view> </view> <!-- æä½æé® --> <view class="action-buttons"> <button class="action-btn warning" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> </view> <!-- ä¿®æ¹æ£éªç»æå¼¹åºæ¡ --> <view v-if="showPopup" 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="editData.fcheckResu" placeholder="请è¾å ¥æ£éªç»æ"/> </view> </view> <view class="popup-actions"> <button class="action-btn primary" @click="eidt">ä¿®æ¹</button> <button class="action-btn secondary" @click="showPopup = !showPopup">åæ¶</button> </view> </view> </view> <!-- ä¿®æ¹ä¸åæ ¼æè¿°å¼¹åºæ¡ --> <view v-if="remarksPopup" 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="remarks"/> <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> <button type="warn" @click="editRemarks">ä¿®æ¹</button> <button @click="remarksPopup = !remarksPopup">åæ¶</button> </form> </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> @@ -402,49 +458,274 @@ } </script> <style> .form-group { display: flex; align-items: center; border: 1px solid #c9c9c9; background-color: #d4d4d4; <style lang="scss"> $primary-color: #409EFF; $success-color: #67C23A; $danger-color: #F56C6C; $warning-color: #E6A23C; $border-color: #DCDFE6; $bg-color: #f5f7fa; .container { padding: 20px; background-color: #fff; } .form-label { margin-bottom: 0; padding: 5px; } .header { padding: 20px; border-bottom: 1px solid $border-color; background: linear-gradient(90deg, #f0f7ff, #e1f0ff); .form-input { flex: 1; margin-bottom: 0; padding: 5px; } .title { font-size: 24px; color: #333; margin-bottom: 10px; } /* é»è®¤æ ·å¼ */ .list-container { height: calc(100vh - 750px); /* 设置å表容å¨çé«åº¦ä¸ºå©ä½ç©ºé´ï¼å¹¶åå»è¡¨å容å¨çé«åº¦ */ overflow-y: auto; /* å 许å表容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿å表å 容æ´ç¾è§ */ } /* å¨å°å±å¹è®¾å¤ä¸ï¼éç½®é«åº¦ä¸ºéåºå±å¹ */ @media (max-width: 768px) { .list-container { height: calc(100vh - 485px); /* éå½è°æ´é«åº¦ */ .order-number { color: #666; font-size: 14px; } } .form-container { /* 设置表å容å¨çé«åº¦ï¼ä½¿å ¶å¯ä»¥æ»å¨ */ overflow-y: auto; /* å 许表å容å¨åç´æ»å¨ */ .section { margin: 20px 0; border: 1px solid $border-color; border-radius: 4px; &-header { padding: 12px 16px; background-color: $bg-color; border-bottom: 1px solid $border-color; font-weight: bold; } &-body { padding: 16px; } } .info-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; .info-item { margin-bottom: 12px; .info-label { color: #909399; font-size: 14px; margin-bottom: 4px; } .info-value { color: #333; font-weight: 500; } } } .inspection-hint { background-color: #fff3cd; padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿è¡¨åå 容æ´ç¾è§ */ border-radius: 4px; margin-bottom: 15px; } .hint-text { font-size: 12px; color: #856404; } .input-group { margin: 16px 0; .input-wrapper { display: flex; gap: 12px; .result-input { flex: 1; height: 45px; padding: 0 12px; border: 1px solid $border-color; border-radius: 4px; font-size: 14px; } } } .btn { padding: 8px 16px; border: none; border-radius: 4px; font-size: 14px; cursor: pointer; transition: all 0.2s; &.primary-btn { background-color: $primary-color; color: white; } &.danger-btn { background-color: $danger-color; color: white; } } .table-container { border: 1px solid $border-color; border-radius: 4px; overflow: hidden; width: 100%; .table-header { display: flex; background-color: $bg-color; border-bottom: 1px solid $border-color; .th { flex: 1; padding: 12px; font-weight: bold; text-align: center; border-right: 1px solid $border-color; &:last-child { border-right: none; } } } .table-row { display: flex; border-bottom: 1px solid $border-color; align-items: center; min-height: 50px; &:last-child { border-bottom: none; } .td { flex: 1; display: flex; align-items: center; justify-content: center; padding: 8px; border-right: 1px solid $border-color; &:last-child { border-right: none; } } } } .result-badge { display: inline-block; padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: bold; &.OK { background-color: rgba($success-color, 0.1); color: $success-color; } &.NG { background-color: rgba($danger-color, 0.1); color: $danger-color; } } .result-preview { margin: 16px 0; padding: 12px; background-color: #f8f9fa; border-radius: 4px; display: flex; align-items: center; gap: 12px; .info-label { color: #909399; font-size: 14px; min-width: 80px; } .info-value { color: #333; font-weight: 500; } } .result-ng { margin: 16px 0; padding: 12px; background-color: rgba($danger-color, 0.1); border-radius: 4px; display: flex; align-items: center; gap: 12px; .info-label { color: $danger-color; font-size: 14px; min-width: 80px; } .info-value { color: $danger-color; font-weight: 500; } } .image-preview { text-align: center; cursor: pointer; } .preview-image { max-width: 100%; max-height: 300px; border-radius: 4px; border: 1px solid #ddd; } .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; &.primary { background-color: $primary-color; color: white; } &.secondary { background-color: #95a5a6; color: white; } &.warning { background-color: $warning-color; color: white; } } .overlay { @@ -457,20 +738,87 @@ display: flex; justify-content: center; align-items: center; z-index: 1000; } .popup { background-color: #fff; padding: 20px; border: 1px solid #ccc; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 68vw; /* 设置宽度为è§å£å®½åº¦ç80% */ height: 25vh; /* 设置é«åº¦ä¸ºè§å£é«åº¦ç80% */ 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; } .edit { .popup-header { padding: 20px; border-bottom: 1px solid #eee; 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; } .danger { color: $danger-color; } /* ååºå¼è®¾è®¡ */ @media (max-width: 768px) { .info-grid { grid-template-columns: 1fr; } .input-wrapper { flex-direction: column; } .table-container { .table-header .th { font-size: 12px; padding: 8px 4px; } .table-row .td { font-size: 12px; padding: 8px 4px; } } } </style> pages/QC/SJ/Add.vue
@@ -1,130 +1,159 @@ <template> <view> <view class="form-container"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">馿£åå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.billNo" /> </view> <view class="form-group"> <label class="form-label">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="formData.createTime" /> </view> <view class="form-group"> <label class="form-label">æ£éªç±»å:</label> <picker v-if="isUpdate" class="form-input" :range="SJ_MJList" :value="SJ_MJIndex" @change="onSJ_MJChange"> <view>{{ SJ_MJList[SJ_MJIndex] }}</view> </picker> <input v-else class="form-input" disabled="true" type="text" v-model="formData.SJ_MJ" /> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">ç产线å«:</text> <superwei-combox v-if="isUpdate" :candidates="DAA020List" placeholder="è¯·éæ©æè¾å ¥" v-model="formData.line" @select="onDaa020Change" class="picker form-input" style="border: none;"></superwei-combox> <input v-else class="form-input" disabled="true" type="text" v-model="formData.line" /> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">ç©æç¼ç :</text> <superwei-combox v-if="isUpdate" :candidates="boardItems" placeholder="è¯·éæ©æè¾å ¥" v-model="formData.itemNo" :isJSON="true" keyName="itemName" @select="onItemChange" class="picker form-input" style="border: none;"></superwei-combox> <input v-else class="form-input" disabled="true" type="text" v-model="formData.itemNo" /> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">计åç¼å·:</text> <picker v-if="isUpdate" class="picker form-input" name="selector" :range="DAA001List" @change="onDaa001Change"> <text>{{ DAA001List[DAA001Index] }}</text> </picker> <input v-else class="form-input" disabled="true" type="text" v-model="formData.daa001" /> </view> <view class="form-group"> <label class="form-label">éå®è®¢åå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.caa015" /> </view> <view class="form-group"> <label class="form-label">客æ·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.cust" /> </view> <view class="form-group"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.daa003" /> </view> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.daa004" /> </view> <view class="form-group"> <label class="form-label">工忰é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.daa008" /> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks" /> </view> </form> <view class="inspection-sheet"> <!-- 头é¨ä¿¡æ¯ --> <view class="sheet-header"> <h1>馿£æ£éªå</h1> <view class="inspection-number">馿£åå·ï¼{{formData.billNo}}</view> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" class="th" style="color: #FFFFFF;">æ£éªé¡¹ç®</uni-th> <uni-th align="center" class="th" style="color: #FFFFFF">æ¯å¦åæ ¼</uni-th> <uni-th align="center" class="th" style="color: #FFFFFF">è®°å½(ç¹å»)</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index"> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.projName" /> </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.result" /> </uni-td> <uni-td> <view class="uni-group"> <button v-if="item.isCheck >=item.levelNum" type="default" @click="toDetail(item)"> <!-- åºæ¬ä¿¡æ¯åº --> <view class="basic-info"> <view class="info-row"> <span class="info-label">å建æ¶é´ï¼</span> <span class="info-value">{{formData.createTime}}</span> <span class="info-label">æ£éªç±»åï¼</span> <span class="info-value">{{formData.SJ_MJ}}</span> </view> <view class="info-row" v-if="isUpdate"> <span class="info-label">æ£éªç±»åï¼</span> <picker class="info-picker" :range="SJ_MJList" :value="SJ_MJIndex" @change="onSJ_MJChange"> <view>{{ SJ_MJList[SJ_MJIndex] }}</view> </picker> </view> </view> <!-- ç产信æ¯åº --> <view class="material-info"> <view class="info-block"> <view class="info-label">ç产线å«ï¼</view> <superwei-combox v-if="isUpdate" :candidates="DAA020List" placeholder="è¯·éæ©æè¾å ¥" v-model="formData.line" @select="onDaa020Change" class="info-picker-input"></superwei-combox> <view v-else class="info-value">{{formData.line}}</view> </view> <view class="info-block"> <view class="info-label">ç©æç¼ç ï¼</view> <superwei-combox v-if="isUpdate" :candidates="boardItems" placeholder="è¯·éæ©æè¾å ¥" v-model="formData.itemNo" :isJSON="true" keyName="itemName" @select="onItemChange" class="info-picker-input"></superwei-combox> <view v-else class="info-value">{{formData.itemNo}}</view> </view> <view class="info-block"> <view class="info-label">计åç¼å·ï¼</view> <picker v-if="isUpdate" class="info-picker" name="selector" :range="DAA001List" @change="onDaa001Change"> <text>{{ DAA001List[DAA001Index] }}</text> </picker> <view v-else class="info-value">{{formData.daa001}}</view> </view> <view class="info-block"> <view class="info-label">éå®è®¢åå·ï¼</view> <view class="info-value">{{formData.caa015}}</view> </view> <view class="info-block"> <view class="info-label">客æ·ï¼</view> <view class="info-value">{{formData.cust}}</view> </view> <view class="info-block"> <view class="info-label">产ååç§°ï¼</view> <view class="info-value">{{formData.daa003}}</view> </view> <view class="info-block"> <view class="info-label">è§æ ¼åå·ï¼</view> <view class="info-value">{{formData.daa004}}</view> </view> <view class="info-block"> <view class="info-label">工忰éï¼</view> <view class="info-value highlight">{{formData.daa008}}</view> </view> <view class="info-block" v-if="formData.remarks"> <view class="info-label">ä¸åæ ¼æè¿°ï¼</view> <view class="info-value">{{formData.remarks}}</view> </view> </view> <!-- æ£éªé¡¹ç®è¡¨æ ¼ --> <view class="inspection-table" v-if="tableData.length > 0"> <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">æ£éªé¡¹ç®è¯¦æ </view> </td> <td> <button class="record-btn" @click="toDetail(item)"> {{ item.levelNum + '/' + item.isCheck }} </button> <button v-else type="warn" @click="toDetail(item)"> {{ item.levelNum + '/' + item.isCheck }}</button> </view> </uni-td> </uni-tr> </uni-table> </td> </tr> </tbody> </table> </view> <view class="plus-button"> <button type="warn" v-if="isUpdate && !isShowTable" @click="save">å建æ£éªåå¹¶çæé¨åé»è®¤å¼</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable" @click="toImage">ä¸ä¼ /æ¥çå¾ç</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable && formData.xjGenFlag == 0" @click="saveXJ">çæå·¡æ£</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && formData.result == 'æªå®æ' && !isShowTable" @click="removeXJ">å é¤åæ® <!-- æä½æé®åº --> <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 && formData.xjGenFlag == 0" @click="saveXJ"> çæå·¡æ£ </button> <button class="action-btn danger" v-if="!isUpdate && formData.result == 'æªå®æ' && !isShowTable" @click="removeXJ"> å é¤åæ® </button> <button class="action-btn secondary" 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 class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> </view> <view class="plus-button"> <button type="warn" v-if="isShowTable" @click="getTable">è·åæ£éªé¡¹ç®</button> </view> <view class="plus-button"> <button type="warn" v-if="isShowTable && isUpdate" @click="saveTable">çææ£éªé¡¹ç®</button> </view> <!-- å¼¹åºæ¡ --> <view v-if="remarksPopup" 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="remarks" /> <view class="popup-header"> <h3>ä¿®æ¹ä¸åæ ¼æè¿°</h3> </view> <view class="popup-content"> <view class="info-block"> <view class="info-label">ä¸åæ ¼æè¿°ï¼</view> <input class="info-input" type="text" v-model="remarks" placeholder="请è¾å ¥ä¸åæ ¼æè¿°" /> </view> <button type="warn" @click="editRemarks">ä¿®æ¹</button> <button @click="remarksPopup = !remarksPopup">åæ¶</button> </form> </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> @@ -211,6 +240,16 @@ } }, methods: { getResultClass(result) { if (result === 'åæ ¼') return 'result-pass'; if (result === 'ä¸åæ ¼') return 'result-fail'; return 'result-pending'; }, getStatusText(status) { if (status === 'åæ ¼') return 'åæ ¼'; if (status === 'ä¸åæ ¼') return 'ä¸åæ ¼'; return 'æªå®æ'; }, removeXJ() { if (this.formData.id) { this.$post({ @@ -497,99 +536,322 @@ }; </script> <style> .form-group { display: flex; align-items: center; border-bottom: 1px solid #c9c9c9; } <style scoped> /* åºç¡æ ·å¼ */ .inspection-sheet { padding: 10px; background-color: #f5f7fa; min-height: 100vh; } .form-label { margin-bottom: 0; padding: 5px; } /* 头鍿 ·å¼ */ .sheet-header { background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); margin-bottom: 20px; } .form-input { flex: 1; margin-bottom: 0; padding: 5px; } .sheet-header h1 { font-size: 24px; font-weight: 600; color: #2c3e50; margin-bottom: 10px; } .inspection-number { font-size: 16px; color: #3498db; font-weight: 500; } .picker { flex: 1; margin-bottom: 0; padding: 5px; font-size: 12px; } /* åºæ¬ä¿¡æ¯åº */ .basic-info { background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); margin-bottom: 20px; } .uni-form-item { display: flex; border-bottom: 1px solid #c9c9c9; } .info-row { display: flex; align-items: center; margin-bottom: 15px; } .edit { background-color: white; } .info-label { font-size: 14px; color: #7f8c8d; margin-right: 10px; min-width: 80px; } /* é»è®¤æ ·å¼ */ .list-container { height: 60vh; /* 设置å表容å¨çé«åº¦ä¸ºå©ä½ç©ºé´ï¼å¹¶åå»è¡¨å容å¨çé«åº¦ */ overflow-y: auto; /* å 许å表容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿å表å 容æ´ç¾è§ */ } .info-value { font-size: 14px; color: #2c3e50; margin-right: 20px; } /* å¨å°å±å¹è®¾å¤ä¸ï¼éç½®é«åº¦ä¸ºéåºå±å¹ */ @media (max-width: 768px) { .list-container { height: calc(100vh - 376px); /* éå½è°æ´é«åº¦ */ } } .info-picker { padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; margin-right: 20px; } /* ç©æä¿¡æ¯åº */ .material-info { background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); margin-bottom: 20px; } .form-container { padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿è¡¨åå 容æ´ç¾è§ */ } .info-block { display: flex; align-items: center; margin-bottom: 15px; } .th { background-color: lightskyblue; color: #FFFFFF; } .info-block .info-label { min-width: 100px; font-size: 14px; color: #7f8c8d; } .info-block .info-value { font-size: 14px; color: #2c3e50; flex: 1; } .plus-button { line-height: 59px; font-size: 24px; cursor: pointer; z-index: 1000; margin-bottom: 10px; } .info-picker-input { flex: 1; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; } .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; } .info-input { flex: 1; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; } .popup { background-color: #fff; padding: 20px; border: 1px solid #ccc; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 68vw; /* 设置宽度为è§å£å®½åº¦ç80% */ height: 25vh; /* 设置é«åº¦ä¸ºè§å£é«åº¦ç80% */ } .highlight { font-weight: 600; color: #e74c3c; font-size: 16px; } /* æ£éªé¡¹ç®è¡¨æ ¼ */ .inspection-table { margin: 25px 0; } .inspection-table table { width: 100%; border-collapse: collapse; } .inspection-table th, .inspection-table td { padding: 12px 15px; border: 1px solid #ddd; text-align: left; } .inspection-table th { background-color: #f8f9fa; font-weight: bold; color: #34495e; } .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; 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; background-color: rgba(255, 255, 255, 0.7); padding: 10px; font-size: 14px; color: #2c3e50; } /* è°æ´è¡¨æ ¼åå æ ¼ */ .inspection-table td:nth-child(2) { position: relative; overflow: hidden; padding: 0; } /* æé®æ ·å¼ */ .record-btn { padding: 6px 12px; background-color: #f8f9fa; border: 1px solid #ddd; cursor: pointer; transition: all 0.2s; font-size: 12px; } .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; transition: all 0.2s; cursor: pointer; } .action-btn.primary { background-color: #3498db; color: white; } .action-btn.primary:hover { background-color: #2980b9; } .action-btn.secondary { background-color: #95a5a6; color: white; } .action-btn.secondary:hover { background-color: #7f8c8d; } .action-btn.danger { background-color: #e74c3c; color: white; } .action-btn.danger:hover { background-color: #c0392b; } /* å¼¹åºæ¡æ ·å¼ */ .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; } .popup-actions { padding: 20px; border-top: 1px solid #eee; display: flex; gap: 10px; justify-content: flex-end; } /* ååºå¼è®¾è®¡ */ @media (max-width: 768px) { .info-row { flex-direction: column; align-items: flex-start; } .info-label { margin-bottom: 5px; } .project-item { flex-direction: column; align-items: flex-start; } .project-actions { margin-top: 10px; width: 100%; } } </style> pages/QC/SJ/List.vue
@@ -1,245 +1,113 @@ <template> <view> <view class="inspection-app"> <!-- å·æ°é¡µé¢åçé¡¶é¨æç¤ºæ¡ --> <view class="tips" :class="{ 'tips-ani': tipShow }">å·æ°æå</view> <!-- æç´¢æ¡ --> <view class="search-bar"> <view class="search-bar-box"> <!-- <image class="search-span" src="../../static/image/searchSpan.png"/> --> <input type="text" value="" v-model="searchValue" placeholder="ç©æç¼ç ç©æåç§°" class="search-text" maxlength="100" focus/> <button @click="btnclicked" class="search-btn">æç´¢</button> </view> </view> <view class="newsTab"> <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem" style-type="button" active-color="#87cefa"></uni-segmented-control> <view class="content"> <view v-show="current===0"> <!-- åºäº uni-list ç页é¢å¸å± --> <uni-list> <!-- to 屿§æºå¸¦åæ°è·³è½¬è¯¦æ 页é¢ï¼å½ååªä¸ºåè --> <uni-list-item style="margin-top: 10px;background-color: #EFEFF4;border-radius: 5px;" class="list-item" direction="column" v-for="item in data" :key="item.id" :to="'Add?id='+item.id+'&billNo='+item.billNo"> <!-- éè¿headerææ§½å®ä¹åè¡¨çæ é¢ --> <template v-slot:header> <view class="form-group uni-title" style="margin-bottom: 0;"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.billNo"/> </view> </template> <!-- éè¿bodyææ§½å®ä¹å表å 容æ¾ç¤º --> <template v-slot:body> <view style="margin-top: 0;"> <view class="uni-content"> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="item.statusDate"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">æ£éªç±»å:</label> <input class="form-input" disabled="true" type="text" v-model="item.SJ_MJ"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">产线:</label> <input class="form-input" disabled="true" type="text" v-model="item.line"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="item.itemNo"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">éå®è®¢å:</label> <input class="form-input" disabled="true" type="text" v-model="item.caa015" /> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">客æ·:</label> <input class="form-input" disabled="true" type="text" v-model="item.cust" /> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa003"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa004"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">工忰é:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa008"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="item.fName"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£éªäºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.statusUser"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£æµç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="item.result"/> </view> </view> </view> </view> </template> </uni-list-item> </uni-list> <!-- éè¿ loadMore ç»ä»¶å®ç°ä¸æå è½½ææï¼å¦éèªå®ä¹æ¾ç¤ºå 容ï¼å¯åèï¼https://ext.dcloud.net.cn/plugin?id=29 --> <!-- <uni-load-more v-if="loading || options.status === 'noMore' " :status="options.status" /> --> <!-- <view class="fab" @click="handleFabClick"> <text class="fab-icon">+</text> </view> --> <view class="plus-button" @click="handleFabClick"> + </view> <!-- é¡¶é¨çéåº --> <view class="filter-section"> <view class="filter-controls"> <!-- æ¥è¯¢æ¡ä»¶éæ©å¨ --> <view class="dropdown-filter"> <picker @change="onOptionsChange" :value="optionsIndex" :range="options"> <view class="picker">{{options[optionsIndex]}}</view> </picker> </view> <view v-show="current===1"> <uni-list> <!-- to 屿§æºå¸¦åæ°è·³è½¬è¯¦æ 页é¢ï¼å½ååªä¸ºåè --> <uni-list-item style="margin-top: 10px;background-color: #EFEFF4;border-radius: 5px;" class="list-item" direction="column" v-for="item in data" :key="item.id" :to="'Add?id='+item.id+'&billNo='+item.billNo"> <!-- éè¿headerææ§½å®ä¹åè¡¨çæ é¢ --> <template v-slot:header> <view class="form-group uni-title" style="margin-bottom: 0;"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.billNo"/> </view> </template> <!-- éè¿bodyææ§½å®ä¹å表å 容æ¾ç¤º --> <template v-slot:body> <view style="margin-top: 0;"> <view class="uni-content"> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="item.statusDate"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">æ£éªç±»å:</label> <input class="form-input" disabled="true" type="text" v-model="item.SJ_MJ"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">产线:</label> <input class="form-input" disabled="true" type="text" v-model="item.line"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="item.itemNo"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">éå®è®¢å:</label> <input class="form-input" disabled="true" type="text" v-model="item.caa015" /> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">客æ·:</label> <input class="form-input" disabled="true" type="text" v-model="item.cust" /> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa003"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa004"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">工忰é:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa008"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="item.fName"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£éªäºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.statusUser"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£æµç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="item.result"/> </view> </view> </view> </view> </template> </uni-list-item> </uni-list> <!-- æç´¢æ¡ --> <view class="search-container"> <input class="search-input" v-model="searchValue" :placeholder="'请è¾å ¥'+options[optionsIndex]" @confirm="btnclicked" /> <button class="search-button" @click="btnclicked">æç´¢</button> </view> <!-- ç¶æåæ¢æ ç¾ --> <view class="status-tabs"> <button :class="['tab-button', current === 0 ? 'active' : '']" @click="onClickItem({currentIndex: 0})"> {{items[0]}} </button> <button :class="['tab-button', current === 1 ? 'active' : '']" @click="onClickItem({currentIndex: 1})"> {{items[1]}} </button> </view> </view> </view> <!-- æ£éªåå表 --> <view class="inspection-list"> <!-- æ£éªåå¡ç --> <view class="inspection-card" v-for="item in data" :key="item.id" @click="navigateToDetail(item)"> <view class="card-header"> <text class="badge normal" v-if="item.SJ_MJ">{{item.SJ_MJ}}</text> <text class="card-title">æ£éªåå·: {{item.billNo}}</text> <text class="status pass" v-if="item.result === 'åæ ¼'">åæ ¼</text> <text class="status unqualified" v-if="item.result === 'ä¸åæ ¼'">ä¸åæ ¼</text> <text class="status pending" v-if="!item.result">å¾ æ£éª</text> </view> <view class="card-body"> <view class="info-row"> <view class="info-item"> <text class="info-label">ç©æä¿¡æ¯</text> <text class="info-content">{{item.itemNo}}<br>{{item.daa003}}</text> </view> <view class="info-item"> <text class="info-label">è§æ ¼åå·</text> <text class="info-content">{{item.daa004}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">产线</text> <text class="info-content">{{item.line}}</text> </view> <view class="info-item"> <text class="info-label">工忰é</text> <text class="info-content highlight">{{item.daa008}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">éå®è®¢å</text> <text class="info-content">{{item.caa015}}</text> </view> <view class="info-item"> <text class="info-label">客æ·</text> <text class="info-content">{{item.cust}}</text> </view> </view> <view class="meta-info"> <text class="meta-item"> <uni-icons type="calendar" size="14" color="#95a5a6"></uni-icons> {{item.statusDate}} </text> <text class="meta-item"> <uni-icons type="person" size="14" color="#95a5a6"></uni-icons> å建人: {{item.fName}} </text> </view> <view class="meta-info" v-if="item.statusUser"> <text class="meta-item"> <uni-icons type="person" size="14" color="#95a5a6"></uni-icons> æ£éªäºº: {{item.statusUser}} </text> </view> </view> <view class="card-actions"> <button class="primary" @click.stop="navigateToDetail(item)"> {{current === 0 ? 'å¼å§æ£éª' : 'æ¥ç详æ '}} </button> </view> </view> </view> <!-- æ°å¢æé® --> <view class="plus-button" @click="handleFabClick"> + </view> </view> </template> @@ -252,7 +120,11 @@ current: 0, data: [], tipShow: false ,// æ¯å¦æ¾ç¤ºé¡¶é¨æç¤ºæ¡ searchValue:'' searchValue: '', // ===== æ°å¢æç´¢åè½ç¸å ³æ°æ® ===== optionsIndex: 0, // å½åéæ©çæ¥è¯¢æ¡ä»¶ç´¢å¼ options: ['å·¥å', 'æ£éªåå·', '产线', 'ç©æç¼ç ', 'ç©æåç§°'], // æ¥è¯¢æ¡ä»¶é项 selectedField: 'daa001' // å½åéæ©çæ¥è¯¢åæ®µï¼é»è®¤ä¸ºå·¥å }; }, onLoad() { @@ -260,20 +132,35 @@ this.init(); }, methods: { //æç´¢æ¡ç¹å»äºä»¶ btnclicked() { this.init(); }, // ===== æ°å¢æ¥è¯¢æ¡ä»¶éæ©æ¹æ³ ===== onOptionsChange(e) { this.optionsIndex = e.detail.value; // æ ¹æ®éæ©çé项设置æç´¢å段 const fieldMap = { 0: 'daa001', // å·¥å 1: 'billNo', // æ£éªåå· 2: 'line', // 产线 3: 'itemNo', // ç©æç¼ç 4: 'daa003' // ç©æåç§°(产ååç§°) }; this.selectedField = fieldMap[this.optionsIndex]; }, //æç´¢æ¡ç¹å»äºä»¶ btnclicked() { this.init(); }, init() { //è·åæç´¢æ¡ä»¶å 容 let SearchValue=this.searchValue; //è·åæç´¢æ¡ä»¶å 容 let SearchValue = this.searchValue; let result = "æªå®æ"; if (this.current === 1) { result = "已宿"; } // ===== ä¿®æ¹åçAPIè°ç¨ï¼æ·»å æç´¢åæ®µåæ° ===== //页é¢å è½½æ¶è°ç¨çäºä»¶ this.$post({ url: "/SJ/GetPage", @@ -282,7 +169,9 @@ limit: 20, statusUser: this.$loginInfo.account, result: result, SearchValue:SearchValue SearchValue: SearchValue, selectedIndex: this.optionsIndex, // æ°å¢ï¼æç´¢æ¡ä»¶ç´¢å¼ searchField: this.selectedField // æ°å¢ï¼æç´¢å段å } }).then(res => { this.data = res.data.tbBillList; @@ -298,6 +187,11 @@ this.current = index.currentIndex; this.init(); } }, navigateToDetail(item) { uni.navigateTo({ url: 'Add?id=' + item.id + '&billNo=' + item.billNo }); }, }, /** @@ -327,41 +221,225 @@ }; </script> <style lang="scss"> @import '@/common/uni-ui.scss'; .uni-note { margin-top: 0; <style scoped> /* åºç¡æ ·å¼éç½® */ .inspection-app { padding: 10px; background-color: #f5f7fa; min-height: 100vh; } /* Set the input backgrounds to be gray */ .form-input { background-color: #f2f2f2; /* Or any other shade of gray you prefer */ /* é¡¶é¨çéåº */ .filter-section { margin-bottom: 24px; } /* Ensure automatic adaptation based on page size */ .form-group { .filter-controls { display: flex; flex-wrap: wrap; gap: 10px; } /* æ¥è¯¢æ¡ä»¶éæ©å¨ */ .dropdown-filter { min-width: 80px; margin-right: 10px; } .picker { padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; min-width: 80px; } /* æç´¢æ¡æ ·å¼ */ .search-container { display: flex; flex: 1; margin-right: 10px; height: 36px; min-width: 200px; } .search-input { flex: 1; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px 0 0 4px; font-size: 14px; background-color: white; } .search-button { padding: 0 12px; border: 1px solid #3498db; border-radius: 0 4px 4px 0; background-color: #3498db; color: white; font-size: 14px; margin: 0; } .status-tabs { display: flex; border-radius: 4px; overflow: hidden; background-color: #ecf0f1; flex: 1; min-width: 200px; } .tab-button { padding: 0px 16px; border: none; background: none; font-size: 14px; transition: all 0.3s; margin: 0; height: 35px; flex: 1; } .tab-button.active { background-color: #3498db; color: white; } /* æ£éªåå表 */ .inspection-list { display: flex; flex-direction: column; gap: 20px; } /* æ£éªåå¡ç */ .inspection-card { background-color: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); overflow: hidden; transition: all 0.3s; } .card-header { padding: 16px; border-bottom: 1px solid #eee; display: flex; align-items: center; } .form-label { margin-bottom: 0; border-bottom: 1px solid #FFFFFF; padding: 5px; font-size: 12px; width: 60px; /* Adjust the font size as per your requirement */ .card-title { font-size: 16px; font-weight: 600; flex: 1; margin: 0 8px; } .form-input { flex: 1; margin-bottom: 0; border-bottom: 1px solid #c7c7c7; padding: 5px; .badge { font-size: 12px; background-color: #FFFFFF; /* Adjust the font size as per your requirement */ padding: 2px 6px; border-radius: 10px; margin-right: 8px; } .badge.normal { background-color: #3498db; color: white; } .status { font-size: 12px; padding: 4px 8px; border-radius: 4px; font-weight: 500; } .status.pending { background-color: #f39c12; color: white; } .status.pass { background-color: #00cd00; color: white; } .status.unqualified { background-color: #ff0000; color: white; } .card-body { padding: 16px; } .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; } .highlight { font-weight: 600; color: #2c3e50; font-size: 16px; } .meta-info { display: flex; gap: 16px; font-size: 12px; color: #95a5a6; margin-top: 12px; } .meta-item { display: flex; align-items: center; gap: 4px; } .card-actions { padding: 12px 16px; border-top: 1px solid #eee; display: flex; gap: 8px; } button { padding: 8px 16px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; transition: all 0.2s; flex: 1; } button.primary { background-color: #3498db; color: white; border-color: #2980b9; } .plus-button { @@ -371,7 +449,7 @@ width: 60px; height: 60px; border-radius: 50%; background-color: #007bff; background-color: #3498db; color: #ffffff; text-align: center; line-height: 59px; @@ -379,15 +457,6 @@ cursor: pointer; z-index: 1000; margin-bottom: 35px; } page { display: flex; flex-direction: column; box-sizing: border-box; background-color: #efeff4; min-height: 100%; height: auto; } .tips { @@ -408,81 +477,26 @@ opacity: 1; } .content { width: 100%; /* ååºå¼è®¾è®¡ */ @media (min-width: 768px) { .inspection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); } .info-row { flex-direction: row; } } .list-picture { width: 100%; height: 145px; } .thumb-image { width: 100%; height: 100%; } .ellipsis { display: flex; overflow: hidden; } .uni-ellipsis-1 { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .uni-ellipsis-2 { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } // æç´¢æ¡ .search-bar{ width: 100%; height: 80rpx; margin-top: 2%; } .search-bar-box{ display: flex; margin: 0 auto; width: 90vw; height: 60rpx; border:5rpx solid #00a8cc; border-radius: 50rpx; } .search-span{ width: 100rpx; height: 56rpx; margin-top: 6rpx; margin-left: 30rpx; } .search-text{ width: 100%; margin-top: 10rpx; margin-left: 20rpx; font-size: 30rpx; color: #7f7f81; } .search-btn{ background-color: #00a8cc; /* Green */ color: white; text-align: center; display: inline-block; font-size: 35rpx; width:100px; height: 60rpx; line-height: 65rpx; border-radius: 30rpx; letter-spacing: 3rpx; } uni-button{ margin: 0px; @media (min-width: 300px) { .inspection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); } .info-row { flex-direction: row; } } </style> pages/QC/SJ/detail.vue
@@ -1,126 +1,206 @@ <template> <view> <view class="form-container"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">项ç®åç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.projName"/> </view> <view class="form-group"> <label class="form-label">è´¨éè¦æ±:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemMod"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ¹æ³:</label> <input class="form-input" disabled="true" type="text" v-model="formData.inspectionMethod"/> </view> <view class="form-group"> <label class="form-label">使ç¨ä»ªè¡¨:</label> <input class="form-input" disabled="true" type="text" v-model="formData.usingInstruments"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.levelNum"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.minValue"/> </view> <view class="form-group"> <label class="form-label">æ åå¼:</label> <input class="form-input" disabled="true" type="text" v-model="formData.standardValue"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.maxValue"/> </view> <view class="form-group"> <label class="form-label">æ´æ°äºº:</label> <input class="form-input" disabled="true" type="text" v-model="formData.updater"/> </view> <view class="form-group"> <label class="form-label">æ´æ°æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="formData.updateTime"/> </view> <view class="form-group"> <label class="form-label">é¢è§ç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="formData.result"/> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks"/> </view> <view class="form-group edit"> <input class="form-input" style="color: red" disabled="true" type="text" value="没ææå¤§å¼åæå°å¼æ¶å¡«å0ï¼æªéè¿æ£éªï¼æ1ï¼éè¿æ£éªï¼"/> </view> <view class="form-group edit"> <label class="form-label">æ£æµç»æ:</label> <input class="form-input" type="number" v-model="formData.fcheckResu"/> </view> <button type="primary" v-if="tableData.length < formData.levelNum" @click="submit">ä¿å</button> </form> <view class="container"> <!-- å¤´é¨ --> <view class="header"> <view class="title">馿£é¡¹ç®æç»</view> <view class="order-number">馿£åå·: {{formData.billNo}}</view> </view> <view> <img v-if="isShowImg" :src="base64Image" style="width:100%" @click="previewImage"/> <!-- æ ç¾æ - 妿æå¤ä¸ªæ£éªé¡¹ç®å¯ä»¥åæ¢ --> <view class="tabs" v-if="tabs && tabs.length > 1"> <view v-for="(tab, index) in tabs" :key="index" class="tab" :class="{active: currentTab === index}" @tap="switchTab(index, tab.id)"> {{ tab.projName }} </view> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">ç¼å·</uni-th> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">å¤å®æ è¯</uni-th> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">æ£éªç»æ</uni-th> <uni-th width="150" align="center" style="color: #FFFFFF;background-color: lightskyblue;">ä¿®æ¹</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index"> <uni-td align="center"> {{ index + 1 }} </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.fstand"/> </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </uni-td> <uni-td> <view class="uni-group edit"> <button type="warn" v-if="isNumber" @click="toDetail(item)">ä¿®æ¹</button> <button type="warn" v-if="!isNumber" @click="numberEdit(item)">{{ editResult(item.fcheckResu) }}</button> <view class="tab-content"> <!-- åºæ¬ä¿¡æ¯ --> <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.projName }}</view> </view> </uni-td> </uni-tr> </uni-table> </view> <view class="plus-button"> <button type="warn" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> </view> <view v-if="remarksPopup" 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="remarks"/> <view class="info-item" v-if="formData.itemMod"> <view class="info-label">è´¨éè¦æ±</view> <view class="info-value">{{ formData.itemMod }}</view> </view> <view class="info-item" v-if="formData.inspectionMethod"> <view class="info-label">æ£éªæ¹æ³</view> <view class="info-value">{{ formData.inspectionMethod }}</view> </view> <view class="info-item" v-if="formData.usingInstruments"> <view class="info-label">使ç¨ä»ªè¡¨</view> <view class="info-value">{{ formData.usingInstruments }}</view> </view> <view class="info-item"> <view class="info-label">æ£éªæ°</view> <view class="info-value">{{ formData.levelNum }}</view> </view> <view class="info-item" v-if="formData.minValue"> <view class="info-label">ä¸é</view> <view class="info-value">{{ formData.minValue }}</view> </view> <view class="info-item" v-if="formData.standardValue"> <view class="info-label">æ åå¼</view> <view class="info-value">{{ formData.standardValue }}</view> </view> <view class="info-item" v-if="formData.maxValue"> <view class="info-label">ä¸é</view> <view class="info-value">{{ formData.maxValue }}</view> </view> <view class="info-item" v-if="formData.updater"> <view class="info-label">æ´æ°äºº</view> <view class="info-value">{{ formData.updater }}</view> </view> <view class="info-item" v-if="formData.updateTime"> <view class="info-label">æ´æ°æ¶é´</view> <view class="info-value">{{ formData.updateTime }}</view> </view> </view> <button type="warn" @click="editRemarks">ä¿®æ¹</button> <button @click="remarksPopup = !remarksPopup">åæ¶</button> </form> </view> </view> <!-- è§æ ¼è¦æ± --> <view class="section" v-if="formData.specRequ"> <view class="section-header">è§æ ¼è¦æ±</view> <view class="section-body"> <text class="spec-text">{{ formData.specRequ }}</text> </view> </view> <!-- æ£éªæè¿° --> <view class="section" v-if="formData.itemMod"> <view class="section-header">æ£éªæè¿°</view> <view class="section-body"> <text class="spec-text">{{ formData.itemMod }}</text> </view> </view> <!-- æ£éªç»æ --> <view class="section"> <view class="section-header">æ£éªç»æ</view> <view class="section-body"> <view class="info-grid"> <view class="info-item" v-if="formData.result"> <view class="info-label">é¢è§ç»æ</view> <view class="info-value">{{formData.result}}</view> </view> </view> <view v-if="formData.result != null" class="result-preview"> <view class="info-label">é¢è§ç»æ</view> <view class="info-value">{{formData.result}}</view> </view> <view v-if="formData.remarks != null" class="result-ng"> <view class="info-label">ä¸åæ ¼æè¿°</view> <view class="info-value danger">{{formData.remarks}}</view> </view> </view> </view> <!-- ç»æå½å ¥ --> <view class="section"> <view class="section-header">æ£éªç»æå½å ¥</view> <view class="section-body"> <view class="input-group"> <view class="input-wrapper"> <button class="btn upload-btn" @tap="saveRemarks"> <uni-icons type="compose" size="16" color="#fff"></uni-icons> ä¸åæ ¼æè¿° </button> <input v-if="tableData.length < formData.levelNum" v-model="formData.fcheckResu" type="text" class="result-input" placeholder="没ææå¤§å¼åæå°å¼æ¶å¡«å0ï¼æªéè¿æ£éªï¼æ1ï¼éè¿æ£éªï¼" placeholder-class="placeholder" /> <button v-if="(tableData.length < formData.levelNum)" style="margin: 0px;background-color: #3498db;color:#ffffff ;" class="btn primary-btn" @tap="submit">ä¿åç»æ</button> </view> </view> </view> </view> <!-- ç»æè¡¨æ ¼ --> <view v-if="tableData.length > 0" class="table-container"> <view class="table-header"> <view class="th">ç¼å·</view> <view class="th">æ£éªç»æ<i style="color: rgb(0 212 68);" v-if="!(tableData.length < formData.levelNum)">ï¼è¾å ¥å·²å®æï¼</i></view> <view class="th">æä½</view> </view> <view v-for="(item, index) in tableData" :key="index" class="table-row"> <view class="td">{{ index + 1 }}</view> <view class="td"> <view :class="['result-badge', getResultClass(item.fcheckResu, item.fstand)]"> {{ item.fcheckResu }} </view> </view> <view class="td"> <button v-if="!isNumber" class="btn danger-btn" @tap="numberEdit(item)"> {{ editResult(item.fcheckResu) }} </button> <button v-if="isNumber" class="btn danger-btn" @tap="toDetail(item)"> ä¿®æ¹ </button> </view> </view> </view> <!-- å¾çé¢è§ --> <view v-if="isShowImg" class="section"> <view class="section-header">ç¸å ³å¾ç</view> <view class="section-body"> <view class="image-preview" @click="previewImage"> <image :src="base64Image" mode="aspectFit" class="preview-image"/> </view> </view> </view> </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="showPopup" class="overlay"> <view class="popup"> <h3>ä¿®æ¹æ£éªç»æ</h3> <form :modelValue="editData"> <view class="form-group"> <label class="form-label">æ£éªç»æ:</label> <input class="form-input" type="text" v-model="editData.fcheckResu"/> <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="editData.fcheckResu" placeholder="请è¾å ¥æ£éªç»æ"/> </view> <button type="warn" @click="eidt">ä¿®æ¹</button> <button @click="showPopup = !showPopup">åæ¶</button> </form> </view> <view class="popup-actions"> <button class="action-btn primary" @click="eidt">ä¿®æ¹</button> <button class="action-btn secondary" @click="showPopup = !showPopup">åæ¶</button> </view> </view> </view> </view> @@ -143,9 +223,31 @@ isShowImg: false, remarks: "", remarksPopup: false, // ===== æ°å¢LLJæ ·å¼ç¸å ³æ°æ® ===== currentTab: 0, tabs: [] } }, methods: { getResultClass(fcheckResu, fstand) { // æ ¹æ®æ£éªç»æåå¤å®æ è¯ç¡®å®æ ·å¼ç±» if (fstand === 'â' || fcheckResu === 'OK') { return 'OK'; } else if (fstand === 'Ã' || fcheckResu === 'NG') { return 'NG'; } else { // å¯¹äºæ°åç»æï¼æ ¹æ®fstand夿 return fstand === 'â' ? 'OK' : 'NG'; } }, // ===== æ°å¢æ ç¾åæ¢æ¹æ³ ===== switchTab(index, id) { this.currentTab = index; // 妿éè¦åæ¢æ£éªé¡¹ç®ï¼å¯ä»¥å¨è¿éæ·»å é»è¾ // this.gid = id; // this.refreshResult(); }, previewImage() { uni.previewImage({ @@ -365,50 +467,258 @@ } </script> <style> <style lang="scss"> $primary-color: #409EFF; $success-color: #67C23A; $danger-color: #F56C6C; $border-color: #DCDFE6; $bg-color: #f5f7fa; .form-group { display: flex; align-items: center; border: 1px solid #c9c9c9; background-color: #d4d4d4; .container { padding: 20px; background-color: #fff; } .form-label { margin-bottom: 0; padding: 5px; } .header { padding: 20px; border-bottom: 1px solid $border-color; background: linear-gradient(90deg, #f0f7ff, #e1f0ff); .form-input { flex: 1; margin-bottom: 0; padding: 5px; } .title { font-size: 24px; color: #333; margin-bottom: 10px; } /* é»è®¤æ ·å¼ */ .list-container { height: calc(100vh - 750px); /* 设置å表容å¨çé«åº¦ä¸ºå©ä½ç©ºé´ï¼å¹¶åå»è¡¨å容å¨çé«åº¦ */ overflow-y: auto; /* å 许å表容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿å表å 容æ´ç¾è§ */ } /* å¨å°å±å¹è®¾å¤ä¸ï¼éç½®é«åº¦ä¸ºéåºå±å¹ */ @media (max-width: 768px) { .list-container { height: calc(100vh - 485px); /* éå½è°æ´é«åº¦ */ .order-number { color: #666; font-size: 14px; } } .form-container { /* 设置表å容å¨çé«åº¦ï¼ä½¿å ¶å¯ä»¥æ»å¨ */ overflow-y: auto; /* å 许表å容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿è¡¨åå 容æ´ç¾è§ */ .tabs { display: flex; background-color: $bg-color; border-bottom: 1px solid $border-color; .tab { flex: 1; text-align: center; padding: 12px 0; border-right: 1px solid $border-color; color: #666; transition: all 0.3s; &:last-child { border-right: none; } &.active { background-color: #fff; color: $primary-color; font-weight: bold; position: relative; &::after { content: ''; position: absolute; bottom: 0; left: 0; right: 0; height: 2px; background-color: $primary-color; } } } } .section { margin: 20px 0; border: 1px solid $border-color; border-radius: 4px; &-header { padding: 12px 16px; background-color: $bg-color; border-bottom: 1px solid $border-color; font-weight: bold; } &-body { padding: 16px; } } .info-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; .info-item { margin-bottom: 12px; .info-label { color: #909399; font-size: 14px; margin-bottom: 4px; } .info-value { color: #333; font-weight: 500; } } } .input-group { margin: 16px 0; .input-wrapper { display: flex; gap: 12px; .result-input { flex: 1; height: 45px; padding: 0 12px; border: 1px solid $border-color; border-radius: 4px; font-size: 14px; } .upload-btn { background-color: #909399; color: #fff; padding: 0 10px; margin: 0; } } } .table-container { border: 1px solid $border-color; border-radius: 4px; margin-top: 20px; .table-header { display: flex; background-color: $bg-color; border-bottom: 1px solid $border-color; .th { flex: 1; padding: 12px; font-weight: bold; } } .table-row { display: flex; border-bottom: 1px solid $border-color; padding: 12px; &:last-child { border-bottom: none; } .td { flex: 1; display: flex; align-items: center; } } } .result-badge { display: inline-block; padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: bold; &.OK { background-color: rgba($success-color, 0.1); color: $success-color; } &.NG { background-color: rgba($danger-color, 0.1); color: $danger-color; } } .spec-text { font-size: 14px; color: #333; line-height: 1.5; } .result-preview { margin: 16px 0; padding: 12px; background-color: #f8f9fa; border-radius: 4px; display: flex; align-items: center; gap: 12px; .info-label { color: #909399; font-size: 14px; min-width: 80px; } .info-value { color: #333; font-weight: 500; } } .result-ng { margin: 16px 0; padding: 12px; background-color: rgba($danger-color, 0.1); border-radius: 4px; display: flex; align-items: center; gap: 12px; .info-label { color: $danger-color; font-size: 14px; min-width: 80px; } .info-value { color: $danger-color; font-weight: 500; } } .action-buttons { margin-top: 20px; display: flex; justify-content: flex-end; gap: 12px; .btn { padding: 8px 20px; border-radius: 4px; &.primary-btn { background-color: $primary-color; color: #fff; } &.cancel-btn { background-color: #909399; color: #fff; } } } .danger { color: $danger-color; } .overlay { @@ -421,6 +731,7 @@ display: flex; justify-content: center; align-items: center; z-index: 1000; } .popup { @@ -428,11 +739,101 @@ padding: 20px; border: 1px solid #ccc; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 68vw; /* 设置宽度为è§å£å®½åº¦ç80% */ height: 25vh; /* 设置é«åº¦ä¸ºè§å£é«åº¦ç80% */ width: 68vw; height: 25vh; border-radius: 8px; } .edit { background-color: white; .popup-header { padding: 20px; border-bottom: 1px solid #eee; h3 { font-size: 18px; font-weight: 600; color: #2c3e50; margin: 0; } } .popup-content { padding: 20px; .input-group { margin-bottom: 15px; .input-label { font-size: 14px; color: #7f8c8d; margin-right: 10px; min-width: 80px; } .input-field { flex: 1; 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; .action-btn { padding: 12px 20px; border: none; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s; &.primary { background-color: #3498db; color: white; } &.secondary { background-color: #95a5a6; color: white; } } } /* å¾çé¢è§ */ .image-preview { text-align: center; cursor: pointer; } .preview-image { max-width: 100%; max-height: 300px; border-radius: 4px; border: 1px solid #ddd; } /* ååºå¼è®¾è®¡ */ @media (max-width: 768px) { .info-grid { grid-template-columns: 1fr; } .input-group { flex-direction: column; align-items: flex-start; } .input-label { margin-bottom: 5px; } } </style> pages/QC/XJ/Add.vue
@@ -1,121 +1,136 @@ <template> <view> <view class="form-container"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.releaseNo"/> </view> <view class="form-group"> <label class="form-label">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="formData.createBy"/> </view> <view class="form-group"> <label class="form-label">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="formData.createDate"/> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">线ä½ç¼å·:</text> <picker v-if="isUpdate" class="picker form-input" name="selector" :range="DAA020List" @change="onDaa020Change"> <text>{{ DAA020List[DAA020Index] }}</text> </picker> <input v-else class="form-input" disabled="true" type="text" v-model="formData.daa020"/> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">ç©æç¼ç :</text> <picker v-if="isUpdate" class="picker form-input" name="selector" :range="ItemList" @change="onItemChange"> <text>{{ ItemList[ItemIndex] }}</text> </picker> <input v-else class="form-input" disabled="true" type="text" v-model="formData.itemNo"/> </view> <view class="uni-form-item uni-column form-item edit"> <text class="form-label">计åç¼å·:</text> <picker v-if="isUpdate" class="picker form-input" name="selector" :range="DAA001List" @change="onDaa001Change"> <text>{{ DAA001List[DAA001Index] }}</text> </picker> <input v-else class="form-input" disabled="true" type="text" v-model="formData.billNo"/> </view> <view class="form-group"> <label class="form-label">ç©æåç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemName"/> </view> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemModel"/> </view> <view class="form-group"> <label class="form-label">工忰é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.planQty"/> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks"/> </view> </form> <view class="container"> <!-- å¤´é¨ --> <view class="header"> <view class="title">å·¡æ£é¡¹ç®æç»</view> <view class="order-number">å·¡æ£åå·: {{formData.releaseNo}}</view> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" class="th" style="color: #FFFFFF;">æ£éªé¡¹ç®</uni-th> <uni-th align="center" class="th" style="color: #FFFFFF">æ¯å¦åæ ¼</uni-th> <uni-th align="center" class="th" style="color: #FFFFFF">è®°å½(ç¹å»)</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index"> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.projName"/> </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.result"/> </uni-td> <uni-td> <view class="uni-group"> <button v-if="item.isCheck >=item.levelNum" type="default" @click="toDetail(item)"> {{ item.levelNum + '/' + item.isCheck }} </button> <button v-else type="warn" @click="toDetail(item)"> {{ item.levelNum + '/' + item.isCheck }} </button> </view> </uni-td> </uni-tr> </uni-table> <!-- åºæ¬ä¿¡æ¯ --> <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> </view> </view> </view> <view class="plus-button"> <button type="warn" v-if="isUpdate && !isShowTable" @click="getItem">å建æ£éªåå¹¶çæé¨åé»è®¤å¼</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable" @click="toImage">ä¸ä¼ /æ¥çå¾ç</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !formData.fcheckResu && !isShowTable" @click="removeXJ">å é¤åæ®</button> </view> <view class="plus-button"> <button type="warn" v-if="!isUpdate && !isShowTable" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> <!-- æ£éªé¡¹ç® --> <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="plus-button"> <button type="warn" v-if="isShowTable" @click="getTable">è·åæ£éªé¡¹ç®</button> <!-- æä½æé® --> <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 class="plus-button"> <button type="warn" v-if="isShowTable && isUpdate" @click="saveTable">çææ£éªé¡¹ç®</button> </view> <!-- ä¿®æ¹ä¸åæ ¼æè¿°å¼¹åºæ¡ --> <view v-if="remarksPopup" 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="remarks"/> <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> <button type="warn" @click="editRemarks">ä¿®æ¹</button> <button @click="remarksPopup = !remarksPopup">åæ¶</button> </form> </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> @@ -202,6 +217,27 @@ } }, 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({ @@ -454,65 +490,242 @@ } }; </script> <style> .form-group { display: flex; align-items: center; border-bottom: 1px solid #c9c9c9; <style scoped> /* åºç¡æ ·å¼ */ .container { padding: 10px; background-color: #f5f7fa; min-height: 100vh; } .form-label { margin-bottom: 0; padding: 5px; } .form-input { flex: 1; margin-bottom: 0; padding: 5px; } .picker { flex: 1; margin-bottom: 0; padding: 5px; font-size: 12px; } .uni-form-item { display: flex; border-bottom: 1px solid #c9c9c9; } .edit { /* 头鍿 ·å¼ */ .header { background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); margin-bottom: 20px; } /* é»è®¤æ ·å¼ */ .list-container { height: 60vh; /* 设置å表容å¨çé«åº¦ä¸ºå©ä½ç©ºé´ï¼å¹¶åå»è¡¨å容å¨çé«åº¦ */ overflow-y: auto; /* å 许å表容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿å表å 容æ´ç¾è§ */ .title { font-size: 20px; font-weight: 600; color: #2c3e50; margin-bottom: 8px; } /* å¨å°å±å¹è®¾å¤ä¸ï¼éç½®é«åº¦ä¸ºéåºå±å¹ */ @media (max-width: 768px) { .list-container { height: calc(100vh - 376px); /* éå½è°æ´é«åº¦ */ } .order-number { font-size: 14px; color: #3498db; font-weight: 500; } .form-container { padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿è¡¨åå 容æ´ç¾è§ */ /* åºåæ ·å¼ */ .section { background-color: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); margin-bottom: 20px; overflow: hidden; } .th { background-color: lightskyblue; color: #FFFFFF; .section-header { background-color: #f8f9fa; padding: 15px 20px; border-bottom: 1px solid #eee; font-size: 16px; font-weight: 600; color: #2c3e50; } .plus-button { line-height: 59px; font-size: 24px; .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; z-index: 1000; margin-bottom: 10px; } .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; @@ -523,15 +736,71 @@ display: flex; justify-content: center; align-items: center; z-index: 1000; } .popup { background-color: #fff; 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: 1px solid #ccc; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 68vw; /* 设置宽度为è§å£å®½åº¦ç80% */ height: 25vh; /* 设置é«åº¦ä¸ºè§å£é«åº¦ç80% */ 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; } .action-buttons { flex-direction: column; } } </style> pages/QC/XJ/List.vue
@@ -1,187 +1,91 @@ <template> <view> <view class="inspection-app"> <!-- å·æ°é¡µé¢åçé¡¶é¨æç¤ºæ¡ --> <view class="tips" :class="{ 'tips-ani': tipShow }">å·æ°æå</view> <view class="newsTab"> <uni-segmented-control :current="current" :values="items" @clickItem="onClickItem" style-type="button" active-color="#87cefa" ></uni-segmented-control> <view class="content"> <view v-show="current===0"> <!-- åºäº uni-list ç页é¢å¸å± --> <uni-list> <!-- to 屿§æºå¸¦åæ°è·³è½¬è¯¦æ 页é¢ï¼å½ååªä¸ºåè --> <uni-list-item style="margin-top: 10px;background-color:#EFEFF4;border-radius: 5px;" class="list-item" direction="column" v-for="item in data" :key="item.id" :to="'Add?id='+item.id+'&releaseNo='+item.releaseNo"> <!-- éè¿headerææ§½å®ä¹åè¡¨çæ é¢ --> <template v-slot:header> <view class="form-group uni-title" style="margin-bottom: 0;"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.releaseNo"/> </view> </template> <!-- éè¿bodyææ§½å®ä¹å表å 容æ¾ç¤º --> <template v-slot:body> <view style="margin-top: 0;"> <view class="uni-content"> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="item.createDate"/> </view> </view> <view class="uni-note" > <view class="form-group"> <label class="form-label lab">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="item.createBy"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">产线:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa020"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="item.itemNo"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">ç©æåç§°:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemName"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemModel"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">工忰é:</label> <input class="form-input" disabled="true" type="text" v-model="item.planQty"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£éªäºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckBy"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£æµç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </view> </view> </view> </view> </template> </uni-list-item> </uni-list> <!-- éè¿ loadMore ç»ä»¶å®ç°ä¸æå è½½ææï¼å¦éèªå®ä¹æ¾ç¤ºå 容ï¼å¯åèï¼https://ext.dcloud.net.cn/plugin?id=29 --> <!-- <uni-load-more v-if="loading || options.status === 'noMore' " :status="options.status" /> --> <!-- <view class="fab" @click="handleFabClick"> <text class="fab-icon">+</text> </view> --> <view class="plus-button" @click="handleFabClick"> + </view> </view> <view v-show="current===1"> <uni-list> <!-- to 屿§æºå¸¦åæ°è·³è½¬è¯¦æ 页é¢ï¼å½ååªä¸ºåè --> <uni-list-item style="margin-top: 10px;background-color:#EFEFF4;border-radius:5px;" class="list-item" direction="column" v-for="item in data" :key="item.id" :to="'Add?id='+item.id+'&releaseNo='+item.releaseNo"> <!-- éè¿headerææ§½å®ä¹åè¡¨çæ é¢ --> <template v-slot:header> <view class="form-group uni-title" style="margin-bottom: 0;"> <label class="form-label">æ£éªåå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.releaseNo"/> </view> </template> <!-- éè¿bodyææ§½å®ä¹å表å 容æ¾ç¤º --> <template v-slot:body> <view style="margin-top: 0;"> <view class="uni-content"> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">å建æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="item.createDate"/> </view> </view> <view class="uni-note" > <view class="form-group"> <label class="form-label lab">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="item.createBy"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">产线:</label> <input class="form-input" disabled="true" type="text" v-model="item.daa020"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label lab">ç©æç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="item.itemNo"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">ç©æåç§°:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemName"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">è§æ ¼åå·:</label> <input class="form-input" disabled="true" type="text" v-model="item.itemModel"/> </view> </view> <view class="uni-title-sub uni-ellipsis-2"> <view class="form-group"> <label class="form-label">工忰é:</label> <input class="form-input" disabled="true" type="text" v-model="item.planQty"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£éªäºº:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckBy"/> </view> </view> <view class="uni-note" style="color: red"> <view class="form-group"> <label class="form-label lab">æ£æµç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </view> </view> </view> </view> </template> </uni-list-item> </uni-list> <!-- é¡¶é¨çéåº --> <view class="filter-section"> <view class="filter-controls"> <!-- ç¶æåæ¢æ ç¾ --> <view class="status-tabs"> <button :class="['tab-button', current === 0 ? 'active' : '']" @click="onClickItem({currentIndex: 0})"> {{items[0]}} </button> <button :class="['tab-button', current === 1 ? 'active' : '']" @click="onClickItem({currentIndex: 1})"> {{items[1]}} </button> </view> </view> </view> <!-- æ£éªåå表 --> <view class="inspection-list"> <!-- æ£éªåå¡ç --> <view class="inspection-card" v-for="item in data" :key="item.id" @click="navigateToDetail(item)"> <view class="card-header"> <text class="card-title">æ£éªåå·: {{item.releaseNo}}</text> <text class="status pass" v-if="item.fcheckResu === 'åæ ¼'">åæ ¼</text> <text class="status unqualified" v-if="item.fcheckResu === 'ä¸åæ ¼'">ä¸åæ ¼</text> <text class="status pending" v-if="!item.fcheckResu">å¾ æ£éª</text> </view> <view class="card-body"> <view class="info-row"> <view class="info-item"> <text class="info-label">ç©æä¿¡æ¯</text> <text class="info-content">{{item.itemNo}}<br>{{item.itemName}}</text> </view> <view class="info-item"> <text class="info-label">è§æ ¼åå·</text> <text class="info-content">{{item.itemModel}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">产线</text> <text class="info-content">{{item.daa020}}</text> </view> <view class="info-item"> <text class="info-label">工忰é</text> <text class="info-content highlight">{{item.planQty}}</text> </view> </view> <view class="info-row"> <view class="info-item"> <text class="info-label">æ£éªäºº</text> <text class="info-content">{{item.fcheckBy}}</text> </view> <view class="info-item"> <text class="info-label">å建人</text> <text class="info-content">{{item.createBy}}</text> </view> </view> <view class="meta-info"> <text class="meta-item"> <uni-icons type="calendar" size="14" color="#95a5a6"></uni-icons> {{item.createDate}} </text> <text class="meta-item" v-if="item.fcheckResu"> <uni-icons type="checkmarkempty" size="14" color="#95a5a6"></uni-icons> æ£æµç»æ: {{item.fcheckResu}} </text> </view> </view> <view class="card-actions"> <button class="primary" @click.stop="navigateToDetail(item)"> {{current === 0 ? 'å¼å§æ£éª' : 'æ¥ç详æ '}} </button> </view> </view> </view> <!-- æ°å¢æé® --> <view class="plus-button" @click="handleFabClick"> + </view> </view> </template> @@ -233,6 +137,11 @@ this.init(); } }, navigateToDetail(item) { uni.navigateTo({ url: 'Add?id=' + item.id + '&releaseNo=' + item.releaseNo }); }, }, /** * 䏿巿°åè°å½æ° @@ -261,41 +170,169 @@ }; </script> <style lang="scss"> @import '@/common/uni-ui.scss'; .uni-note { margin-top: 0; <style scoped> /* åºç¡æ ·å¼éç½® */ .inspection-app { padding: 10px; background-color: #f5f7fa; min-height: 100vh; } /* Set the input backgrounds to be gray */ .form-input { background-color: #f2f2f2; /* Or any other shade of gray you prefer */ /* é¡¶é¨çéåº */ .filter-section { margin-bottom: 24px; } /* Ensure automatic adaptation based on page size */ .form-group { .filter-controls { display: flex; justify-content: center; align-items: center; } .status-tabs { display: flex; border-radius: 4px; overflow: hidden; background-color: #ecf0f1; width: 300px; } .tab-button { padding: 0px 16px; border: none; background: none; font-size: 14px; transition: all 0.3s; margin: 0; height: 35px; flex: 1; } .tab-button.active { background-color: #3498db; color: white; } /* æ£éªåå表 */ .inspection-list { display: flex; flex-direction: column; gap: 20px; } /* æ£éªåå¡ç */ .inspection-card { background-color: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); overflow: hidden; transition: all 0.3s; } .card-header { padding: 16px; border-bottom: 1px solid #eee; display: flex; align-items: center; } .form-label { margin-bottom: 0; border-bottom: 1px solid #FFFFFF; padding: 5px; font-size: 12px; width: 60px; /* Adjust the font size as per your requirement */ .card-title { font-size: 16px; font-weight: 600; flex: 1; margin: 0 8px; } .form-input { flex: 1; margin-bottom: 0; border-bottom: 1px solid #c7c7c7; padding: 5px; .status { font-size: 12px; background-color: #FFFFFF; /* Adjust the font size as per your requirement */ padding: 4px 8px; border-radius: 4px; font-weight: 500; } .status.pending { background-color: #f39c12; color: white; } .status.pass { background-color: #00cd00; color: white; } .status.unqualified { background-color: #ff0000; color: white; } .card-body { padding: 16px; } .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; } .highlight { font-weight: 600; color: #2c3e50; font-size: 16px; } .meta-info { display: flex; gap: 16px; font-size: 12px; color: #95a5a6; margin-top: 12px; } .meta-item { display: flex; align-items: center; gap: 4px; } .card-actions { padding: 12px 16px; border-top: 1px solid #eee; display: flex; gap: 8px; } button { padding: 8px 16px; border: 1px solid #ddd; border-radius: 4px; background-color: white; font-size: 14px; transition: all 0.2s; flex: 1; } button.primary { background-color: #3498db; color: white; border-color: #2980b9; } .plus-button { @@ -305,7 +342,7 @@ width: 60px; height: 60px; border-radius: 50%; background-color: #007bff; background-color: #3498db; color: #ffffff; text-align: center; line-height: 59px; @@ -313,15 +350,6 @@ cursor: pointer; z-index: 1000; margin-bottom: 35px; } page { display: flex; flex-direction: column; box-sizing: border-box; background-color: #efeff4; min-height: 100%; height: auto; } .tips { @@ -342,36 +370,26 @@ opacity: 1; } .content { width: 100%; /* ååºå¼è®¾è®¡ */ @media (min-width: 768px) { .inspection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); } .info-row { flex-direction: row; } } .list-picture { width: 100%; height: 145px; } .thumb-image { width: 100%; height: 100%; } .ellipsis { display: flex; overflow: hidden; } .uni-ellipsis-1 { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .uni-ellipsis-2 { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; @media (min-width: 300px) { .inspection-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); } .info-row { flex-direction: row; } } </style> pages/QC/XJ/detail.vue
@@ -1,128 +1,182 @@ <template> <view> <view class="form-container"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">项ç®åç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.projName"/> </view> <view class="form-group"> <label class="form-label">è´¨éè¦æ±:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemMod"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ¹æ³:</label> <input class="form-input" disabled="true" type="text" v-model="formData.inspectionMethod"/> </view> <view class="form-group"> <label class="form-label">使ç¨ä»ªè¡¨:</label> <input class="form-input" disabled="true" type="text" v-model="formData.usingInstruments"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.levelNum"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.minValue"/> </view> <view class="form-group"> <label class="form-label">æ åå¼:</label> <input class="form-input" disabled="true" type="text" v-model="formData.standardValue"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.maxValue"/> </view> <view class="form-group"> <label class="form-label">æ´æ°äºº:</label> <input class="form-input" disabled="true" type="text" v-model="formData.updater"/> </view> <view class="form-group"> <label class="form-label">æ´æ°æ¶é´:</label> <input class="form-input" disabled="true" type="text" v-model="formData.updateTime"/> </view> <view class="form-group"> <label class="form-label">é¢è§ç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="formData.result"/> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks"/> </view> <view class="form-group edit"> <input class="form-input" style="color: red" disabled="true" type="text" value="没ææå¤§å¼åæå°å¼æ¶å¡«å0ï¼æªéè¿æ£éªï¼æ1ï¼éè¿æ£éªï¼"/> </view> <view class="form-group edit"> <label class="form-label">æ£æµç»æ:</label> <input class="form-input" type="number" v-model="formData.fcheckResu"/> </view> <button type="primary" v-if="tableData.length < formData.levelNum" @click="submit">ä¿å</button> </form> </view> <view> <img v-if="isShowImg" :src="base64Image" style="width:100%" @click="previewImage"/> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">ç¼å·</uni-th> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">å¤å®æ è¯</uni-th> <uni-th align="center" style="color: #FFFFFF;background-color: lightskyblue;">æ£éªç»æ</uni-th> <uni-th width="150" align="center" style="color: #FFFFFF;background-color: lightskyblue;">ä¿®æ¹ </uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index"> <uni-td align="center"> {{ index + 1 }} </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.fstand"/> </uni-td> <uni-td align="center"> <input class="form-input" disabled="true" type="text" v-model="item.fcheckResu"/> </uni-td> <uni-td> <view class="uni-group"> <button type="warn" v-if="isNumber" @click="toDetail(item)">ä¿®æ¹</button> <button type="warn" v-if="!isNumber" @click="numberEdit(item)">{{ editResult(item.fcheckResu) }}</button> </view> </uni-td> </uni-tr> </uni-table> <view class="container"> <!-- å¤´é¨ --> <view class="header"> <view class="title">å·¡æ£é¡¹ç®æç»</view> <view class="order-number">å·¡æ£åå·: {{billNo}}</view> </view> <view class="plus-button"> <button type="warn" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</button> </view> <view v-if="remarksPopup" 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="remarks"/> <!-- åºæ¬ä¿¡æ¯ --> <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.projName }}</view> </view> <button type="warn" @click="editRemarks">ä¿®æ¹</button> <button @click="remarksPopup = !remarksPopup">åæ¶</button> </form> <view class="info-item" v-if="formData.itemMod"> <view class="info-label">è´¨éè¦æ±</view> <view class="info-value">{{ formData.itemMod }}</view> </view> <view class="info-item" v-if="formData.inspectionMethod"> <view class="info-label">æ£éªæ¹æ³</view> <view class="info-value">{{ formData.inspectionMethod }}</view> </view> <view class="info-item" v-if="formData.usingInstruments"> <view class="info-label">使ç¨ä»ªè¡¨</view> <view class="info-value">{{ formData.usingInstruments }}</view> </view> <view class="info-item"> <view class="info-label">æ£éªæ°</view> <view class="info-value">{{ formData.levelNum }}</view> </view> <view class="info-item" v-if="formData.minValue"> <view class="info-label">ä¸é</view> <view class="info-value">{{ formData.minValue }}</view> </view> <view class="info-item" v-if="formData.standardValue"> <view class="info-label">æ åå¼</view> <view class="info-value">{{ formData.standardValue }}</view> </view> <view class="info-item" v-if="formData.maxValue"> <view class="info-label">ä¸é</view> <view class="info-value">{{ formData.maxValue }}</view> </view> <view class="info-item" v-if="formData.updater"> <view class="info-label">æ´æ°äºº</view> <view class="info-value">{{ formData.updater }}</view> </view> <view class="info-item" v-if="formData.updateTime"> <view class="info-label">æ´æ°æ¶é´</view> <view class="info-value">{{ formData.updateTime }}</view> </view> </view> </view> </view> <!-- æ£éªç»æ --> <view class="section"> <view class="section-header">æ£éªç»æ</view> <view class="section-body"> <view class="info-grid"> <view class="info-item" v-if="formData.result"> <view class="info-label">é¢è§ç»æ</view> <view class="info-value">{{formData.result}}</view> </view> </view> <view v-if="formData.result != null" class="result-preview"> <view class="info-label">é¢è§ç»æ</view> <view class="info-value">{{formData.result}}</view> </view> <view v-if="formData.remarks != null" class="result-ng"> <view class="info-label">ä¸åæ ¼æè¿°</view> <view class="info-value danger">{{formData.remarks}}</view> </view> </view> </view> <!-- ç»æå½å ¥ --> <view class="section"> <view class="section-header">æ£éªç»æå½å ¥</view> <view class="section-body"> <view class="inspection-hint"> <view class="hint-text">没ææå¤§å¼åæå°å¼æ¶å¡«å0ï¼æªéè¿æ£éªï¼æ1ï¼éè¿æ£éªï¼</view> </view> <view class="input-group"> <view class="input-wrapper"> <input v-if="tableData.length < formData.levelNum" v-model="formData.fcheckResu" type="number" class="result-input" placeholder="请è¾å ¥æ£éªç»æ" placeholder-class="placeholder" /> <button v-if="(tableData.length < formData.levelNum)" style="margin: 0px;background-color: #3498db;color:#ffffff ;" class="btn primary-btn" @click="submit">ä¿åç»æ</button> </view> </view> </view> </view> <!-- å¾çé¢è§ --> <view v-if="isShowImg" class="section"> <view class="section-header">ç¸å ³å¾ç</view> <view class="section-body"> <view class="image-preview" @click="previewImage"> <image :src="base64Image" mode="aspectFit" class="preview-image"/> </view> </view> </view> <!-- ç»æè¡¨æ ¼ --> <view v-if="tableData.length > 0" class="table-container"> <view class="table-header"> <view class="th">ç¼å·</view> <view class="th">æ£éªç»æ<i style="color: rgb(0 212 68);" v-if="!(tableData.length < formData.levelNum)">(è¾å ¥å·²å®æ)</i></view> <view class="th">æä½</view> </view> <view v-for="(item, index) in tableData" :key="index" class="table-row"> <view class="td">{{ index + 1 }}</view> <view class="td"> <view :class="['result-badge', item.fstand === 'â' ? 'OK' : 'NG']"> {{ item.fcheckResu }} </view> </view> <view class="td"> <button v-if="!isNumber" class="btn danger-btn" @click="numberEdit(item)"> {{ editResult(item.fcheckResu) }} </button> <button v-if="isNumber" class="btn danger-btn" @click="toDetail(item)"> ä¿®æ¹ </button> </view> </view> </view> <!-- æä½æé® --> <view class="action-buttons"> <button class="action-btn warning" @click="saveRemarks">æ·»å ä¸åæ ¼æè¿°</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="showPopup" class="overlay"> <view class="popup"> <h3>ä¿®æ¹æ£éªç»æ</h3> <form :modelValue="editData"> <view class="form-group"> <label class="form-label">æ£éªç»æ:</label> <input class="form-input" type="text" v-model="editData.fcheckResu"/> <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="editData.fcheckResu" placeholder="请è¾å ¥æ£éªç»æ"/> </view> <button type="warn" @click="eidt">ä¿®æ¹</button> <button @click="showPopup = !showPopup">åæ¶</button> </form> </view> <view class="popup-actions"> <button class="action-btn primary" @click="eidt">ä¿®æ¹</button> <button class="action-btn secondary" @click="showPopup = !showPopup">åæ¶</button> </view> </view> </view> </view> @@ -148,6 +202,12 @@ } }, methods: { getResultClass(result) { if (result === 'åæ ¼') return 'result-pass'; if (result === 'ä¸åæ ¼') return 'result-fail'; return 'result-pending'; }, previewImage() { uni.previewImage({ @@ -362,51 +422,266 @@ } </script> <style> .form-group { <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.danger { color: #e74c3c; font-weight: 500; } /* ç»æå¿½ç« */ .result-badge { padding: 4px 8px; border-radius: 4px; font-size: 12px; font-weight: 500; display: inline-block; width: fit-content; } .result-badge.OK { background-color: #d4edda; color: #155724; } .result-badge.NG { background-color: #f8d7da; color: #721c24; } /* æ£éªè¾å ¥åº */ .inspection-hint { background-color: #fff3cd; padding: 10px; border-radius: 4px; margin-bottom: 15px; } .hint-text { font-size: 12px; color: #856404; } .input-group { display: flex; align-items: center; border: 1px solid #c9c9c9; background-color: #d4d4d4; margin-bottom: 15px; } .form-label { margin-bottom: 0; padding: 5px; .input-wrapper { display: flex; gap: 12px; width: 100%; } .form-input { .result-input { flex: 1; margin-bottom: 0; padding: 5px; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; background-color: white; } /* é»è®¤æ ·å¼ */ .list-container { height: calc(100vh - 750px); /* 设置å表容å¨çé«åº¦ä¸ºå©ä½ç©ºé´ï¼å¹¶åå»è¡¨å容å¨çé«åº¦ */ overflow-y: auto; /* å 许å表容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿å表å 容æ´ç¾è§ */ .btn { padding: 8px 16px; border: none; border-radius: 4px; font-size: 14px; cursor: pointer; transition: all 0.2s; } /* å¨å°å±å¹è®¾å¤ä¸ï¼éç½®é«åº¦ä¸ºéåºå±å¹ */ @media (max-width: 768px) { .list-container { height: calc(100vh - 485px); /* éå½è°æ´é«åº¦ */ } .btn.primary-btn { background-color: #3498db; color: white; } .form-container { /* 设置表å容å¨çé«åº¦ï¼ä½¿å ¶å¯ä»¥æ»å¨ */ overflow-y: auto; /* å 许表å容å¨åç´æ»å¨ */ padding: 10px; /* å¯éï¼æ·»å ä¸äºå è¾¹è·ï¼ä½¿è¡¨åå 容æ´ç¾è§ */ .btn.danger-btn { background-color: #e74c3c; color: white; } /* å¾çé¢è§ */ .image-preview { text-align: center; cursor: pointer; } .preview-image { max-width: 100%; max-height: 300px; border-radius: 4px; border: 1px solid #ddd; } /* ç»æé¢è§ */ .result-preview { margin: 16px 0; padding: 12px; background-color: #f8f9fa; border-radius: 4px; display: flex; align-items: center; gap: 12px; } .result-ng { margin: 16px 0; padding: 12px; background-color: #f8d7da; border-radius: 4px; display: flex; align-items: center; gap: 12px; } /* è¡¨æ ¼å®¹å¨ */ .table-container { border: 1px solid #ddd; border-radius: 4px; margin-top: 20px; overflow: hidden; } .table-header { display: flex; background-color: #3498db; color: white; } .th { flex: 1; padding: 12px; font-weight: bold; text-align: center; } .table-row { display: flex; border-bottom: 1px solid #eee; padding: 12px; } .table-row:last-child { border-bottom: none; } .td { flex: 1; display: flex; align-items: center; justify-content: center; } /* æä½æé® */ .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.warning { background-color: #f39c12; color: white; } /* å¼¹åºæ¡æ ·å¼ */ .overlay { position: fixed; top: 0; @@ -417,20 +692,81 @@ display: flex; justify-content: center; align-items: center; z-index: 1000; } .popup { background-color: #fff; padding: 20px; border: 1px solid #ccc; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); width: 68vw; /* 设置宽度为è§å£å®½åº¦ç80% */ height: 25vh; /* 设置é«åº¦ä¸ºè§å£é«åº¦ç80% */ 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; } .edit { .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; } .input-wrapper { flex-direction: column; } .table-row { flex-direction: column; text-align: center; } .td { justify-content: center; margin-bottom: 8px; } } </style> store/index.js
@@ -10,9 +10,9 @@ networkFlag:'å ç½', serverURLInt:'http://192.168.11.251:10055',//æå¡å¨ä½æ£ 10.0.1.104:10054 serverURL:'http://localhost:10055',//æ¬å°è°è¯å°å serverAPI:'http://localhost:5184/api',//å½åæ£å¨ä½¿ç¨çæå¡å¨,é»è®¤ä¸ºå¤ç½ localhost // serverAPI:'http://localhost:5184/api',//å½åæ£å¨ä½¿ç¨çæå¡å¨,é»è®¤ä¸ºå¤ç½ localhost //serverAPI:'http://192.168.1.22:10054/api',//å ç½ //serverAPI:'http://36.26.21.214:10054/api', serverAPI:'http://36.26.21.214:10055/api', } }, mutations: {