pages/QC/Laboratory/ImageItem.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/Laboratory/Laboratory.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/OQC/Add.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/OQC/ImageItem.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/OQC/ScanCode.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
pages/QC/OQC/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
pages/QC/Laboratory/ImageItem.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,238 @@ <template> <!-- #ifdef APP --> <scroll-view class="page-scroll-view"> <!-- #endif --> <view> <view class="uni-common-mt"> <view class="uni-list list-pd" style="padding: 15px;"> <view class="uni-flex" style="margin-bottom: 10px;"> <view class="uni-list-cell-left">ç¹å»å¯é¢è§é好çå¾ç</view> <view style="margin-left: auto;"> <view class="click-t">å ±æ{{ qsImage.length }}å¼ å¾ç</view> </view> </view> <view class="uni-flex" style="flex-wrap: wrap;"> <view v-for="(image,index) in qsImage" :key="index" class="uni-uploader__input-box" style="position: relative; border: 0;"> <image :data-src="image.img" :src="image.img" @tap="previewImage(index)"></image> <image class="image-remove" src="/static/plus.png" @click="removeImage(index,image.id)"></image> </view> <image class="uni-uploader__input-box" src="/static/plus.png" @tap="chooseImage"></image> </view> </view> </view> <view class="plus-button"> <button class="upImg" type="primary" @click="save">ä¸ä¼ å¾ç</button> </view> </view> <!-- #ifdef APP --> </scroll-view> <!-- #endif --> </template> <script> import {pathToBase64} from '../../../js_sdk/mmmm-image-tools/index' var sourceTypeArray = [ ['camera'], ['album'], ['camera', 'album'] ] var sizeTypeArray = [ ['compressed'], ['original'], ['compressed', 'original'] ] export default { data() { return { title: 'choose/previewImage', sourceTypeIndex: 2, sourceType: ['æç §', 'ç¸å', 'æç §æç¸å'], sizeTypeIndex: 2, sizeType: ['å缩', 'åå¾', 'å缩æåå¾'], countIndex: 8, count: [1, 2, 3, 4, 5, 6, 7, 8, 9], isCrop: false, cropPercent: 80, cropWidth: 100, cropHeight: 100, cropResize: false, qsImage: [], fid: 0, qsType: 5, orderNo: "", } }, onLoad(options) { //optionsä¸å å«äºurlé带çåæ° let params = options; if (params["id"]) { this.fid = params["id"]; this.orderNo = params["orderNo"]; //getQaItemXj02 this.init(); } }, onUnload() { this.qsImage = []; this.sourceTypeIndex = 2 this.sourceType = ['æç §', 'ç¸å', 'æç §æç¸å'] this.sizeTypeIndex = 2 this.sizeType = ['å缩', 'åå¾', 'å缩æåå¾'] this.countIndex = 8 }, methods: { removeImage(index, id) { this.qsImage.splice(index, 1); if (id) { this.$post({ url: "/Base/removeImage", data: { id: id } }).then(res => { }); } }, chooseImage() { if (this.qsImage.length >= 9) { uni.showToast({ position: "bottom", title: "å·²ç»æ9å¼ å¾çäºï¼è¯·å é¤é¨åå¾çä¹åéæ°éæ©" }); return; } uni.chooseImage({ sourceType: sourceTypeArray[this.sourceTypeIndex], sizeType: sizeTypeArray[this.sizeTypeIndex], crop: this.isCrop ? { "quality": this.cropPercent, "width": this.cropWidth, "height": this.cropHeight, "resize": this.cropResize } : null, count: this.qsImage.length + this.count[this.countIndex] > 9 ? 9 - this.qsImage.length : this.count[this.countIndex], success: (res) => { let url = res.tempFilePaths[0]; pathToBase64(url) .then(base64 => { // æ¾å°æåä¸ä¸ªææ çä½ç½® let lastSlashIndex = url.lastIndexOf("/"); // æåæä»¶å let fileName = url.substring(lastSlashIndex + 1); let entity = {}; entity.img = base64; entity.Picturename = fileName; entity.fid = this.fid; entity.qsType = this.qsType; entity.orderNo = this.orderNo; entity.base64Date = base64.split(',')[1]; this.qsImage.push(entity); }) .catch(error => { console.error(error) }) }, fail: (err) => { console.log("err: ", JSON.stringify(err)); } }); }, previewImage(index) { // uni.previewImage({ // current: index, // 设置å½åæ¾ç¤ºå¾çç龿¥ // urls: this.qsImage.map(s=>s.img), // éè¦é¢è§çå¾ç龿¥å表 // loop: false, // æ¯å¦å¼å¯å¾çè½®æï¼é»è®¤ä¸º false // indicator: 'default',// å¾çæç¤ºå¨ç±»åï¼å¯éå¼ä¸º "default"ã"number"ã"pointer"ï¼é»è®¤ä¸º "default" // }); }, init() { this.$post({ url: "/Base/getByFid", data: { id: this.fid, qsType: this.qsType } }).then(res => { let tableData = res.data.tbBillList; this.qsImage = tableData; this.qsImage.forEach(s => { s.img = 'data:image/png;base64,' + s.base64Date; }); }); }, save() { this.$post({ url: "/Base/saveImage", data: { entity: this.qsImage } }).then(res => { this.init(); this.$showMessage("ä¿åæå"); }); } } } </script> <style> .click-t { color: darkgray; } .list-pd { margin-top: 25px; } .uni-uploader__input-box { margin: 5px; border: 1px solid #D9D9D9; } .image-remove { transform: rotate(45deg); width: 25px; height: 25px; position: absolute; top: 0; right: 0; border-radius: 13px; background-color: #FF0000; } .uni-common-mt { background-color: #ffffff; /* 红è²èæ¯ */ } .plus-button { position: fixed; left: 0; bottom: 0; width: 100%; background-color: #ffffff; /* èæ¯é¢è² */ /* padding: 10px; */ box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1); /* æ·»å åºé¨é´å½±ææ */ z-index: 999; /* ç¡®ä¿æé®ä½äºé¡¶å± */ } .uni-flex { max-height: calc(100vh - 240px); /* å±å¹é«åº¦åå»ä¸ä¼ æé®é«åº¦ */ overflow-y: auto; /* å½å å®¹è¶ åºé«åº¦æ¶åºç°åç´æ»å¨æ¡ */ } .upImg { background-color: #3498db; color: white; } </style> pages/QC/Laboratory/Laboratory.vue
@@ -4,12 +4,12 @@ <view class="page-header"> <view class="header-title">å®éªå®¤æ£æµè¯¦æ </view> </view> <!-- å è½½ç¶æ --> <view v-if="loading" class="loading-container"> <uni-load-more status="loading" /> <uni-load-more status="loading"/> </view> <!-- æ°æ®å±ç¤º --> <view v-else-if="data" class="content"> <view class="card"> @@ -21,7 +21,7 @@ </view> </view> </view> <view class="card-body"> <view class="info-group"> <view class="info-row"> @@ -34,7 +34,7 @@ <text class="info-value">{{ data.createUser }}</text> </view> </view> <view class="info-row"> <view class="info-item"> <label class="info-label">ç产线ç¼ç :</label> @@ -45,21 +45,21 @@ <text class="info-value">{{ data.itemNo }}</text> </view> </view> <view class="info-row full-width"> <view class="info-item"> <label class="info-label">ç©æåç§°:</label> <text class="info-value">{{ data.itemName }}</text> </view> </view> <view class="info-row full-width"> <view class="info-item"> <label class="info-label">ç©æè§æ ¼:</label> <text class="info-value">{{ data.itemModel }}</text> </view> </view> <view class="info-row"> <view class="info-item"> <label class="info-label">ç产车é´ç¼ç :</label> @@ -70,14 +70,14 @@ <text class="info-value">{{ data.departmentId }}</text> </view> </view> <view class="info-row full-width"> <view class="info-item"> <label class="info-label">éå®è®¢åå·:</label> <text class="info-value">{{ data.saleOrderNoc }}</text> </view> </view> <view class="info-row"> <view class="info-item"> <label class="info-label">æ£éªæ¶é´:</label> @@ -88,36 +88,43 @@ <text class="info-value">{{ data.inspectionUser }}</text> </view> </view> <view class="info-row"> <view class="info-item status-item"> <label class="info-label">æ£éªç»æ:</label> <view class="result-container"> <!-- æ¾ç¤ºå½åæ£éªç»æ --> <text v-if="data.inspectionResult" class="status-badge" :class="data.inspectionResult === 'åæ ¼' ? 'success' : 'danger'"> <text v-if="data.inspectionResult" :class="data.inspectionResult === 'åæ ¼' ? 'success' : 'danger'" class="status-badge"> {{ data.inspectionResult }} </text> <text v-else class="status-badge pending"> å¾ æ£éª </text> <!-- å½å ¥/éæ°å½å ¥æé® --> <button v-if="!showResultInput" class="input-btn" @click="showResultInput = true"> {{ data.inspectionResult ? 'éæ°å½å ¥' : 'å½å ¥ç»æ' }} </button> <!-- æ£éªç»æéæ©æé® --> <view v-if="showResultInput" class="result-input-container"> <button class="result-btn qualified" @click="updateInspectionResult('åæ ¼')" :disabled="updating"> <button :disabled="updating" class="result-btn qualified" @click="updateInspectionResult('åæ ¼')"> åæ ¼ </button> <button class="result-btn unqualified" @click="updateInspectionResult('ä¸åæ ¼')" :disabled="updating"> <button :disabled="updating" class="result-btn unqualified" @click="updateInspectionResult('ä¸åæ ¼')"> ä¸åæ ¼ </button> <button class="result-btn cancel" @click="showResultInput = false" :disabled="updating"> <button :disabled="updating" class="result-btn cancel" @click="showResultInput = false"> åæ¶ </button> </view> <!-- å¾çä¸ä¼ æé® --> <button class="upload-btn" @click="uploadImage"> ð· ä¸ä¼ å¾ç </button> </view> </view> </view> @@ -125,7 +132,7 @@ </view> </view> </view> <!-- ç©ºç¶æ --> <view v-else class="empty-state"> <view class="empty-icon">ð</view> @@ -145,24 +152,24 @@ updating: false } }, onLoad(options) { this.itemId = options.id; if (this.itemId) { this.loadData(); } }, methods: { loadData() { this.loading = true; const requestData = { pageIndex: 1, limit: 1, id: this.itemId }; this.$post({ url: "/MesLaboratory/GetPage", data: requestData @@ -180,16 +187,16 @@ this.loading = false; }); }, updateInspectionResult(result) { this.updating = true; const requestData = { id: this.itemId, inspectionResult: result, inspectionBy: this.$loginInfo.account }; this.$post({ url: "/MesLaboratory/UpdateInspectionResult", data: requestData @@ -207,6 +214,16 @@ this.$showMessage('å½å ¥å¤±è´¥ï¼è¯·éè¯'); }).finally(() => { this.updating = false; }); }, uploadImage() { // å¤çbillNoï¼å»æ"-"åé¢çé¨å const orderNo = this.data.billNo.split('-')[0]; // 跳转å°å¾çä¸ä¼ é¡µé¢ uni.navigateTo({ url: `ImageItem?id=${this.itemId}&orderNo=${orderNo}` }); } } @@ -273,7 +290,7 @@ .info-row { display: flex; gap: 20px; &.full-width { flex-direction: column; } @@ -284,7 +301,7 @@ align-items: center; flex: 1; min-width: 0; &.status-item { align-items: center; gap: 10px; @@ -312,19 +329,19 @@ font-size: 14px; border-radius: 20px; font-weight: 500; &.success { background-color: #e6f7ed; color: #36b37e; border: 1px solid #d1fae5; } &.danger { background-color: #ffefef; color: #ff4d4f; border: 1px solid #fee2e2; } &.pending { background-color: #f5f5f5; color: #999; @@ -348,12 +365,12 @@ color: #409EFF; cursor: pointer; transition: all 0.2s; &:hover { background-color: #409EFF; color: #fff; } &:active { transform: scale(0.95); } @@ -372,50 +389,70 @@ border: 1px solid; cursor: pointer; transition: all 0.2s; &:disabled { opacity: 0.6; cursor: not-allowed; } &.qualified { background-color: #e6f7ed; color: #36b37e; border-color: #36b37e; &:hover:not(:disabled) { background-color: #36b37e; color: #fff; } } &.unqualified { background-color: #ffefef; color: #ff4d4f; border-color: #ff4d4f; &:hover:not(:disabled) { background-color: #ff4d4f; color: #fff; } } &.cancel { background-color: #f5f5f5; color: #666; border-color: #ccc; &:hover:not(:disabled) { background-color: #ccc; color: #fff; } } &:active:not(:disabled) { transform: scale(0.95); } } .upload-btn { padding: 8px 16px; font-size: 14px; border-radius: 6px; border: 1px solid #67C23A; background-color: #fff; color: #67C23A; cursor: pointer; transition: all 0.2s; &:hover { background-color: #67C23A; color: #fff; } &:active { transform: scale(0.95); } } .empty-state { display: flex; flex-direction: column; pages/QC/OQC/Add.vue
@@ -1,284 +1,287 @@ <template> <view class="page-container"> <!-- 表åå®¹å¨ --> <view class="form-card"> <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.itemNo" /> </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.saleOrderNo" /> </view> <view class="form-group"> <label class="form-label">鿣æ°é:</label> <input class="form-input" disabled="true" type="number" 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.createDate" /> </view> <view class="form-group"> <label class="form-label">å建人:</label> <input class="form-input" disabled="true" type="text" v-model="formData.createUser" /> </view> <view class="form-group"> <label class="form-label">ä¸è¯æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remeke" /> </view> </form> </view> <view class="page-container"> <!-- 表åå®¹å¨ --> <view class="form-card"> <form :modelValue="formData"> <view class="form-group"> <label class="form-label">æ£éªåå·:</label> <input v-model="formData.releaseNo" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">ç©æç¼ç :</label> <input v-model="formData.itemNo" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">ç©æåç§°:</label> <input v-model="formData.itemName" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">ç©æè§æ ¼:</label> <input v-model="formData.itemModel" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">订åç¼å·:</label> <input v-model="formData.saleOrderNo" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">鿣æ°é:</label> <input v-model="formData.planQty" class="form-input" disabled="true" type="number"/> </view> <view class="form-group"> <label class="form-label">å建æ¶é´:</label> <input v-model="formData.createDate" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">å建人:</label> <input v-model="formData.createUser" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">ä¸è¯æè¿°:</label> <input v-model="formData.remeke" class="form-input" disabled="true" type="text"/> </view> </form> </view> <!-- æ£éªé¡¹ç®å¡ç --> <view class="inspection-card"> <view class="card-header"> <view class="header-icon">ð</view> <text class="header-title">æ£éªé¡¹ç®</text> <view class="header-badge">{{ tableData.length }}</view> </view> <view class="inspection-list" v-if="tableData.length > 0"> <view v-for="(item, index) in tableData" :key="index" class="inspection-item" :class="{ 'item-completed': item.fcheckResu === 'åæ ¼', 'item-failed': item.fcheckResu === 'ä¸åæ ¼' }"> <!-- å·¦ä¾§ç¶ææç¤ºå¨ --> <view class="status-indicator" :class="{ 'status-pass': item.fcheckResu === 'åæ ¼', 'status-fail': item.fcheckResu === 'ä¸åæ ¼', 'status-pending': item.fcheckResu === 'æªæ£éª' }"> </view> <!-- 主è¦å 容åºå --> <view class="item-content"> <view class="item-header"> <view class="item-title">{{ item.fcheckItem }}</view> <view class="status-badge" :class="{ 'badge-pass': item.fcheckResu === 'åæ ¼', 'badge-fail': item.fcheckResu === 'ä¸åæ ¼', 'badge-pending': item.fcheckResu === 'æªæ£éª' }"> <text class="status-icon">{{ item.fcheckResu === 'åæ ¼' ? 'â' : item.fcheckResu === 'ä¸åæ ¼' ? 'â' : 'â' }}</text> <text class="status-text">{{ item.fcheckResu }}</text> </view> </view> <view class="item-description" v-if="item.fcheckItemDesc"> <text class="description-text">{{ item.fcheckItemDesc }}</text> </view> <view class="item-footer"> <view class="progress-info"> <text class="progress-label">æ£éªè¿åº¦:</text> <view class="progress-bar"> <view class="progress-fill" :style="{ width: (item.fenterQty / item.checkQyt * 100) + '%' }" :class="{ 'progress-complete': item.fenterQty >= item.checkQyt, 'progress-incomplete': item.fenterQty < item.checkQyt }"> </view> </view> <text class="progress-text">{{ item.fenterQty }}/{{ item.checkQyt }}</text> </view> <view class="action-button" @click="toDetail(item)" :class="{ 'btn-complete': item.fenterQty >= item.checkQyt, 'btn-incomplete': item.fenterQty < item.checkQyt }"> <text class="btn-text">{{ item.fenterQty >= item.checkQyt ? 'æ¥ç详æ ' : 'å¼å§æ£éª' }}</text> <text class="btn-icon">â</text> </view> </view> </view> </view> </view> <!-- ç©ºç¶æ --> <view v-else class="empty-state"> <view class="empty-icon">ð</view> <text class="empty-text">ææ æ£éªé¡¹ç®</text> <text class="empty-desc">请å çææ£éªé¡¹ç®</text> </view> </view> <!-- æ£éªé¡¹ç®å¡ç --> <view class="inspection-card"> <view class="card-header"> <view class="header-icon">ð</view> <text class="header-title">æ£éªé¡¹ç®</text> <view class="header-badge">{{ tableData.length }}</view> </view> <!-- æä½æé®åºå --> <view class="action-buttons"> <button class="btn btn-primary" @click="submitInspection">æäº¤</button> <button class="secondary-btn" @click="uploadImages">ä¸ä¼ /æ¥çå¾ç</button> <button class="btn btn-secondary" @click="addDefectDescription">æ·»å ä¸åæ ¼æè¿°</button> </view> <!-- ä¸åæ ¼æè¿°å¼¹åºå± --> <view v-if="remarksPopup" class="overlay active"> <view class="popup" :class="{ 'popup-scale': isPopupAnimated }" @animationend="isPopupAnimated = false"> <view class="popup-header"> <h3 class="popup-title">ä¿®æ¹ä¸åæ ¼æè¿°</h3> <view class="close-btn" @click="remarksPopup = !remarksPopup">Ã</view> </view> <form> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" type="text" v-model="remarks" /> </view> <view class="button-group popup-buttons"> <button :class="['action-btn', 'btn-danger']" @click="editRemarks"> ä¿®æ¹ </button> <button :class="['action-btn', 'btn-light']" @click="remarksPopup = !remarksPopup"> åæ¶ </button> </view> </form> </view> </view> </view> <view v-if="tableData.length > 0" class="inspection-list"> <view v-for="(item, index) in tableData" :key="index" :class="{ 'item-completed': item.fcheckResu === 'åæ ¼', 'item-failed': item.fcheckResu === 'ä¸åæ ¼' }" class="inspection-item"> <!-- å·¦ä¾§ç¶ææç¤ºå¨ --> <view :class="{ 'status-pass': item.fcheckResu === 'åæ ¼', 'status-fail': item.fcheckResu === 'ä¸åæ ¼', 'status-pending': item.fcheckResu === 'æªæ£éª' }" class="status-indicator"> </view> <!-- 主è¦å 容åºå --> <view class="item-content"> <view class="item-header"> <view class="item-title">{{ item.fcheckItem }}</view> <view :class="{ 'badge-pass': item.fcheckResu === 'åæ ¼', 'badge-fail': item.fcheckResu === 'ä¸åæ ¼', 'badge-pending': item.fcheckResu === 'æªæ£éª' }" class="status-badge"> <text class="status-icon">{{ item.fcheckResu === 'åæ ¼' ? 'â' : item.fcheckResu === 'ä¸åæ ¼' ? 'â' : 'â' }} </text> <text class="status-text">{{ item.fcheckResu }}</text> </view> </view> <view v-if="item.fcheckItemDesc" class="item-description"> <text class="description-text">{{ item.fcheckItemDesc }}</text> </view> <view class="item-footer"> <view class="progress-info"> <text class="progress-label">æ£éªè¿åº¦:</text> <view class="progress-bar"> <view :class="{ 'progress-complete': item.fenterQty >= item.checkQyt, 'progress-incomplete': item.fenterQty < item.checkQyt }" :style="{ width: (item.fenterQty / item.checkQyt * 100) + '%' }" class="progress-fill"> </view> </view> <text class="progress-text">{{ item.fenterQty }}/{{ item.checkQyt }}</text> </view> <view :class="{ 'btn-complete': item.fenterQty >= item.checkQyt, 'btn-incomplete': item.fenterQty < item.checkQyt }" class="action-button" @click="toDetail(item)"> <text class="btn-text">{{ item.fenterQty >= item.checkQyt ? 'æ¥ç详æ ' : 'å¼å§æ£éª' }}</text> <text class="btn-icon">â</text> </view> </view> </view> </view> </view> <!-- ç©ºç¶æ --> <view v-else class="empty-state"> <view class="empty-icon">ð</view> <text class="empty-text">ææ æ£éªé¡¹ç®</text> <text class="empty-desc">请å çææ£éªé¡¹ç®</text> </view> </view> <!-- æä½æé®åºå --> <view class="action-buttons"> <button class="btn btn-primary" @click="submitInspection">æäº¤</button> <button class="secondary-btn" @click="uploadImages">ä¸ä¼ /æ¥çå¾ç</button> <button class="btn btn-secondary" @click="addDefectDescription">æ·»å ä¸åæ ¼æè¿°</button> </view> <!-- ä¸åæ ¼æè¿°å¼¹åºå± --> <view v-if="remarksPopup" class="overlay active"> <view :class="{ 'popup-scale': isPopupAnimated }" class="popup" @animationend="isPopupAnimated = false"> <view class="popup-header"> <h3 class="popup-title">ä¿®æ¹ä¸åæ ¼æè¿°</h3> <view class="close-btn" @click="remarksPopup = !remarksPopup">Ã</view> </view> <form> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input v-model="remarks" class="form-input" type="text"/> </view> <view class="button-group popup-buttons"> <button :class="['action-btn', 'btn-danger']" @click="editRemarks"> ä¿®æ¹ </button> <button :class="['action-btn', 'btn-light']" @click="remarksPopup = !remarksPopup"> åæ¶ </button> </view> </form> </view> </view> </view> </template> <script> export default { data() { return { formData: {}, tableData: [], remarks: "", remarksPopup: false, isPopupAnimated: false, } }, onLoad(options) { //optionsä¸å å«äºurlé带çåæ° let params = options; export default { data() { return { formData: {}, tableData: [], remarks: "", remarksPopup: false, isPopupAnimated: false, } }, onLoad(options) { //optionsä¸å å«äºurlé带çåæ° let params = options; if (params["id"]) { this.formData.id = params["id"]; this.init(); } }, methods: { init() { let userName = this.$loginInfo.account; this.$post({ url: "/MesOqcItemsDetect02/getPage", data: { id: this.formData.id, createUser: userName, pageIndex: 1, limit: 1, } }).then(res => { let data = res.data[0]; if (data) { this.formData = data; this.getDetail5(); } }); }, if (params["id"]) { this.formData.id = params["id"]; this.init(); } }, methods: { init() { let userName = this.$loginInfo.account; this.$post({ url: "/MesOqcItemsDetect02/getPage", data: { id: this.formData.id, createUser: userName, pageIndex: 1, limit: 1, } }).then(res => { let data = res.data[0]; if (data) { this.formData = data; this.getDetail5(); } }); }, getDetail5() { let userName = this.$loginInfo.account; this.$post({ url: "/MesOqcItemsDetect02/GetDetail5", data: { id: this.formData.id, createUser: userName, releaseNo: this.formData.releaseNo, } }).then(res => { let data = res.data; this.tableData = data; }); }, uploadImages() { // ä¸ä¼ /æ¥çå¾ççé»è¾ uni.navigateTo({ url: 'ImageItem?id=' + this.formData.releaseNo }); }, addDefectDescription() { // ç¡®ä¿è¡¨åæ°æ®åå¨ if (!this.formData) return; getDetail5() { let userName = this.$loginInfo.account; this.$post({ url: "/MesOqcItemsDetect02/GetDetail5", data: { id: this.formData.id, createUser: userName, releaseNo: this.formData.releaseNo, } }).then(res => { let data = res.data; this.tableData = data; }); }, uploadImages() { // ä¸ä¼ /æ¥çå¾ççé»è¾ uni.navigateTo({ url: 'ImageItem?id=' + this.formData.id }); }, addDefectDescription() { // ç¡®ä¿è¡¨åæ°æ®åå¨ if (!this.formData) return; this.remarksPopup = !this.remarksPopup; this.remarks = this.formData.remeke || ''; this.isPopupAnimated = true; }, toDetail(item) { this.remarksPopup = !this.remarksPopup; this.remarks = this.formData.remeke || ''; this.isPopupAnimated = true; }, toDetail(item) { uni.navigateTo({ url: 'detail?mainId=' + item.id + '&releaseNo=' + this.formData .releaseNo }); uni.navigateTo({ url: 'detail?mainId=' + item.id + '&releaseNo=' + this.formData .releaseNo }); }, submitInspection() { // æ£éªæäº¤çé»è¾ this.$post({ url: "/MesOqcItemsDetect02/IqcQaSubmit", data: { userNo: this.$loginInfo.account, releaseNo: this.formData.releaseNo } }).then(res => { if (res.status == 0) { }, submitInspection() { // æ£éªæäº¤çé»è¾ this.$post({ url: "/MesOqcItemsDetect02/IqcQaSubmit", data: { userNo: this.$loginInfo.account, releaseNo: this.formData.releaseNo } }).then(res => { if (res.status == 0) { uni.showToast({ title: res.message.toString(), icon: 'success', duration: 2000 }) // 妿æé¡µé¢è·³è½¬ï¼éè¦ç¨å®æ¶å¨å»¶è¿ setTimeout(() => { uni.navigateTo({ url: 'List' }); }, 2000); // ä¿æä¸ duration ç¸åçæ¶é¿ uni.showToast({ title: res.message.toString(), icon: 'success', duration: 2000 }) // 妿æé¡µé¢è·³è½¬ï¼éè¦ç¨å®æ¶å¨å»¶è¿ setTimeout(() => { uni.navigateTo({ url: 'List' }); }, 2000); // ä¿æä¸ duration ç¸åçæ¶é¿ } else { uni.showModal({ title: "æç¤º", content: res.message.toString(), confirmText: "ç¡®å®", showCancel: false, success: (res) => { } else { uni.showModal({ title: "æç¤º", content: res.message.toString(), confirmText: "ç¡®å®", showCancel: false, success: (res) => { } }) } }) }, editRemarks() { if (this.remarks && this.formData.id) { this.$post({ url: "/MesOqcItemsDetect02/saveRemarksGid", data: { gid: this.formData.id, remarks: this.remarks, releaseNo: this.formData.releaseNo, } }).then(res => { if (res.data.tbBillList > 0) { this.formData.remarks = this.remarks; this.remarksPopup = false; this.$showMessage("ä¿åæå"); this.init(); } else { this.$showMessage("ä¿å失败"); } }).catch(() => { this.$showMessage("ä¿å失败ï¼è¯·éè¯"); }); } else if (!this.formData.id) { this.$showMessage("请å çææ£éªå"); } else { this.$showMessage("请è¾å ¥ä¸åæ ¼æè¿°"); } }, } } } }) } }) }, editRemarks() { if (this.remarks && this.formData.id) { this.$post({ url: "/MesOqcItemsDetect02/saveRemarksGid", data: { gid: this.formData.id, remarks: this.remarks, releaseNo: this.formData.releaseNo, } }).then(res => { if (res.data.tbBillList > 0) { this.formData.remarks = this.remarks; this.remarksPopup = false; this.$showMessage("ä¿åæå"); this.init(); } else { this.$showMessage("ä¿å失败"); } }).catch(() => { this.$showMessage("ä¿å失败ï¼è¯·éè¯"); }); } else if (!this.formData.id) { this.$showMessage("请å çææ£éªå"); } else { this.$showMessage("请è¾å ¥ä¸åæ ¼æè¿°"); } }, } } </script> <style scoped> @@ -342,13 +345,13 @@ /* æä½æé®åºå */ .action-buttons { display: flex; justify-content: space-between; gap: 15px; flex-direction: column; gap: 12px; padding: 15px 0; } .btn { flex: 1; .btn, .secondary-btn { width: 100%; height: 45px; border-radius: 8px; border: none; @@ -386,6 +389,19 @@ background-color: #6D6D70; } /* 大å±å¹æ¶ä¿ææ¨ªåæå */ @media (min-width: 768px) { .action-buttons { flex-direction: row; gap: 15px; } .btn, .secondary-btn { flex: 1; width: auto; } } /* æ£éªé¡¹ç®å¡ç */ .inspection-card { background: linear-gradient(135deg, #ffffff 0%, #f8fafc 100%); @@ -414,7 +430,7 @@ left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, rgba(255,255,255,0.1) 0%, transparent 100%); background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, transparent 100%); pointer-events: none; } @@ -699,41 +715,41 @@ margin: 0 -8px 24px -8px; border-radius: 12px; } .card-header { padding: 16px 20px; } .header-title { font-size: 16px; } .inspection-list { padding: 16px 20px; } .item-content { padding: 16px 20px; } .item-header { flex-direction: column; align-items: flex-start; gap: 8px; } .item-footer { flex-direction: column; align-items: stretch; gap: 12px; } .progress-info { flex-direction: column; align-items: stretch; gap: 8px; } .action-button { justify-content: center; } pages/QC/OQC/ImageItem.vue
@@ -14,16 +14,16 @@ <view class="uni-flex" style="flex-wrap: wrap;"> <view v-for="(image,index) in qsImage" :key="index" class="uni-uploader__input-box" style="position: relative; border: 0;"> <image :src="image.img" :data-src="image.img" <image :data-src="image.img" :src="image.img" @tap="previewImage(index)"></image> <image src="/static/plus.png" class="image-remove" @click="removeImage(index,image.id)"></image> <image class="image-remove" src="/static/plus.png" @click="removeImage(index,image.id)"></image> </view> <image class="uni-uploader__input-box" @tap="chooseImage" src="/static/plus.png"></image> <image class="uni-uploader__input-box" src="/static/plus.png" @tap="chooseImage"></image> </view> </view> </view> <view class="plus-button"> <button type="primary" class="upImg" @click="save">ä¸ä¼ å¾ç</button> <button class="upImg" type="primary" @click="save">ä¸ä¼ å¾ç</button> </view> </view> <!-- #ifdef APP --> @@ -33,7 +33,7 @@ <script> import {pathToBase64, base64ToPath} from '../../../js_sdk/mmmm-image-tools/index' import {pathToBase64} from '../../../js_sdk/mmmm-image-tools/index' var sourceTypeArray = [ ['camera'], @@ -62,7 +62,7 @@ cropResize: false, qsImage: [], fid: 0, qsType : 5, qsType: 5, } }, onLoad(options) { @@ -152,9 +152,9 @@ }, init() { this.$post({ url: "/Base/getLljAllImgByFid", url: "/Base/getByOqcFid", data: { id: this.fid, fid: this.fid, qsType: this.qsType } }).then(res => { @@ -225,10 +225,11 @@ max-height: calc(100vh - 240px); /* å±å¹é«åº¦åå»ä¸ä¼ æé®é«åº¦ */ overflow-y: auto; /* å½å å®¹è¶ åºé«åº¦æ¶åºç°åç´æ»å¨æ¡ */ } .upImg{ background-color: #3498db; color: white; .upImg { background-color: #3498db; color: white; } </style> pages/QC/OQC/ScanCode.vue
@@ -1,745 +1,928 @@ <template> <view class="container"> <!-- 表ååºå --> <view class="form-container card"> <form :modelValue="formData"> <view class="form-grid"> <view class="form-group col-2"> <label class="form-label">ç©ææ¡ç :</label> <view class="input-with-scan"> <input class="form-input scan-input" type="text" v-model="formData.ItemBarcode" @confirm="addItemBarCode" placeholder="è¾å ¥åç¦»å¼ææå车" /> <view class="scan-button" @tap="startScan"> <uni-icons type="scan" size="24" color="#007bff"></uni-icons> <text class="scan-text">æ«ç </text> </view> </view> </view> <view class="form-group col-2"> <label class="form-label">产ååç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemName" /> </view> <view class="form-group col-2"> <label class="form-label">产åç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="formData.itemNo" /> </view> <view class="form-group col-2"> <label class="form-label">订åç¼å·:</label> <input class="form-input" disabled="true" type="text" v-model="formData.taskNo" /> </view> <view class="form-group col-2"> <label class="form-label">å·²æ«æ°é:</label> <input class="form-input" disabled="true" type="text" v-model="quantity" /> </view> </view> </form> </view> <view class="container"> <!-- 表ååºå --> <view class="form-container card"> <form :modelValue="formData"> <view class="form-grid"> <view class="form-group col-2"> <label class="form-label">ç©ææ¡ç :</label> <view class="input-with-scan"> <input v-model="formData.ItemBarcode" class="form-input scan-input" placeholder="è¾å ¥åç¦»å¼ææå车" type="text" @confirm="addItemBarCode"/> <view class="scan-button" @tap="startScan"> <uni-icons color="#007bff" size="24" type="scan"></uni-icons> <text class="scan-text">æ«ç </text> </view> </view> </view> <view class="form-group col-2"> <label class="form-label">产ååç§°:</label> <input v-model="formData.itemName" class="form-input" disabled="true" type="text"/> </view> <view class="form-group col-2"> <label class="form-label">产åç¼ç :</label> <input v-model="formData.itemNo" class="form-input" disabled="true" type="text"/> </view> <view class="form-group col-2"> <label class="form-label">订åç¼å·:</label> <input v-model="formData.taskNo" class="form-input" disabled="true" type="text"/> </view> <view class="form-group col-2"> <label class="form-label">å·²æ«æ°é:</label> <input v-model="quantity" class="form-input" disabled="true" type="text"/> </view> </view> </form> </view> <!-- å¾ æ£æ¡ç è¡¨æ ¼åºå --> <view class="table-container card"> <view class="table-header"> <text class="section-title">å¾ æ£æ¡ç å表</text> <view class="table-tip"> <text class="tip-text">ð 左峿»å¨æ¥çæ´å¤ä¿¡æ¯</text> </view> </view> <view class="table-wrapper"> <scroll-view class="table-scroll" scroll-x="true" show-scrollbar="true"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®" class="custom-table"> <uni-tr class="table-header-row"> <uni-th align="center" class="th" width="80">åºå·</uni-th> <uni-th align="center" class="th" width="160">ç©ææ¡ç </uni-th> <uni-th align="center" class="th" width="140">订åç¼å·</uni-th> <uni-th align="center" class="th" width="140">产åç¼ç </uni-th> <uni-th align="center" class="th" width="160">产ååç§°</uni-th> <uni-th align="center" class="th" width="100">æ¡ç æ°é</uni-th> <uni-th align="center" class="th" width="80">ã</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index" class="table-row"> <uni-td align="center" width="80"> <view class="description-text">{{ index + 1 }}</view> </uni-td> <uni-td align="center" width="160"> <view class="cell-content">{{ item.itemBarcode }}</view> </uni-td> <uni-td align="center" width="140"> <view class="cell-content">{{ item.taskNo || '-' }}</view> </uni-td> <uni-td align="center" width="140"> <view class="cell-content">{{ item.itemNo }}</view> </uni-td> <uni-td align="center" width="160"> <view class="cell-content" :title="item.itemName">{{ item.itemName }}</view> </uni-td> <uni-td align="center" width="100"> <view class="cell-content quantity">{{ item.quantity }}</view> </uni-td> <uni-td align="center" width="80"> <view class="cell-content">ã</view> </uni-td> </uni-tr> </uni-table> </scroll-view> <!-- å³åºå®æ¬æµ®å 餿é®å --> <view class="fixed-delete-column"> <view class="fixed-header"> <text class="fixed-header-text">æä½</text> </view> <view class="fixed-content"> <view v-for="(item, index) in tableData" :key="index" class="fixed-delete-item" :class="{ 'even': index % 2 === 1 }"> <view @click="deleteItem(index)" class="delete-icon"> <uni-icons type="trash" size="24"></uni-icons> </view> </view> </view> </view> </view> </view> <!-- å¾ æ£æ¡ç è¡¨æ ¼åºå --> <view class="table-container card"> <view class="table-header"> <text class="section-title">å¾ æ£æ¡ç å表</text> <view class="table-tip"> <text class="tip-text">ð 左峿»å¨æ¥çæ´å¤ä¿¡æ¯</text> </view> </view> <view class="table-wrapper"> <scroll-view class="table-scroll" scroll-x="true" show-scrollbar="true"> <uni-table ref="table" border class="custom-table" emptyText="ææ æ´å¤æ°æ®"> <uni-tr class="table-header-row"> <uni-th align="center" class="th" width="80">åºå·</uni-th> <uni-th align="center" class="th" width="160">ç©ææ¡ç </uni-th> <uni-th align="center" class="th" width="140">订åç¼å·</uni-th> <uni-th align="center" class="th" width="140">产åç¼ç </uni-th> <uni-th align="center" class="th" width="160">产ååç§°</uni-th> <uni-th align="center" class="th" width="100">æ¡ç æ°é</uni-th> <uni-th align="center" class="th" width="80">å é¤</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index" class="table-row"> <uni-td align="center" width="80"> <view class="description-text">{{ index + 1 }}</view> </uni-td> <uni-td align="center" width="160"> <view class="cell-content">{{ item.itemBarcode }}</view> </uni-td> <uni-td align="center" width="140"> <view class="cell-content">{{ item.taskNo || '-' }}</view> </uni-td> <uni-td align="center" width="140"> <view class="cell-content">{{ item.itemNo }}</view> </uni-td> <uni-td align="center" width="160"> <view :title="item.itemName" class="cell-content">{{ item.itemName }}</view> </uni-td> <uni-td align="center" width="100"> <view class="cell-content quantity">{{ item.quantity }}</view> </uni-td> <uni-td align="center" width="80"> <view class="delete-icon" @click="deleteItem(index)"> <uni-icons size="24" type="trash"></uni-icons> </view> </uni-td> </uni-tr> </uni-table> </scroll-view> </view> </view> <!-- æä½æé®åºå --> <view class="action-buttons-container button-group"> <view class="plus-button" :class="{ 'submitting': isSubmitting }" @tap="handleSubmit"> <text>{{ isSubmitting ? 'æäº¤ä¸...' : 'çæOQCæ£éªå' }}</text> </view> </view> </view> <!-- æä½æé®åºå --> <view class="action-buttons-container button-group"> <view :class="{ 'submitting': isSubmitting }" class="plus-button" @tap="handleSubmit"> <text>{{ isSubmitting ? 'æäº¤ä¸...' : 'çæOQCæ£éªå' }}</text> </view> </view> </view> </template> <script> export default { data() { return { formData: {}, tableData: [], quantity: 0, isSubmitting: false, // 鲿¢éå¤æäº¤ isProcessing: false, // 鲿¢éå¤å¤çæ¡ç } }, methods: { // å¯å¨æ«ç åè½ startScan() { // æ£æ¥æ¯å¦æ£å¨å¤çæ¡ç ï¼é²æ¢é夿«ç if (this.isProcessing) { this.$showMessage("æ£å¨å¤çæ¡ç ï¼è¯·ç¨å"); return; } export default { data() { return { formData: {}, tableData: [], quantity: 0, isSubmitting: false, // 鲿¢éå¤æäº¤ isProcessing: false, // 鲿¢éå¤å¤çæ¡ç } }, methods: { // å¯å¨æ«ç åè½ startScan() { // æ£æ¥æ¯å¦æ£å¨å¤çæ¡ç ï¼é²æ¢é夿«ç if (this.isProcessing) { this.$showMessage("æ£å¨å¤çæ¡ç ï¼è¯·ç¨å"); return; } uni.scanCode({ scanType: ['barCode', 'qrCode'], // æ¯ææ¡ç åäºç»´ç success: (res) => { console.log('æ«ç æå:', res); // å°æ«ç ç»æè®¾ç½®å°è¾å ¥æ¡ this.formData.ItemBarcode = res.result; // èªå¨å¤çæ«ç ç»æ this.addItemBarCode(); }, fail: (err) => { console.log('æ«ç 失败:', err); if (err.errMsg && err.errMsg.indexOf('cancel') === -1) { this.$showMessage("æ«ç 失败ï¼è¯·éè¯"); } } }); }, uni.scanCode({ scanType: ['barCode', 'qrCode'], // æ¯ææ¡ç åäºç»´ç success: (res) => { console.log('æ«ç æå:', res); // å°æ«ç ç»æè®¾ç½®å°è¾å ¥æ¡ this.formData.ItemBarcode = res.result; // èªå¨å¤çæ«ç ç»æ this.addItemBarCode(); }, fail: (err) => { console.log('æ«ç 失败:', err); if (err.errMsg && err.errMsg.indexOf('cancel') === -1) { this.$showMessage("æ«ç 失败ï¼è¯·éè¯"); } } }); }, addItemBarCode() { // 鲿¢éå¤å¤ç if (this.isProcessing) { return; } addItemBarCode() { // 鲿¢éå¤å¤ç if (this.isProcessing) { return; } // æ ¡éªç©ææ¡ç æ¯å¦ä¸ºç©º if (!this.formData.ItemBarcode || this.formData.ItemBarcode.trim() === '') { this.$showMessage("请è¾å ¥ç©ææ¡ç "); return; } // æ ¡éªç©ææ¡ç æ¯å¦ä¸ºç©º if (!this.formData.ItemBarcode || this.formData.ItemBarcode.trim() === '') { this.$showMessage("请è¾å ¥ç©ææ¡ç "); return; } // æ£æ¥ç©ææ¡ç æ¯å¦å·²åå¨äº tableData ä¸ const isDuplicate = this.tableData.some(item => item.itemBarcode === this.formData.ItemBarcode); if (isDuplicate) { this.$showMessage("è¯¥ç©ææ¡ç å·²åå¨ï¼è¯·æ£æ¥ï¼"); return; } // æ£æ¥ç©ææ¡ç æ¯å¦å·²åå¨äº tableData ä¸ const isDuplicate = this.tableData.some(item => item.itemBarcode === this.formData.ItemBarcode); if (isDuplicate) { this.$showMessage("è¯¥ç©ææ¡ç å·²åå¨ï¼è¯·æ£æ¥ï¼"); return; } // 设置å¤çç¶æ this.isProcessing = true; // 设置å¤çç¶æ this.isProcessing = true; // 妿éè¿äºä¸è¿°æ ¡éªï¼åé请æ±å¹¶æ´æ°æ°æ® this.$post({ url: "/MesOqcItemsDetect02/GetItemBarCode", data: { ItemCode: this.formData.ItemBarcode } }).then(res => { let fr = res.data.tbBillList; // 妿éè¿äºä¸è¿°æ ¡éªï¼åé请æ±å¹¶æ´æ°æ°æ® this.$post({ url: "/MesOqcItemsDetect02/GetItemBarCode", data: { ItemCode: this.formData.ItemBarcode } }).then(res => { let fr = res.data.tbBillList; // æ°æ®å®æ´æ§æ ¡éª if (!fr) { this.$showMessage("è·åæ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯"); return; } // æ°æ®å®æ´æ§æ ¡éª if (!fr) { this.$showMessage("è·åæ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯"); return; } if (!fr.itemId || !fr.itemName || !fr.itemNo) { this.$showMessage("æ¡ç ä¿¡æ¯ä¸å®æ´ï¼è¯·æ£æ¥æ¡ç "); return; } if (!fr.itemId || !fr.itemName || !fr.itemNo) { this.$showMessage("æ¡ç ä¿¡æ¯ä¸å®æ´ï¼è¯·æ£æ¥æ¡ç "); return; } if (fr.quantity <= 0) { this.$showMessage("æ¡ç æ°é为0ï¼è¯·ç¡®è®¤"); return; } if (fr.quantity <= 0) { this.$showMessage("æ¡ç æ°é为0ï¼è¯·ç¡®è®¤"); return; } //éè¦éªè¯ //æ«çç çitemIdå¿ é¡»æ¯åtableDataä¸çitemIdç¸å å¿ é¡»çæ¡ä»¶ //æ«çç çTaskNoä¹å¿ é¡»æ¯åtableDataä¸çTaskNoç¸å //TaskNo为空çåªè½åTaskNo为空çä¸èµ·æ« // 妿tableDataä¸å·²ææ°æ®ï¼éè¦éªè¯itemIdåTaskNoçä¸è´æ§ if (this.tableData.length > 0) { const firstItem = this.tableData[0]; // éªè¯itemIdæ¯å¦ç¸åï¼å¿ é¡»æ¡ä»¶ï¼ if (fr.itemId !== firstItem.itemId) { this.$showMessage("ç©æç¼ç ä¸ä¸è´ï¼è¯·æ«æç¸åç©æçæ¡ç "); return; } // éªè¯TaskNoæ¯å¦ç¸å if (fr.taskNo !== firstItem.taskNo) { this.$showMessage("订åç¼å·ä¸ä¸è´ï¼è¯·æ«æç¸å订åçæ¡ç "); return; } // éªè¯ç©ºTaskNoçæ åµï¼TaskNo为空çåªè½åTaskNo为空çä¸èµ·æ« if ((fr.taskNo === '' || fr.taskNo === null || fr.taskNo === undefined) && (firstItem.taskNo !== '' && firstItem.taskNo !== null && firstItem.taskNo !== undefined)) { this.$showMessage("订åç¼å·ä¸å¹é ï¼ç©ºè®¢åç¼å·åªè½ä¸ç©ºè®¢åç¼å·ä¸èµ·æ«æ"); return; } if ((fr.taskNo !== '' && fr.taskNo !== null && fr.taskNo !== undefined) && (firstItem.taskNo === '' || firstItem.taskNo === null || firstItem.taskNo === undefined)) { this.$showMessage("订åç¼å·ä¸å¹é ï¼æè®¢åç¼å·çæ¡ç åªè½ä¸æè®¢åç¼å·çæ¡ç ä¸èµ·æ«æ"); return; } } //éè¦éªè¯ //æ«çç çitemIdå¿ é¡»æ¯åtableDataä¸çitemIdç¸å å¿ é¡»çæ¡ä»¶ //æ«çç çTaskNoä¹å¿ é¡»æ¯åtableDataä¸çTaskNoç¸å //TaskNo为空çåªè½åTaskNo为空çä¸èµ·æ« this.formData = fr; this.tableData.push(fr); // å°æ°æ°æ®æ·»å å°è¡¨æ ¼ this.quantity = this.tableData.reduce(function(accumulator, current) { return accumulator + current["quantity"]; }, 0); // æ¸ ç©ºè¾å ¥æ¡ this.formData.ItemBarcode = ''; }).catch(error => { this.$showMessage("è·åæ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯"); }).finally(() => { // éç½®å¤çç¶æ this.isProcessing = false; }); }, // 妿tableDataä¸å·²ææ°æ®ï¼éè¦éªè¯itemIdåTaskNoçä¸è´æ§ if (this.tableData.length > 0) { const firstItem = this.tableData[0]; // å 餿ä½ï¼å é¤ tableData 䏿å®ç´¢å¼çæ°æ® deleteItem(index) { this.tableData.splice(index, 1); // å é¤è¯¥è¡æ°æ® this.quantity = this.tableData.reduce(function(accumulator, current) { return accumulator + current["quantity"]; }, 0); // æ´æ°æ¡ç æ°é // éªè¯itemIdæ¯å¦ç¸åï¼å¿ é¡»æ¡ä»¶ï¼ if (fr.itemId !== firstItem.itemId) { this.$showMessage("ç©æç¼ç ä¸ä¸è´ï¼è¯·æ«æç¸åç©æçæ¡ç "); return; } if (this.tableData.length <= 0) { this.formData = {}; } }, // éªè¯TaskNoæ¯å¦ç¸å if (fr.taskNo !== firstItem.taskNo) { this.$showMessage("订åç¼å·ä¸ä¸è´ï¼è¯·æ«æç¸å订åçæ¡ç "); return; } handleSubmit() { console.log("handleSubmitæ¹æ³è¢«è°ç¨ï¼isSubmitting:", this.isSubmitting); console.log("tableDataé¿åº¦:", this.tableData.length); console.log("quantity:", this.quantity); this.submit(); }, // éªè¯ç©ºTaskNoçæ åµï¼TaskNo为空çåªè½åTaskNo为空çä¸èµ·æ« if ((fr.taskNo === '' || fr.taskNo === null || fr.taskNo === undefined) && (firstItem.taskNo !== '' && firstItem.taskNo !== null && firstItem.taskNo !== undefined)) { this.$showMessage("订åç¼å·ä¸å¹é ï¼ç©ºè®¢åç¼å·åªè½ä¸ç©ºè®¢åç¼å·ä¸èµ·æ«æ"); return; } submit() { console.log("submitæ¹æ³è¢«è°ç¨"); // 鲿¢éå¤æäº¤ if (this.isSubmitting) { this.$showMessage("æ£å¨æäº¤ä¸ï¼è¯·å¿é夿ä½"); return; } if ((fr.taskNo !== '' && fr.taskNo !== null && fr.taskNo !== undefined) && (firstItem.taskNo === '' || firstItem.taskNo === null || firstItem.taskNo === undefined)) { this.$showMessage("订åç¼å·ä¸å¹é ï¼æè®¢åç¼å·çæ¡ç åªè½ä¸æè®¢åç¼å·çæ¡ç ä¸èµ·æ«æ"); return; } } // æ ¡éªç¨æ·ç»å½ç¶æ if (!this.$loginInfo.account) { this.$showMessage("ç¨æ·æªç»å½ï¼è¯·éæ°ç»å½"); return; } this.formData = fr; this.tableData.push(fr); // å°æ°æ°æ®æ·»å å°è¡¨æ ¼ this.quantity = this.tableData.reduce(function (accumulator, current) { return accumulator + current["quantity"]; }, 0); // æ ¡éªæ¡ç æ°éæ¯å¦ææ if (this.quantity <= 0) { this.$showMessage("æ¡ç æ°éå¿ é¡»å¤§äº0"); return; } // æ¸ ç©ºè¾å ¥æ¡ this.formData.ItemBarcode = ''; }).catch(error => { this.$showMessage("è·åæ¡ç ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯"); }).finally(() => { // éç½®å¤çç¶æ this.isProcessing = false; }); }, // æ ¡éªæ¯å¦ææ°æ® if (this.tableData.length === 0) { this.$showMessage("è¯·æ«ææ¡ç "); return; } // å 餿ä½ï¼å é¤ tableData 䏿å®ç´¢å¼çæ°æ® deleteItem(index) { this.tableData.splice(index, 1); // å é¤è¯¥è¡æ°æ® this.quantity = this.tableData.reduce(function (accumulator, current) { return accumulator + current["quantity"]; }, 0); // æ´æ°æ¡ç æ°é let userName = this.$loginInfo.account; this.isSubmitting = true; // 设置æäº¤ç¶æ if (this.tableData.length <= 0) { this.formData = {}; } }, // åéè¯·æ± this.$post({ url: "/MesOqcItemsDetect02/ItemBarCodeSubmit", data: { itemBarCodeData: this.tableData, CreateUser: userName } }).then(response => { if(response.status == 0){ // è¯·æ±æååæ¾ç¤ºéæ©æ¡ uni.showModal({ title: "æä½æå", content: "å·²ç»æåçææ£éªå", showCancel: true, cancelText: "ç»§ç»æ«ç ", confirmText: "è·³è½¬å°æ£éªå", success: (res) => { if (res.confirm) { // ç¨æ·ç¹å»äº"è·³è½¬å°æ£éªå" uni.navigateTo({ url: '/pages/QC/OQC/Add?id=' + response.data }); } else if (res.cancel) { // ç¨æ·ç¹å»äº"ç»§ç»æ«ç " this.clearData(); } } }); }else{ this.$showMessage(response.message); } }).catch(error => { // 请æ±å¤±è´¥æ¶çå¤ç this.$showMessage("请æ±å¤±è´¥ï¼è¯·ç¨åéè¯"); }).finally(() => { // æ 论æåè¿æ¯å¤±è´¥é½éç½®æäº¤ç¶æ this.isSubmitting = false; }); }, handleSubmit() { console.log("handleSubmitæ¹æ³è¢«è°ç¨ï¼isSubmitting:", this.isSubmitting); console.log("tableDataé¿åº¦:", this.tableData.length); console.log("quantity:", this.quantity); this.submit(); }, // æ¸ ç©ºè¡¨æ ¼åè¡¨åæ°æ® clearData() { this.tableData = []; this.formData = {}; this.quantity = 0; this.isSubmitting = false; this.isProcessing = false; } submit() { console.log("submitæ¹æ³è¢«è°ç¨"); } } // 鲿¢éå¤æäº¤ if (this.isSubmitting) { this.$showMessage("æ£å¨æäº¤ä¸ï¼è¯·å¿é夿ä½"); return; } // æ ¡éªç¨æ·ç»å½ç¶æ if (!this.$loginInfo.account) { this.$showMessage("ç¨æ·æªç»å½ï¼è¯·éæ°ç»å½"); return; } // æ ¡éªæ¡ç æ°éæ¯å¦ææ if (this.quantity <= 0) { this.$showMessage("æ¡ç æ°éå¿ é¡»å¤§äº0"); return; } // æ ¡éªæ¯å¦ææ°æ® if (this.tableData.length === 0) { this.$showMessage("è¯·æ«ææ¡ç "); return; } let userName = this.$loginInfo.account; this.isSubmitting = true; // 设置æäº¤ç¶æ // åéè¯·æ± this.$post({ url: "/MesOqcItemsDetect02/ItemBarCodeSubmit", data: { itemBarCodeData: this.tableData, CreateUser: userName } }).then(response => { if (response.status == 0) { // è¯·æ±æååæ¾ç¤ºéæ©æ¡ uni.showModal({ title: "æä½æå", content: "å·²ç»æåçææ£éªå", showCancel: true, cancelText: "ç»§ç»æ«ç ", confirmText: "è·³è½¬å°æ£éªå", success: (res) => { if (res.confirm) { // ç¨æ·ç¹å»äº"è·³è½¬å°æ£éªå" uni.navigateTo({ url: '/pages/QC/OQC/Add?id=' + response.data }); } else if (res.cancel) { // ç¨æ·ç¹å»äº"ç»§ç»æ«ç " this.clearData(); } } }); } else { this.$showMessage(response.message); } }).catch(error => { // 请æ±å¤±è´¥æ¶çå¤ç this.$showMessage("请æ±å¤±è´¥ï¼è¯·ç¨åéè¯"); }).finally(() => { // æ 论æåè¿æ¯å¤±è´¥é½éç½®æäº¤ç¶æ this.isSubmitting = false; }); }, // æ¸ ç©ºè¡¨æ ¼åè¡¨åæ°æ® clearData() { this.tableData = []; this.formData = {}; this.quantity = 0; this.isSubmitting = false; this.isProcessing = false; } } } </script> <style> .container { padding: 24rpx; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); min-height: 100vh; display: flex; flex-direction: column; } /* å¡çéç¨æ ·å¼ */ .card { background: #ffffff; border-radius: 12rpx; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08); margin-bottom: 24rpx; padding: 32rpx; border: 1rpx solid #e9ecef; } /* 表ååºå */ .form-container { .form-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24rpx 16rpx; } .form-group { display: flex; flex-direction: column; gap: 16rpx; .form-label { font-size: 28rpx; color: #495057; font-weight: 600; padding-left: 4rpx; position: relative; &::after { content: ""; position: absolute; left: 0; bottom: -4rpx; width: 24rpx; height: 3rpx; background: #007bff; border-radius: 2rpx; } } .form-input { height: 92rpx; padding: 0 24rpx; border: 2rpx solid #dee2e6; border-radius: 8rpx; font-size: 28rpx; color: #212529; background: #ffffff; transition: all 0.3s ease; &[disabled] { background: #f8f9fa; color: #6c757d; border-color: #e9ecef; } &:focus { border-color: #007bff; box-shadow: 0 0 0 4rpx rgba(0, 123, 255, 0.1); outline: none; } &::placeholder { color: #adb5bd; } } } } /* è¡¨æ ¼ä¼å */ .table-container { .table-header { margin-bottom: 24rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #e9ecef; display: flex; justify-content: space-between; align-items: center; .section-title { font-size: 32rpx; color: #212529; font-weight: 700; position: relative; padding-left: 24rpx; &::before { content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 4rpx; height: 28rpx; background: linear-gradient(135deg, #007bff, #0056b3); border-radius: 2rpx; } } .table-tip { .tip-text { font-size: 22rpx; color: #6c757d; background: #f8f9fa; padding: 8rpx 16rpx; border-radius: 16rpx; border: 1rpx solid #e9ecef; } } } .table-wrapper { position: relative; border-radius: 8rpx; overflow: hidden; border: 1rpx solid #dee2e6; } .table-scroll { width: calc(100% - 80rpx); /* åå»åºå®å宽度 */ white-space: nowrap; } .custom-table { border: none; min-width: 780rpx; .table-header-row { background: linear-gradient(135deg, #f8f9fa, #e9ecef); .th { font-size: 26rpx; color: #495057; font-weight: 600; padding: 20rpx 12rpx; background: transparent !important; border-right: 1rpx solid #dee2e6; white-space: nowrap; min-width: 80rpx; &:last-child { border-right: none; } } } .table-row { transition: background-color 0.2s ease; &:nth-child(even) { background: #f8f9fa; } &:hover { background: #e3f2fd; } .uni-td { padding: 16rpx 12rpx; border-color: #dee2e6 !important; border-right: 1rpx solid #dee2e6; white-space: nowrap; min-width: 80rpx; &:last-child { border-right: none; } .cell-content { font-size: 24rpx; color: #495057; line-height: 1.4; max-width: 100%; overflow: hidden; text-overflow: ellipsis; &.quantity { font-weight: 600; color: #007bff; background: linear-gradient(135deg, #e3f2fd, #bbdefb); padding: 8rpx 16rpx; border-radius: 12rpx; display: inline-block; min-width: 60rpx; text-align: center; } } .description-text { font-size: 24rpx; color: #6c757d; font-weight: 500; } } } } /* å³åºå®æ¬æµ®å é¤å */ .fixed-delete-column { position: absolute; top: 0; right: 0; width: 80rpx; background: #ffffff; border-left: 1rpx solid #dee2e6; box-shadow: -4rpx 0 8rpx rgba(0, 0, 0, 0.05); z-index: 10; .fixed-header { height: 60rpx; background: linear-gradient(135deg, #f8f9fa, #e9ecef); display: flex; align-items: center; justify-content: center; border-bottom: 1rpx solid #dee2e6; .fixed-header-text { font-size: 26rpx; color: #495057; font-weight: 600; } } .fixed-content { .fixed-delete-item { height: 48rpx; display: flex; align-items: center; justify-content: center; border-bottom: 1rpx solid #dee2e6; transition: background-color 0.2s ease; &.even { background: #f8f9fa; } &:hover { background: #e3f2fd; } &:last-child { border-bottom: none; } } } } } /* å é¤å¾æ ä¼å */ .delete-icon { cursor: pointer; color: #dc3545; transition: all 0.3s ease; padding: 12rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; min-width: 48rpx; min-height: 48rpx; &:hover { color: #c82333; background: rgba(220, 53, 69, 0.1); transform: scale(1.1); } &:active { transform: scale(0.95); background: rgba(220, 53, 69, 0.2); } } /* æé®ä¼å */ .action-buttons-container { display: flex; justify-content: center; margin-top: 48rpx; padding: 0 24rpx; .plus-button { width: 100%; max-width: 600rpx; height: 96rpx; background: linear-gradient(135deg, #007bff, #0056b3); border-radius: 48rpx; display: flex; justify-content: center; align-items: center; color: #ffffff; font-size: 32rpx; font-weight: 600; box-shadow: 0 8rpx 24rpx rgba(0, 123, 255, 0.3); transition: all 0.3s ease; border: none; position: relative; overflow: hidden; &::before { content: ""; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s ease; } &:active { transform: scale(0.98); box-shadow: 0 4rpx 12rpx rgba(0, 123, 255, 0.4); &::before { left: 100%; } } &.submitting { background: linear-gradient(135deg, #6c757d, #5a6268); cursor: not-allowed; &::before { display: none; } } } } /* æ°éæ¾ç¤ºä¼å */ .form-group { &:nth-child(5) .form-input { font-weight: 600; color: #007bff; background: linear-gradient(135deg, #e3f2fd, #bbdefb); border: 2rpx solid #007bff; text-align: center; } } .container { padding: 24rpx; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); min-height: 100vh; display: flex; flex-direction: column; } /* æ«ç è¾å ¥æ¡æ ·å¼ */ .input-with-scan { display: flex; align-items: center; gap: 16rpx; .scan-input { flex: 1; } .scan-button { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 16rpx 20rpx; background: linear-gradient(135deg, #e3f2fd, #bbdefb); border: 2rpx solid #007bff; border-radius: 8rpx; min-width: 120rpx; height: 92rpx; cursor: pointer; transition: all 0.3s ease; &:hover { background: linear-gradient(135deg, #bbdefb, #90caf9); transform: translateY(-2rpx); box-shadow: 0 4rpx 12rpx rgba(0, 123, 255, 0.2); } &:active { transform: translateY(0); box-shadow: 0 2rpx 6rpx rgba(0, 123, 255, 0.3); } .scan-text { font-size: 22rpx; color: #007bff; font-weight: 600; margin-top: 4rpx; } } } /* å¡çéç¨æ ·å¼ */ .card { background: #ffffff; border-radius: 12rpx; box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08); margin-bottom: 24rpx; padding: 32rpx; border: 1rpx solid #e9ecef; } /* 表ååºå */ .form-container { .form-grid { display: grid; grid-template-columns: 1fr; gap: 24rpx; } .form-group { display: flex; flex-direction: column; gap: 16rpx; .form-label { font-size: 28rpx; color: #495057; font-weight: 600; padding-left: 4rpx; position: relative; &::after { content: ""; position: absolute; left: 0; bottom: -4rpx; width: 24rpx; height: 3rpx; background: #007bff; border-radius: 2rpx; } } .form-input { height: 92rpx; padding: 0 24rpx; border: 2rpx solid #dee2e6; border-radius: 8rpx; font-size: 28rpx; color: #212529; background: #ffffff; transition: all 0.3s ease; &[disabled] { background: #f8f9fa; color: #6c757d; border-color: #e9ecef; } &:focus { border-color: #007bff; box-shadow: 0 0 0 4rpx rgba(0, 123, 255, 0.1); outline: none; } &::placeholder { color: #adb5bd; } } } } /* è¡¨æ ¼ä¼å */ .table-container { .table-header { margin-bottom: 24rpx; padding-bottom: 16rpx; border-bottom: 2rpx solid #e9ecef; display: flex; justify-content: space-between; align-items: center; .section-title { font-size: 32rpx; color: #212529; font-weight: 700; position: relative; padding-left: 24rpx; &::before { content: ""; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 4rpx; height: 28rpx; background: linear-gradient(135deg, #007bff, #0056b3); border-radius: 2rpx; } } .table-tip { .tip-text { font-size: 22rpx; color: #6c757d; background: #f8f9fa; padding: 8rpx 16rpx; border-radius: 16rpx; border: 1rpx solid #e9ecef; } } } .table-wrapper { position: relative; border-radius: 8rpx; overflow: hidden; border: 1rpx solid #dee2e6; display: flex; } .table-scroll { flex: 1; overflow-x: auto; white-space: nowrap; } .custom-table { border: none; min-width: 780rpx; .table-header-row { background: linear-gradient(135deg, #f8f9fa, #e9ecef); .th { font-size: 26rpx; color: #495057; font-weight: 600; padding: 0 8rpx; height: 68rpx; line-height: 68rpx; background: transparent !important; border-right: 1rpx solid #dee2e6; white-space: nowrap; min-width: 80rpx; &:last-child { border-right: none; } } } .table-row { transition: background-color 0.2s ease; &:nth-child(even) { background: #f8f9fa; } &:hover { background: #e3f2fd; } .uni-td { padding: 0 8rpx; height: 68rpx; border-color: #dee2e6 !important; border-right: 1rpx solid #dee2e6; white-space: nowrap; min-width: 80rpx; vertical-align: middle; &:last-child { border-right: none; } .cell-content { font-size: 24rpx; color: #495057; line-height: 68rpx; max-width: 100%; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; height: 68rpx; &.quantity { font-weight: 600; color: #007bff; background: linear-gradient(135deg, #e3f2fd, #bbdefb); padding: 8rpx 16rpx; border-radius: 12rpx; display: inline-block; min-width: 60rpx; text-align: center; } } .description-text { font-size: 24rpx; color: #6c757d; font-weight: 500; line-height: 68rpx; display: flex; align-items: center; height: 68rpx; } } } } /* å³åºå®æ¬æµ®å é¤å */ .fixed-delete-column { flex-shrink: 0; width: 100rpx; background: #ffffff; border-left: 1rpx solid #dee2e6; box-shadow: -4rpx 0 8rpx rgba(0, 0, 0, 0.05); .fixed-header { height: 68rpx; background: linear-gradient(135deg, #f8f9fa, #e9ecef); display: flex; align-items: center; justify-content: center; border-bottom: 1rpx solid #dee2e6; .fixed-header-text { font-size: 26rpx; color: #495057; font-weight: 600; } } .fixed-content { .fixed-delete-item { height: 68rpx; display: flex; align-items: center; justify-content: center; border-bottom: 1rpx solid #dee2e6; transition: background-color 0.2s ease; &.even { background: #f8f9fa; } &:hover { background: #e3f2fd; } &:last-child { border-bottom: none; } } } } } /* å é¤å¾æ ä¼å */ .delete-icon { cursor: pointer; color: #dc3545; transition: all 0.3s ease; padding: 12rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; min-width: 48rpx; min-height: 48rpx; &:hover { color: #c82333; background: rgba(220, 53, 69, 0.1); transform: scale(1.1); } &:active { transform: scale(0.95); background: rgba(220, 53, 69, 0.2); } } /* æé®ä¼å */ .action-buttons-container { display: flex; justify-content: center; margin-top: 48rpx; padding: 0 24rpx; .plus-button { width: 100%; max-width: 600rpx; height: 96rpx; background: linear-gradient(135deg, #007bff, #0056b3); border-radius: 12rpx; border: 2rpx solid #007bff; cursor: pointer; display: flex; justify-content: center; align-items: center; color: #ffffff; font-size: 32rpx; font-weight: 600; box-shadow: 0 8rpx 24rpx rgba(0, 123, 255, 0.3); transition: all 0.3s ease; position: relative; overflow: hidden; text-align: center; /* ç¡®ä¿æé®å¯ç¹å» */ -webkit-tap-highlight-color: transparent; -webkit-user-select: none; user-select: none; text { color: #ffffff; font-size: 32rpx; font-weight: 600; line-height: 1; } &::before { content: ""; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent); transition: left 0.5s ease; } &:active { transform: scale(0.98); box-shadow: 0 4rpx 12rpx rgba(0, 123, 255, 0.4); &::before { left: 100%; } } &.submitting { background: linear-gradient(135deg, #6c757d, #5a6268); cursor: not-allowed; &::before { display: none; } } /* æ¬åææ */ &:hover:not(.submitting) { background: linear-gradient(135deg, #0056b3, #004085); border-color: #0056b3; box-shadow: 0 12rpx 32rpx rgba(0, 123, 255, 0.4); transform: translateY(-2rpx); } } } /* æ°éæ¾ç¤ºä¼å */ .form-group { &:nth-child(5) .form-input { font-weight: 600; color: #007bff; background: linear-gradient(135deg, #e3f2fd, #bbdefb); border: 2rpx solid #007bff; text-align: center; } } /* æ«ç è¾å ¥æ¡æ ·å¼ */ .input-with-scan { display: flex; align-items: center; gap: 16rpx; .scan-input { flex: 1; } .scan-button { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 16rpx 20rpx; background: linear-gradient(135deg, #e3f2fd, #bbdefb); border: 2rpx solid #007bff; border-radius: 8rpx; min-width: 120rpx; height: 92rpx; cursor: pointer; transition: all 0.3s ease; &:hover { background: linear-gradient(135deg, #bbdefb, #90caf9); transform: translateY(-2rpx); box-shadow: 0 4rpx 12rpx rgba(0, 123, 255, 0.2); } &:active { transform: translateY(0); box-shadow: 0 2rpx 6rpx rgba(0, 123, 255, 0.3); } .scan-text { font-size: 22rpx; color: #007bff; font-weight: 600; margin-top: 4rpx; } } } /* ææºç«¯ååºå¼ä¼å */ @media (max-width: 768px) { .container { padding: 16rpx; } .card { padding: 24rpx; margin-bottom: 16rpx; } .form-container .form-grid { grid-template-columns: 1fr; gap: 20rpx; } .form-group .form-label { font-size: 26rpx; } .form-group .form-input { height: 84rpx; font-size: 26rpx; padding: 0 20rpx; } .scan-button { min-width: 100rpx !important; height: 84rpx !important; padding: 12rpx 16rpx !important; .scan-text { font-size: 20rpx !important; } } .table-scroll { flex: 1; } .fixed-delete-column { width: 80rpx; flex-shrink: 0; .fixed-header { height: 60rpx; .fixed-header-text { font-size: 22rpx; } } .fixed-content .fixed-delete-item { height: 60rpx; } } .custom-table { .th { font-size: 22rpx; padding: 0 6rpx; height: 60rpx; line-height: 60rpx; } .uni-td { padding: 0 6rpx; height: 60rpx; .cell-content { font-size: 22rpx; line-height: 60rpx; height: 60rpx; } .description-text { line-height: 60rpx; height: 60rpx; } } } .delete-icon { padding: 8rpx; min-width: 40rpx; min-height: 40rpx; } .plus-button { height: 88rpx; font-size: 30rpx; border-radius: 8rpx; text { font-size: 30rpx; color: #ffffff; } &.submitting text { color: #ffffff; } } } /* å¼ºå¶æé®æ ·å¼ - è§£å³ææºç«¯æ¾ç¤ºé®é¢ */ .plus-button { background: #007bff !important; background: linear-gradient(135deg, #007bff, #0056b3) !important; border: 2rpx solid #007bff !important; border-radius: 12rpx !important; color: #ffffff !important; font-size: 32rpx !important; font-weight: 600 !important; box-shadow: 0 8rpx 24rpx rgba(0, 123, 255, 0.3) !important; width: 100% !important; max-width: 600rpx !important; height: 96rpx !important; display: flex !important; justify-content: center !important; align-items: center !important; text-align: center !important; } .plus-button text { color: #ffffff !important; font-size: 32rpx !important; font-weight: 600 !important; } .plus-button.submitting { background: #6c757d !important; background: linear-gradient(135deg, #6c757d, #5a6268) !important; border-color: #6c757d !important; } .plus-button.submitting text { color: #ffffff !important; } /* ææºç«¯æé®å¼ºå¶æ ·å¼ */ @media (max-width: 768px) { .plus-button { background: #007bff !important; background: linear-gradient(135deg, #007bff, #0056b3) !important; border: 2rpx solid #007bff !important; border-radius: 8rpx !important; height: 88rpx !important; font-size: 30rpx !important; } .plus-button text { color: #ffffff !important; font-size: 30rpx !important; font-weight: 600 !important; } .plus-button.submitting text { color: #ffffff !important; font-size: 30rpx !important; } } </style> pages/QC/OQC/detail.vue
@@ -1,828 +1,935 @@ <template> <view class="page-container"> <!-- æ£éªé¡¹ç®è¡¨åå¡ç --> <view class="form-card"> <view class="form-title"> <view class="title-icon">ð</view> <span>æ£éªé¡¹ç®è¯¦æ </span> </view> <view class="form-container"> <!-- åºæ¬ä¿¡æ¯æ¨¡å --> <view class="form-section"> <view class="section-title">åºæ¬ä¿¡æ¯</view> <view class="form-grid"> <view class="form-group"> <label class="form-label">项ç®åç§°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fcheckItem" /> </view> <view class="form-group"> <label class="form-label">è§æ ¼è¦æ±:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fspecRequ" /> </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.fcheckTool" /> </view> </view> </view> <view class="page-container"> <!-- æ£éªé¡¹ç®è¡¨åå¡ç --> <view class="form-card"> <view class="form-title"> <view class="title-icon">ð</view> <span>æ£éªé¡¹ç®è¯¦æ </span> </view> <view class="form-container"> <!-- åºæ¬ä¿¡æ¯æ¨¡å --> <view class="form-section"> <view class="section-title">åºæ¬ä¿¡æ¯</view> <view class="form-grid"> <view class="form-group"> <label class="form-label">项ç®åç§°:</label> <input v-model="formData.fcheckItem" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">è§æ ¼è¦æ±:</label> <input v-model="formData.fspecRequ" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ¹æ³:</label> <input v-model="formData.inspectionMethod" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">æ£éªå·¥å ·:</label> <input v-model="formData.fcheckTool" class="form-input" disabled="true" type="text"/> </view> </view> </view> <!-- ä¸ä¸ªæ¨¡åå¹¶åå®¹å¨ --> <view class="three-modules-container"> <!-- æ£éªåæ°æ¨¡å --> <view class="module-item"> <view class="module-header"> <text class="module-title">æ£éªåæ°</text> </view> <view class="module-content"> <view class="form-grid"> <view class="form-group"> <label class="form-label">æ£éªæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.checkQyt" /> </view> <view class="form-group"> <label class="form-label">æ£éªæ åç¼ç :</label> <input class="form-input" disabled="true" type="text" v-model="formData.sampleSizeNo" /> </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> </view> </view> <!-- ä¸ä¸ªæ¨¡åå¹¶åå®¹å¨ --> <view class="three-modules-container"> <!-- æ£éªåæ°æ¨¡å --> <view class="module-item"> <view class="module-header"> <text class="module-title">æ£éªåæ°</text> </view> <view class="module-content"> <view class="form-grid"> <view class="form-group"> <label class="form-label">æ£éªæ°:</label> <input v-model="formData.checkQyt" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ åç¼ç :</label> <input v-model="formData.sampleSizeNo" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">æ£éªæ°´å¹³:</label> <input v-model="formData.fcheckLevel" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">æ¥æ¶æ°´å¹³:</label> <input v-model="formData.facLevel" class="form-input" disabled="true" type="text"/> </view> </view> </view> </view> <!-- æ°å¼æ 忍¡å --> <view class="module-item"> <view class="module-header"> <text class="module-title">æ°å¼æ å</text> </view> <view class="module-content"> <view class="form-grid"> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fdownAllow" /> </view> <view class="form-group"> <label class="form-label">æ åå¼:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fstand" /> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fupAllow" /> </view> </view> </view> </view> <!-- æ°å¼æ 忍¡å --> <view class="module-item"> <view class="module-header"> <text class="module-title">æ°å¼æ å</text> </view> <view class="module-content"> <view class="form-grid"> <view class="form-group"> <label class="form-label">ä¸é:</label> <input v-model="formData.fdownAllow" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">æ åå¼:</label> <input v-model="formData.fstand" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">ä¸é:</label> <input v-model="formData.fupAllow" class="form-input" disabled="true" type="text"/> </view> </view> </view> </view> <!-- å¤å®æ 忍¡å --> <view class="module-item"> <view class="module-header"> <text class="module-title">å¤å®æ å</text> </view> <view class="module-content"> <view class="form-grid"> <view class="form-group"> <label class="form-label">ACæ°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.facQty" /> </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.fngQty" /> </view> <view class="form-group"> <label class="form-label">é¢è§ç»æ:</label> <input class="form-input" disabled="true" type="text" v-model="formData.fcheckResu" /> </view> </view> </view> </view> </view> <!-- å¤å®æ 忍¡å --> <view class="module-item"> <view class="module-header"> <text class="module-title">å¤å®æ å</text> </view> <view class="module-content"> <view class="form-grid"> <view class="form-group"> <label class="form-label">ACæ°:</label> <input v-model="formData.facQty" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">REæ°:</label> <input v-model="formData.freQty" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">ä¸åæ ¼æ°:</label> <input v-model="formData.fngQty" class="form-input" disabled="true" type="text"/> </view> <view class="form-group"> <label class="form-label">é¢è§ç»æ:</label> <input v-model="formData.fcheckResu" class="form-input" disabled="true" type="text"/> </view> </view> </view> </view> </view> <!-- 夿³¨ä¿¡æ¯æ¨¡å --> <!-- <view class="form-section"> <view class="section-title">夿³¨ä¿¡æ¯</view> <view class="form-grid"> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks" /> </view> </view> </view> --> <!-- 夿³¨ä¿¡æ¯æ¨¡å --> <!-- <view class="form-section"> <view class="section-title">夿³¨ä¿¡æ¯</view> <view class="form-grid"> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" disabled="true" type="text" v-model="formData.remarks" /> </view> </view> </view> --> <!-- æ£æµç»æåºå --> <view class="form-section"> <view class="section-title">æ£æµç»æ</view> <view class="form-grid"> <view class="form-group"> <label class="form-label">æ£æµç»æ:</label> <input class="form-input" type="number" v-model="fcheckResuK" /> </view> <!-- æ£æµç»æåºå --> <view class="form-section"> <view class="section-title">æ£æµç»æ</view> <view class="form-grid"> <view class="form-group"> <label class="form-label">æ£æµç»æ:</label> <input v-model="fcheckResuK" class="form-input" type="number"/> </view> <!-- æç¤ºè¯ä½ä¸ºæ£æµç»æçæç¤º --> <view class="form-group tip-group"> <view class="tip-box"> <view class="tip-icon">â ï¸</view> <view class="tip-text">没ææå¤§å¼åæå°å¼æ¶å¡«å<span class="highlight">0ï¼æªéè¿æ£éªï¼</span>æ<span class="highlight">1ï¼éè¿æ£éªï¼</span></view> </view> </view> </view> </view> <!-- æç¤ºè¯ä½ä¸ºæ£æµç»æçæç¤º --> <view class="form-group tip-group"> <view class="tip-box"> <view class="tip-icon">â ï¸</view> <view class="tip-text">没ææå¤§å¼åæå°å¼æ¶å¡«å<span class="highlight">0ï¼æªéè¿æ£éªï¼</span>æ<span class="highlight">1ï¼éè¿æ£éªï¼</span></view> </view> </view> </view> </view> <button :class="['action-btn', 'btn-primary', { 'btn-loading': isLoading }]" v-if="tableData.length < formData.checkQyt" @click="submit" :disabled="isLoading"> {{ isLoading ? 'ä¿åä¸...' : 'ä¿å' }} </button> </view> </view> <button v-if="tableData.length < formData.checkQyt" :class="['action-btn', 'btn-primary', { 'btn-loading': isLoading }]" :disabled="isLoading" @click="submit"> {{ isLoading ? 'ä¿åä¸...' : 'ä¿å' }} </button> </view> </view> <!-- æ£éªç»æè¡¨æ ¼å¡ç --> <view class="table-card"> <view class="table-title"> <view class="title-icon">ð</view> <span>æ£éªç»æå表</span> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th width="80" align="center" class="th">ç¼å·</uni-th> <uni-th width="120" align="center" class="th">å¤å®æ è¯</uni-th> <uni-th width="100" align="center" class="th">æ£éªç»æ</uni-th> <uni-th width="120" align="center" class="th">æä½</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index" class="table-row" :class="{ 'hover-effect': isHoveringRow === index }" @mouseenter="isHoveringRow = index" @mouseleave="isHoveringRow = -1"> <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"> <span class="result-badge" :class="{ 'pass': item.fcheckResu === 'OK', 'fail': item.fcheckResu === 'NG' }"> <!-- æ£éªç»æè¡¨æ ¼å¡ç --> <view class="table-card"> <view class="table-title"> <view class="title-icon">ð</view> <span>æ£éªç»æå表</span> </view> <view class="list-container"> <uni-table ref="table" border emptyText="ææ æ´å¤æ°æ®"> <uni-tr> <uni-th align="center" class="th" width="80">ç¼å·</uni-th> <uni-th align="center" class="th" width="120">å¤å®æ è¯</uni-th> <uni-th align="center" class="th" width="100">æ£éªç»æ</uni-th> <uni-th align="center" class="th" width="120">æä½</uni-th> </uni-tr> <uni-tr v-for="(item, index) in tableData" :key="index" :class="{ 'hover-effect': isHoveringRow === index }" class="table-row" @mouseenter="isHoveringRow = index" @mouseleave="isHoveringRow = -1"> <uni-td align="center"> {{ index + 1 }} </uni-td> <uni-td align="center"> <input v-model="item.fstand" class="form-input" disabled="true" type="text"/> </uni-td> <uni-td align="center"> <span :class="{ 'pass': item.fcheckResu === 'OK', 'fail': item.fcheckResu === 'NG' }" class="result-badge"> {{ item.fcheckResu || 'æªæ£éª' }} </span> </uni-td> <uni-td align="center"> <view class="action-group"> <button :class="['action-btn', 'btn-sm', 'btn-warn', { 'btn-disabled': isLoading }]" v-if="isNumber" @click="toDetail(item)" :disabled="isLoading"> {{ isLoading ? 'å¤çä¸...' : 'ä¿®æ¹' }} </button> <button :class="['action-btn', 'btn-sm', 'btn-warn', { 'btn-disabled': isLoading }]" v-if="!isNumber" @click="numberEdit(item)" :disabled="isLoading"> {{ isLoading ? 'å¤çä¸...' : editResult(item.fcheckResu) }} </button> </view> </uni-td> </uni-tr> </uni-table> </view> </view> </uni-td> <uni-td align="center"> <view class="action-group"> <button v-if="isNumber" :class="['action-btn', 'btn-sm', 'btn-warn', { 'btn-disabled': isLoading }]" :disabled="isLoading" @click="toDetail(item)"> {{ isLoading ? 'å¤çä¸...' : 'ä¿®æ¹' }} </button> <button v-if="!isNumber" :class="['action-btn', 'btn-sm', 'btn-warn', { 'btn-disabled': isLoading }]" :disabled="isLoading" @click="numberEdit(item)"> {{ isLoading ? 'å¤çä¸...' : editResult(item.fcheckResu) }} </button> </view> </uni-td> </uni-tr> </uni-table> </view> </view> <!-- æä½æé® --> <view class="action-buttons"> <view class="button-group"> <button :class="['action-btn', 'btn-warn', { 'btn-disabled': isLoading }]" @click="saveRemarks" :disabled="isLoading"> {{ isLoading ? 'å¤çä¸...' : 'æ·»å ä¸åæ ¼æè¿°' }} </button> </view> </view> <!-- æä½æé® --> <view class="action-buttons"> <view class="button-group"> <button :class="['action-btn', 'btn-warn', { 'btn-disabled': isLoading }]" :disabled="isLoading" @click="saveRemarks"> {{ isLoading ? 'å¤çä¸...' : 'æ·»å ä¸åæ ¼æè¿°' }} </button> </view> </view> <!-- ä¿®æ¹æ£éªç»æå¼¹åºå± --> <view v-if="showPopup" class="overlay active"> <view class="popup" :class="{ 'popup-scale': isPopupAnimated }" @animationend="isPopupAnimated = false"> <view class="popup-header"> <h3 class="popup-title">ä¿®æ¹æ£éªç»æ</h3> <view class="close-btn" @click="showPopup = !showPopup">Ã</view> </view> <form :modelValue="editData"> <view class="form-group"> <label class="form-label">æ£éªç»æ:</label> <input class="form-input" type="text" v-model="editData.fcheckResu" /> </view> <view class="button-group"> <button :class="['action-btn', 'btn-warn', { 'btn-loading': isEditLoading }]" @click="eidt" :disabled="isEditLoading"> {{ isEditLoading ? 'ä¿®æ¹ä¸...' : 'ä¿®æ¹' }} </button> <button @click="showPopup = !showPopup"> åæ¶ </button> </view> </form> </view> </view> <!-- ä¿®æ¹æ£éªç»æå¼¹åºå± --> <view v-if="showPopup" class="overlay active"> <view :class="{ 'popup-scale': isPopupAnimated }" class="popup" @animationend="isPopupAnimated = false"> <view class="popup-header"> <h3 class="popup-title">ä¿®æ¹æ£éªç»æ</h3> <view class="close-btn" @click="showPopup = !showPopup">Ã</view> </view> <form :modelValue="editData"> <view class="form-group"> <label class="form-label">æ£éªç»æ:</label> <input v-model="editData.fcheckResu" class="form-input" type="text"/> </view> <view class="button-group"> <button :class="['action-btn', 'btn-warn', { 'btn-loading': isEditLoading }]" :disabled="isEditLoading" @click="eidt"> {{ isEditLoading ? 'ä¿®æ¹ä¸...' : 'ä¿®æ¹' }} </button> <button @click="showPopup = !showPopup"> åæ¶ </button> </view> </form> </view> </view> <!-- ä¿®æ¹ä¸åæ ¼æè¿°å¼¹åºå± --> <view v-if="remarksPopup" class="overlay active"> <view class="popup" :class="{ 'popup-scale': isPopupAnimated }" @animationend="isPopupAnimated = false"> <view class="popup-header"> <h3 class="popup-title">ä¿®æ¹ä¸åæ ¼æè¿°</h3> <view class="close-btn" @click="remarksPopup = !remarksPopup">Ã</view> </view> <form> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input class="form-input" type="text" v-model="remarks" /> </view> <view class="button-group"> <button :class="['action-btn', 'btn-warn', { 'btn-loading': isRemarksLoading }]" @click="editRemarks" :disabled="isRemarksLoading"> {{ isRemarksLoading ? 'ä¿åä¸...' : 'ä¿®æ¹' }} </button> <button @click="remarksPopup = !remarksPopup"> åæ¶ </button> </view> </form> </view> </view> </view> <!-- ä¿®æ¹ä¸åæ ¼æè¿°å¼¹åºå± --> <view v-if="remarksPopup" class="overlay active"> <view :class="{ 'popup-scale': isPopupAnimated }" class="popup" @animationend="isPopupAnimated = false"> <view class="popup-header"> <h3 class="popup-title">ä¿®æ¹ä¸åæ ¼æè¿°</h3> <view class="close-btn" @click="remarksPopup = !remarksPopup">Ã</view> </view> <form> <view class="form-group"> <label class="form-label">ä¸åæ ¼æè¿°:</label> <input v-model="remarks" class="form-input" type="text"/> </view> <view class="button-group"> <button :class="['action-btn', 'btn-warn', { 'btn-loading': isRemarksLoading }]" :disabled="isRemarksLoading" @click="editRemarks"> {{ isRemarksLoading ? 'ä¿åä¸...' : 'ä¿®æ¹' }} </button> <button @click="remarksPopup = !remarksPopup"> åæ¶ </button> </view> </form> </view> </view> </view> </template> <script> export default { data() { return { formData: {}, releaseNo: "", isNumber: false, checkItem: "", id: 0, gid: 0, billNo: "", showPopup: false, editData: {}, tableData: [], remarks: "", remarksPopup: false, fcheckResuK: "", isLoading: false, isEditLoading: false, isRemarksLoading: false, isHoveringRow: -1, isPopupAnimated: false }; }, methods: { editResult(fcheckResu) { if (fcheckResu == "OK") { return "æ¹ä¸ºä¸åæ ¼"; } else { return "æ¹ä¸ºåæ ¼"; } }, submit() { this.isLoading = true; let count = this.formData.checkQyt; let fstand = "â"; if (Number(this.formData.fupAllow) && Number(this.formData.fdownAllow)) { if (!this.fcheckResuK) { this.$showMessage("请è¾å ¥æ£éªå¼"); this.isLoading = false; return; } if ( Number(this.fcheckResuK) >= Number(this.formData.fdownAllow) && Number(this.fcheckResuK) <= Number(this.formData.fupAllow) ) { fstand = "â"; } else { fstand = "Ã"; } count = 1; } else { if (!this.fcheckResuK) { this.formData.fcheckResu = 1; } if (this.fcheckResuK == 0 || this.fcheckResuK == 1) { this.formData.isPass = this.fcheckResuK; } else { this.$showMessage("æ æ å弿¶ï¼æ£éªç»æåªè½ä¸º0æ1!"); this.isLoading = false; return; } count = count - this.tableData.length; } this.formData.updater = this.$loginInfo.account; this.$post({ url: "/LLJ/SetQSItemDetail", data: { mainId: this.formData.id, releaseNo: this.formData.releaseNo, fstand: fstand, fcheckResu: this.fcheckResuK, LastupdateBy: this.$loginInfo.account, count: count } }).then((res) => { this.formData.fcheckResu = null; this.$showMessage("ä¿åæå"); this.refreshResult(); this.isLoading = false; }).catch(() => { this.$showMessage("ä¿å失败ï¼è¯·éè¯"); this.isLoading = false; }); }, refreshResult() { this.isLoading = true; this.$post({ url: "/MesOqcItemsDetect02/getXjDetail02ById", data: { id: this.id } }).then((res) => { this.formData = res.data.tbBillList.itemXj01; this.tableData = res.data.tbBillList.itemXj02s; if (this.formData.fupAllow && this.formData.fdownAllow && this.formData.fstand) { this.isNumber = true; } else { this.isNumber = false; } this.isLoading = false; }).catch(() => { this.$showMessage("è·åæ°æ®å¤±è´¥"); this.isLoading = false; }); }, toDetail(item) { this.showPopup = true; this.editData = { ...item }; }, eidt() { this.isEditLoading = true; if (!this.editData.fcheckResu) { this.$showMessage("请è¾å ¥æ£éªç»æ"); this.isEditLoading = false; return; } if (this.formData.fcheckResu == this.editData.fcheckResu) { this.$showMessage("ä¿®æ¹æå"); this.showPopup = false; this.isEditLoading = false; return; } let fstand = "â"; if (this.formData.fupAllow && this.formData.fdownAllow) { if (!this.editData.fcheckResu) { this.$showMessage("请è¾å ¥æ£éªå¼"); this.isEditLoading = false; return; } if ( Number(this.editData.fcheckResu) >= Number(this.formData.fdownAllow) && Number(this.editData.fcheckResu) <= Number(this.formData.fupAllow) ) { this.editData.isPass = 1; fstand = "â"; } else { this.editData.isPass = 0; fstand = "Ã"; } } else { if (!this.editData.fcheckResu) { this.editData.fcheckResu = 1; } if (this.editData.fcheckResu == 0 || this.editData.fcheckResu == 1) { if (this.editData.fcheckResu == 0) { fstand = "Ã"; } } else { this.$showMessage("æ æ å弿¶ï¼æ£éªç»æåªè½ä¸º0æ1!"); this.isEditLoading = false; return; } } this.editData.updater = this.$loginInfo.account; this.$post({ url: "/MesOqcItemsDetect02/UpdateQSItemDetail", data: { id: this.editData.id, mainId: this.formData.id, releaseNo: this.formData.releaseNo, fstand: fstand, fcheckResu: this.editData.fcheckResu, lastupdateBy: this.$loginInfo.account } }).then((res) => { this.showPopup = false; this.$showMessage("ä¿®æ¹æå"); this.refreshResult(); this.isEditLoading = false; }).catch(() => { this.$showMessage("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); this.isEditLoading = false; }); }, numberEdit(item) { this.isLoading = true; let fstand = "â"; let fcheckResu = "OK"; if (item.fcheckResu == "OK") { fstand = "Ã"; fcheckResu = "NG"; } this.$post({ url: "/MesOqcItemsDetect02/UpdateQSItemDetail", data: { id: item.id, mainId: this.formData.id, releaseNo: this.formData.releaseNo, fstand: fstand, fcheckResu: fcheckResu, lastupdateBy: this.$loginInfo.account } }).then((res) => { this.$showMessage("ä¿®æ¹æå"); this.refreshResult(); this.isLoading = false; }).catch(() => { this.$showMessage("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); this.isLoading = false; }); }, saveRemarks() { this.remarksPopup = true; this.remarks = this.formData.remarks || ""; }, editRemarks() { this.isRemarksLoading = true; if (this.remarks) { this.$post({ url: "/MesOqcItemsDetect02/saveRemarksPid", data: { pid: this.formData.id, remarks: this.remarks } }).then((res) => { if (res.data.tbBillList > 0) { this.formData.remarks = this.remarks; this.remarksPopup = false; this.$showMessage("ä¿åæå"); } else { this.$showMessage("ä¿å失败"); } this.isRemarksLoading = false; }).catch(() => { this.$showMessage("ä¿å失败ï¼è¯·éè¯"); this.isRemarksLoading = false; }); } else { this.$showMessage("请è¾å ¥ä¸åæ ¼æè¿°"); this.isRemarksLoading = false; } } }, onLoad(options) { let params = options; this.id = params["mainId"]; this.releaseNo = params["releaseNo"]; this.refreshResult(); } }; export default { data() { return { formData: {}, releaseNo: "", isNumber: false, checkItem: "", id: 0, gid: 0, billNo: "", showPopup: false, editData: {}, tableData: [], remarks: "", remarksPopup: false, fcheckResuK: "", isLoading: false, isEditLoading: false, isRemarksLoading: false, isHoveringRow: -1, isPopupAnimated: false }; }, methods: { editResult(fcheckResu) { if (fcheckResu == "OK") { return "æ¹ä¸ºä¸åæ ¼"; } else { return "æ¹ä¸ºåæ ¼"; } }, submit() { this.isLoading = true; let count = this.formData.checkQyt; let fstand = "â"; if (Number(this.formData.fupAllow) && Number(this.formData.fdownAllow)) { if (!this.fcheckResuK) { this.$showMessage("请è¾å ¥æ£éªå¼"); this.isLoading = false; return; } if ( Number(this.fcheckResuK) >= Number(this.formData.fdownAllow) && Number(this.fcheckResuK) <= Number(this.formData.fupAllow) ) { fstand = "â"; } else { fstand = "Ã"; } count = 1; } else { if (!this.fcheckResuK) { this.formData.fcheckResu = 1; } if (this.fcheckResuK == 0 || this.fcheckResuK == 1) { this.formData.isPass = this.fcheckResuK; } else { this.$showMessage("æ æ å弿¶ï¼æ£éªç»æåªè½ä¸º0æ1!"); this.isLoading = false; return; } count = count - this.tableData.length; } this.formData.updater = this.$loginInfo.account; this.$post({ url: "/LLJ/SetQSItemDetail", data: { mainId: this.formData.id, releaseNo: this.formData.releaseNo, fstand: fstand, fcheckResu: this.fcheckResuK, LastupdateBy: this.$loginInfo.account, count: count } }).then((res) => { this.formData.fcheckResu = null; this.$showMessage("ä¿åæå"); this.refreshResult(); this.isLoading = false; }).catch(() => { this.$showMessage("ä¿å失败ï¼è¯·éè¯"); this.isLoading = false; }); }, refreshResult() { this.isLoading = true; this.$post({ url: "/MesOqcItemsDetect02/getXjDetail02ById", data: { id: this.id } }).then((res) => { this.formData = res.data.tbBillList.itemXj01; this.tableData = res.data.tbBillList.itemXj02s; if (this.formData.fupAllow && this.formData.fdownAllow && this.formData.fstand) { this.isNumber = true; } else { this.isNumber = false; } this.isLoading = false; }).catch(() => { this.$showMessage("è·åæ°æ®å¤±è´¥"); this.isLoading = false; }); }, toDetail(item) { this.showPopup = true; this.editData = { ...item }; }, eidt() { this.isEditLoading = true; if (!this.editData.fcheckResu) { this.$showMessage("请è¾å ¥æ£éªç»æ"); this.isEditLoading = false; return; } if (this.formData.fcheckResu == this.editData.fcheckResu) { this.$showMessage("ä¿®æ¹æå"); this.showPopup = false; this.isEditLoading = false; return; } let fstand = "â"; if (this.formData.fupAllow && this.formData.fdownAllow) { if (!this.editData.fcheckResu) { this.$showMessage("请è¾å ¥æ£éªå¼"); this.isEditLoading = false; return; } if ( Number(this.editData.fcheckResu) >= Number(this.formData.fdownAllow) && Number(this.editData.fcheckResu) <= Number(this.formData.fupAllow) ) { this.editData.isPass = 1; fstand = "â"; } else { this.editData.isPass = 0; fstand = "Ã"; } } else { if (!this.editData.fcheckResu) { this.editData.fcheckResu = 1; } if (this.editData.fcheckResu == 0 || this.editData.fcheckResu == 1) { if (this.editData.fcheckResu == 0) { fstand = "Ã"; } } else { this.$showMessage("æ æ å弿¶ï¼æ£éªç»æåªè½ä¸º0æ1!"); this.isEditLoading = false; return; } } this.editData.updater = this.$loginInfo.account; this.$post({ url: "/MesOqcItemsDetect02/UpdateQSItemDetail", data: { id: this.editData.id, mainId: this.formData.id, releaseNo: this.formData.releaseNo, fstand: fstand, fcheckResu: this.editData.fcheckResu, lastupdateBy: this.$loginInfo.account } }).then((res) => { this.showPopup = false; this.$showMessage("ä¿®æ¹æå"); this.refreshResult(); this.isEditLoading = false; }).catch(() => { this.$showMessage("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); this.isEditLoading = false; }); }, numberEdit(item) { this.isLoading = true; let fstand = "â"; let fcheckResu = "OK"; if (item.fcheckResu == "OK") { fstand = "Ã"; fcheckResu = "NG"; } this.$post({ url: "/MesOqcItemsDetect02/UpdateQSItemDetail", data: { id: item.id, mainId: this.formData.id, releaseNo: this.formData.releaseNo, fstand: fstand, fcheckResu: fcheckResu, lastupdateBy: this.$loginInfo.account } }).then((res) => { this.$showMessage("ä¿®æ¹æå"); this.refreshResult(); this.isLoading = false; }).catch(() => { this.$showMessage("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); this.isLoading = false; }); }, saveRemarks() { this.remarksPopup = true; this.remarks = this.formData.remarks || ""; }, editRemarks() { this.isRemarksLoading = true; if (this.remarks) { this.$post({ url: "/MesOqcItemsDetect02/saveRemarksPid", data: { pid: this.formData.id, remarks: this.remarks } }).then((res) => { if (res.data.tbBillList > 0) { this.formData.remarks = this.remarks; this.remarksPopup = false; this.$showMessage("ä¿åæå"); } else { this.$showMessage("ä¿å失败"); } this.isRemarksLoading = false; }).catch(() => { this.$showMessage("ä¿å失败ï¼è¯·éè¯"); this.isRemarksLoading = false; }); } else { this.$showMessage("请è¾å ¥ä¸åæ ¼æè¿°"); this.isRemarksLoading = false; } } }, onLoad(options) { let params = options; this.id = params["mainId"]; this.releaseNo = params["releaseNo"]; this.refreshResult(); } }; </script> <style> /* 页é¢å®¹å¨ */ .page-container { padding: 20px; background-color: #f5f5f5; min-height: 100vh; } /* 页é¢å®¹å¨ */ .page-container { padding: 20px; background-color: #f5f5f5; min-height: 100vh; } /* 表åå¡ç */ .form-card { background-color: #fff; border-radius: 12px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* 表åå¡ç */ .form-card { background-color: #fff; border-radius: 12px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* è¡¨åæ é¢ */ .form-title { display: flex; align-items: center; font-size: 18px; color: #333; margin-bottom: 15px; } /* è¡¨åæ é¢ */ .form-title { display: flex; align-items: center; font-size: 18px; color: #333; margin-bottom: 15px; } .title-icon { font-size: 22px; margin-right: 10px; } .title-icon { font-size: 22px; margin-right: 10px; } /* 表åå®¹å¨ */ .form-container { padding-top: 10px; } /* 表åå®¹å¨ */ .form-container { padding-top: 10px; } /* è¡¨åæ¨¡åæ é¢ */ .form-section { margin-bottom: 20px; } /* è¡¨åæ¨¡åæ é¢ */ .form-section { margin-bottom: 20px; } .section-title { font-size: 16px; font-weight: 600; color: #333; margin-bottom: 10px; } .section-title { font-size: 16px; font-weight: 600; color: #333; margin-bottom: 10px; } /* è¡¨æ ¼å¸å± */ .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; } /* è¡¨æ ¼å¸å± */ .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; } /* 表å项 */ .form-group { display: flex; align-items: center; } /* 表å项 */ .form-group { display: flex; align-items: center; } .form-label { width: 130px; color: #333; font-size: 14px; font-weight: 500; } .form-label { width: 130px; color: #333; font-size: 14px; font-weight: 500; } .form-input { flex: 1; height: 40px; padding: 0 10px; border: 1px solid #e0e0e0; border-radius: 8px; background-color: #f8f8f8; color: #666; font-size: 14px; } .form-input { flex: 1; height: 40px; padding: 0 10px; border: 1px solid #e0e0e0; border-radius: 8px; background-color: #f8f8f8; color: #666; font-size: 14px; } .form-input:disabled { background-color: #e9e9e9; } .form-input:disabled { background-color: #e9e9e9; } .form-input:focus { border-color: #007AFF; outline: none; } .form-input:focus { border-color: #007AFF; outline: none; } /* æ£éªç»æåºå */ .tip-group { margin-top: 15px; } /* æ£éªç»æåºå */ .tip-group { margin-top: 15px; } .tip-box { display: flex; align-items: center; background-color: #fff5d1; padding: 10px; border-radius: 8px; border: 1px solid #f0e0a7; } .tip-box { display: flex; align-items: center; background-color: #fff5d1; padding: 10px; border-radius: 8px; border: 1px solid #f0e0a7; } .tip-icon { font-size: 20px; color: #f39c12; margin-right: 10px; } .tip-icon { font-size: 20px; color: #f39c12; margin-right: 10px; } .tip-text { font-size: 14px; color: #333; } .tip-text { font-size: 14px; color: #333; } .highlight { color: #007AFF; font-weight: 600; } .highlight { color: #007AFF; font-weight: 600; } /* æé®æ ·å¼ */ .action-btn { width: 100%; padding: 12px; border-radius: 8px; border: none; color: #fff; font-size: 16px; font-weight: 500; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background-color 0.3s ease; } /* æé®æ ·å¼ */ .action-btn { width: 100%; padding: 12px; border-radius: 8px; border: none; color: #fff; font-size: 16px; font-weight: 500; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: background-color 0.3s ease; } .btn-primary { background-color: #007AFF; } .btn-primary { background-color: #007AFF; } .btn-primary:hover { background-color: #0056CC; } .btn-primary:hover { background-color: #0056CC; } .btn-warn { background-color: #f1b344; } .btn-warn { background-color: #f1b344; } .btn-warn:hover { background-color: #e6a135; } .btn-warn:hover { background-color: #e6a135; } .btn-disabled { background-color: #c0c0c0; cursor: not-allowed; } .btn-disabled { background-color: #c0c0c0; cursor: not-allowed; } /* å¼¹åºå±æ ·å¼ */ .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; opacity: 0; transition: opacity 0.3s ease; } /* å¼¹åºå±æ ·å¼ */ .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; opacity: 0; transition: opacity 0.3s ease; } .overlay.active { opacity: 1; } .overlay.active { opacity: 1; } .popup { background-color: #fff; border-radius: 12px; width: 90%; max-width: 500px; padding: 20px; transform: scale(0.8); transition: transform 0.3s ease; } .popup { background-color: #fff; border-radius: 12px; width: 90%; max-width: 500px; padding: 20px; transform: scale(0.8); transition: transform 0.3s ease; } .popup-scale { transform: scale(1); } .popup-scale { transform: scale(1); } .popup-header { display: flex; justify-content: space-between; align-items: center; } .popup-header { display: flex; justify-content: space-between; align-items: center; } .popup-title { font-size: 16px; font-weight: 600; color: #333; } .popup-title { font-size: 16px; font-weight: 600; color: #333; } .close-btn { font-size: 20px; color: #333; cursor: pointer; } .close-btn { font-size: 20px; color: #333; cursor: pointer; } /* æä½æé®ç» */ .button-group { display: flex; justify-content: space-between; margin-top: 20px; } /* æä½æé®ç» */ .button-group { display: flex; justify-content: space-between; margin-top: 20px; } .button-group button { width: 48%; padding: 10px; border-radius: 8px; border: none; font-size: 14px; font-weight: 500; cursor: pointer; } .button-group button { width: 48%; padding: 10px; border-radius: 8px; border: none; font-size: 14px; font-weight: 500; cursor: pointer; } /* æ£éªç»æè¡¨æ ¼å¡ç */ .table-card { background-color: #fff; border-radius: 12px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* æ£éªç»æè¡¨æ ¼å¡ç */ .table-card { background-color: #fff; border-radius: 12px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* è¡¨æ ¼æ é¢ */ .table-title { display: flex; align-items: center; font-size: 16px; color: #333; font-weight: 600; margin-bottom: 15px; } /* è¡¨æ ¼æ é¢ */ .table-title { display: flex; align-items: center; font-size: 16px; color: #333; font-weight: 600; margin-bottom: 15px; } .title-icon { font-size: 22px; margin-right: 10px; } .title-icon { font-size: 22px; margin-right: 10px; } /* è¡¨æ ¼æ ·å¼ */ .uni-table { width: 100%; border-collapse: collapse; } /* è¡¨æ ¼æ ·å¼ */ .uni-table { width: 100%; border-collapse: collapse; } .uni-th, .uni-td { padding: 12px; text-align: center; } .uni-th, .uni-td { padding: 12px; text-align: center; } .uni-th { background-color: #f5f5f5; font-size: 14px; color: #666; font-weight: 500; } .uni-th { background-color: #f5f5f5; font-size: 14px; color: #666; font-weight: 500; } .table-row { background-color: #fff; border-bottom: 1px solid #e0e0e0; } .table-row { background-color: #fff; border-bottom: 1px solid #e0e0e0; } .table-row:hover { background-color: #f9f9f9; } .table-row:hover { background-color: #f9f9f9; } .result-badge { padding: 5px 12px; font-size: 12px; border-radius: 10px; color: #fff; display: inline-block; } .result-badge { padding: 5px 12px; font-size: 12px; border-radius: 10px; color: #fff; display: inline-block; } .pass { background-color: #28a745; } .pass { background-color: #28a745; } .fail { background-color: #dc3545; } .fail { background-color: #dc3545; } .pending { background-color: #f1b344; } .pending { background-color: #f1b344; } .action-group { display: flex; gap: 10px; } .action-group { display: flex; gap: 10px; } .action-btn.btn-sm { width: auto; padding: 6px 12px; font-size: 12px; } .action-btn.btn-sm { width: auto; padding: 6px 12px; font-size: 12px; } /* æç¤ºä¿¡æ¯ */ .hover-effect:hover { background-color: #f9f9f9; } /* æç¤ºä¿¡æ¯ */ .hover-effect:hover { background-color: #f9f9f9; } .btn-sm { font-size: 14px; } .btn-sm { font-size: 14px; } .btn-loading { background-color: #c0c0c0; cursor: not-allowed; } .btn-loading { background-color: #c0c0c0; cursor: not-allowed; } /* ä¸ä¸ªæ¨¡åå¹¶å容卿 ·å¼ */ .three-modules-container { display: flex; flex-direction: column; gap: 15px; margin-bottom: 20px; } /* 模åé¡¹æ ·å¼ */ .module-item { background-color: #f8f9fa; border-radius: 8px; padding: 15px; border: 1px solid #e0e0e0; } .module-header { border-bottom: 1px solid #d0d0d0; padding-bottom: 8px; margin-bottom: 12px; } .module-title { font-size: 15px; font-weight: 600; color: #333; } /* ææºå±å¹ä¼å */ @media (max-width: 768px) { .page-container { padding: 10px; } .form-card, .table-card { padding: 15px; border-radius: 8px; } .form-grid { grid-template-columns: 1fr; gap: 12px; } .form-group { flex-direction: column; align-items: flex-start; } .form-label { width: auto; margin-bottom: 5px; font-size: 13px; } .form-input { width: 100%; height: 36px; font-size: 13px; } .three-modules-container { gap: 12px; } .module-item { padding: 12px; } .module-title { font-size: 14px; } .tip-box { padding: 8px; } .tip-text { font-size: 13px; } } /* è¶ å°å±å¹ä¼å */ @media (max-width: 480px) { .page-container { padding: 8px; } .form-card, .table-card { padding: 12px; } .form-input { height: 34px; font-size: 12px; } .form-label { font-size: 12px; } .action-btn { padding: 10px; font-size: 14px; } } </style>