From ef905a448385c2a78f3ebaa51d2420e1d7765bb9 Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期四, 24 七月 2025 23:30:14 +0800
Subject: [PATCH] 优化首检模块UI和功能

---
 pages/QC/SJ/detail.vue |   12 +-
 CLAUDE.md              |  122 ++++++++++++++++++++++++++++++
 pages/QC/SJ/List.vue   |   17 +++
 pages/QC/SJ/Add.vue    |   79 +++++++++++--------
 4 files changed, 187 insertions(+), 43 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..a7e52b7
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,122 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+This is a **uni-app** mobile application project for Quality Control (QC) and Warehouse management in a Manufacturing Execution System (MES). The application is built for PDA devices and supports quality inspection processes and warehouse operations.
+
+- **Framework**: uni-app (Vue 2.x based)
+- **App Name**: GS-MES-AP (骞挎繁绉戞妧 MES Application)  
+- **Target Platform**: Android mobile/PDA devices
+- **UI Framework**: uView UI library
+
+## Build and Development Commands
+
+This is a uni-app project that builds through HBuilderX IDE or uni-app CLI. The build output is generated in the `unpackage/` directory:
+
+- **Development Build**: Use HBuilderX IDE or `npm run dev:app-plus` for development
+- **Production Build**: APK files are generated in `unpackage/release/apk/`
+- **Cache**: Build cache and temporary files are stored in `unpackage/cache/`
+- **Testing**: Use HBuilderX IDE's built-in testing tools or deploy to PDA devices for testing
+
+**Note**: This project does not have traditional npm scripts. Development and building are primarily done through HBuilderX IDE.
+
+## Architecture Overview
+
+### Core Structure
+- **Entry Point**: `main.js` - Contains Vue prototypes, global mixins, and API configuration
+- **State Management**: `store/index.js` - Vuex store with server configuration and minimal state
+- **Routing**: `pages.json` - uni-app page configuration with tabBar navigation
+- **Global Config**: `manifest.json` - App configuration including permissions and build settings
+
+### Key Directories
+- `pages/BasePages/` - Core app pages (login, main menu, user profile)
+- `pages/QC/` - Quality Control modules (鏉ユ枡妫�楠� LLJ, 宸℃ XJ, 棣栨 SJ, 鍏ュ簱妫� RKJ)
+- `pages/Warehouse/` - Warehouse operations (inventory, purchasing, allocation)
+- `components/` - Reusable UI components and third-party integrations
+- `static/` - Static assets (images, audio files, CSS)
+- `uni_modules/` - uni-app plugin modules including uView UI
+
+### API Architecture
+- **Base API**: Configured in Vuex store with environment-specific URLs
+- **Request Methods**: Custom Vue prototypes (`$post`, `$get`, `$uni_request`) with loading states
+- **Authentication**: User login state managed globally via `$loginInfo`
+- **Error Handling**: Centralized error handling with toast messages
+
+### Main Features
+1. **Quality Control (QC)**:
+   - 鏉ユ枡妫�楠� (LLJ) - Incoming Material Inspection
+   - 宸℃ (XJ) - Patrol Inspection  
+   - 棣栨 (SJ) - First Article Inspection
+   - 鍏ュ簱妫� (RKJ) - Warehouse Inspection
+
+2. **Warehouse Operations**:
+   - Purchase inventory management
+   - Material allocation and transfers
+   - Barcode printing and scanning
+
+3. **Common Functions**:
+   - Barcode/QR code scanning
+   - Photo capture and upload
+   - Bluetooth printing integration
+   - Offline data synchronization
+
+### Navigation Structure
+- **Tab Bar**: 3 main tabs (棣栭〉/Home, 娑堟伅涓績/Message Center, 鎴戠殑/Profile)
+- **Menu System**: Dynamic menu loading based on user permissions via `$getUserMenu()`
+- **Page Flow**: List 鈫� Detail 鈫� Form pattern for most workflows
+
+## Development Guidelines
+
+### Server Configuration
+The app connects to different servers based on environment:
+- Development: `http://localhost:10054` or `http://192.168.1.104:10056/api`
+- Check `store/index.js` for current active server endpoints
+
+### Global Utilities
+- `$showMessage()` - Display toast notifications
+- `$showDialog()` - Show confirmation dialogs  
+- `$camera()` - Camera/photo selection functionality
+- `$getDate()` - Date formatting utilities
+- `$getUrlParams()` - URL parameter parsing
+
+### Component Dependencies
+- **uView UI**: Primary UI component library
+- **Custom Components**: Scanner, printer utilities in `components/kk-printer/`
+- **Third-party**: Charts (u-charts), maps (amap), markdown parsing
+
+### File Upload System
+Image uploads use base64 encoding via `$fileUpload()` method, sending to `/Base/saveImage` endpoint.
+
+### Authentication System
+- User authentication is managed through `$loginInfo` object in `main.js`
+- Login state persists using `uni.getStorageSync()` and `uni.setStorageSync()`
+- Global mixin `globalMixin.js` provides `checkUserAuth()` for automatic login verification
+- Users are redirected to `/pages/BasePages/login` if not authenticated
+
+### Request Architecture
+- **$post()** and **$get()**: Standard API requests with automatic loading indicators
+- **$uni_request()**: Core request method with error handling and status checking
+- **$toERP()**: External ERP system integration requests
+- **$postSyncPost()**: Promise-based synchronous POST requests
+- All requests automatically handle loading states, error messages, and network failures
+
+### Hardware Integration
+- **Camera**: Native camera access via `$camera()` with image compression options
+- **Barcode Scanner**: QR/barcode scanning capabilities for PDA devices
+- **Bluetooth Printing**: Printer integration through `components/kk-printer/`
+- **Device Permissions**: Configured in `manifest.json` for camera, storage, network, and Bluetooth access
+
+### Page Architecture Patterns
+- **List Pages**: Pagination with pull-to-refresh and infinite scroll
+- **Detail Pages**: Read-only view with navigation to edit forms
+- **Add/Edit Forms**: Input validation and submission with photo upload capabilities
+- **Scan Pages**: Barcode scanning with immediate data processing
+
+### Environment Configuration
+Current server endpoints are configured in `store/index.js`:
+- **Development**: `http://localhost:5184/api`
+- **Internal Network**: `http://192.168.11.251:10054`
+- **Testing**: `http://192.168.1.104:10056/api` or `10057/api`
+- Switch between environments by updating `serverAPI` in the Vuex store
\ No newline at end of file
diff --git a/pages/QC/SJ/Add.vue b/pages/QC/SJ/Add.vue
index fcc02df..fdedfb1 100644
--- a/pages/QC/SJ/Add.vue
+++ b/pages/QC/SJ/Add.vue
@@ -53,12 +53,8 @@
         <view class="info-value highlight">{{ formData.daa008 }}</view>
       </view>
       <view v-if="formData.remarks" class="info-block">
-        <view class="info-label">涓嶅悎鏍兼弿杩帮細</view>
-        <view class="info-value">{{ formData.remarks }}</view>
-      </view>
-      <view v-if="formData.comments" class="info-block">
         <view class="info-label">澶囨敞锛�</view>
-        <view class="info-value">{{ formData.comments }}</view>
+        <view class="info-value">{{ formData.remarks }}</view>
       </view>
     </view>
 
@@ -137,9 +133,8 @@
       <button v-if="!isUpdate && !formData.statusUser && !isShowTable" class="secondary-btn" @click="removeXJ">
         鍒犻櫎鍗曟嵁
       </button>
-      <button v-if="!isUpdate && !isShowTable" class="secondary-btn" @click="saveRemarks">娣诲姞涓嶅悎鏍兼弿杩�</button>
-      <button v-if="!isUpdate && !isShowTable" class="secondary-btn" @click="saveComments">娣诲姞澶囨敞</button>
-      <button v-if="!isUpdate && !isShowTable" class="primary-btn" @click="submit">瀹℃牳鍗曟嵁</button>
+      <button v-if="!isUpdate && !isShowTable" class="secondary-btn" @click="saveRemarks">娣诲姞澶囨敞</button>
+      <button v-if="!isUpdate && !isShowTable && formData.fSubmit != 1" class="primary-btn" @click="submit">瀹℃牳鍗曟嵁</button>
       <button v-if="isShowTable" class="secondary-btn" @click="getTable">鑾峰彇妫�楠岄」鐩�</button>
       <button v-if="isShowTable && isUpdate" class="primary-btn" @click="saveTable">鐢熸垚妫�楠岄」鐩�</button>
     </view>
@@ -147,28 +142,14 @@
     <!-- 寮圭獥 -->
     <view v-if="remarksPopup" class="overlay">
       <view class="popup">
-        <h3>淇敼涓嶅悎鏍兼弿杩�</h3>
-        <form>
-          <view class="form-group">
-            <label class="form-label">涓嶅悎鏍兼弿杩�:</label>
-            <input v-model="remarks" class="form-input" type="text"/>
-          </view>
-          <button class="updateBut" @click="editRemarks">淇敼</button>
-          <button @click="remarksPopup = !remarksPopup">鍙栨秷</button>
-        </form>
-      </view>
-    </view>
-
-    <view v-if="commentsPopup" class="overlay">
-      <view class="popup">
         <h3>淇敼澶囨敞</h3>
         <form>
           <view class="form-group">
             <label class="form-label">澶囨敞:</label>
-            <input v-model="comments" class="form-input" type="text"/>
+            <textarea v-model="remarks" class="form-input form-textarea" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�..."></textarea>
           </view>
-          <button class="updateBut" @click="editComments">淇敼</button>
-          <button @click="commentsPopup = !commentsPopup">鍙栨秷</button>
+          <button class="updateBut" @click="editRemarks">淇敼</button>
+          <button @click="remarksPopup = !remarksPopup">鍙栨秷</button>
         </form>
       </view>
     </view>
@@ -191,6 +172,7 @@
         comments: "",
         statusUser: "",
         itemId: "",
+        fSubmit: 0,
       },
 
       DAA020List: [],
@@ -300,17 +282,26 @@
       }).then(res => {
 
         //2024-11-28 kyy 鏍¢獙鍚堟牸鎻愪氦澧炲姞鎻愮ず
+        console.log("瀹屾暣鍝嶅簲鏁版嵁:", res);
         console.log("Status Code鐨勫��:", res.statusCode);
-        if (res.statusCode === 200) {
+        console.log("杩斿洖鐨勬暟鎹�:", res.data);
+        
+        // 妫�鏌ュ绉嶆垚鍔熸潯浠�
+        if (res.statusCode === 200 || res.status === 0 || res.data === true || res.data.tbBillList === true) {
 
           this.$showMessage("鎴愬姛鎻愪氦妫�楠�");
-          // 浣跨敤setTimeout鍦�7绉掑悗闅愯棌娑堟伅
+          // 鎻愪氦鎴愬姛鍚庤烦杞埌鍒楄〃椤甸潰
           setTimeout(() => {
-            this.hideCustomMessage();
-          }, 7000); // 7000姣绛変簬7绉�
+            uni.navigateTo({
+              url: '/pages/QC/SJ/List'
+            });
+          }, 1500); // 1.5绉掑悗璺宠浆锛岃鐢ㄦ埛鐪嬪埌鎴愬姛鎻愮ず
         } else {
-          this.$showMessage(res.data.message);
+          this.$showMessage(res.data.message || res.message || "鎻愪氦澶辫触");
         }
+      }).catch(err => {
+        console.log("鎻愪氦鍑洪敊:", err);
+        this.$showMessage("鎻愪氦澶辫触锛岃閲嶈瘯");
       })
     },
 
@@ -426,7 +417,7 @@
         this.$post({
           url: "/SJ/SetQSItems",
           data: {
-            itemId: this.formData.itemNo
+            itemNo: this.formData.itemNo
           }
         }).then(res => {
           if (res.data.tbBillList.length > 0) {
@@ -459,7 +450,7 @@
       this.$post({
         url: "/SJ/SetQSItems",
         data: {
-          itemId: this.formData.itemNo
+          itemNo: this.formData.itemNo
         }
       }).then(res => {
         if (res.data.tbBillList.length > 0) {
@@ -1001,8 +992,9 @@
   padding: 20px;
   border: 1px solid #ccc;
   box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-  width: 68vw;
-  height: 25vh;
+  width: 85vw;
+  min-height: 35vh;
+  max-height: 60vh;
   border-radius: 8px;
 }
 
@@ -1035,6 +1027,13 @@
   border-radius: 4px;
   font-size: 14px;
   box-sizing: border-box;
+}
+
+.popup .form-textarea {
+  min-height: 120px;
+  resize: vertical;
+  font-family: inherit;
+  line-height: 1.5;
 }
 
 .popup-buttons {
@@ -1155,6 +1154,18 @@
     width: 6px;
     height: 6px;
   }
+
+  /* 绉诲姩绔脊鍑烘浼樺寲 */
+  .popup {
+    width: 95vw;
+    min-height: 40vh;
+    max-height: 70vh;
+    padding: 15px;
+  }
+
+  .popup .form-textarea {
+    min-height: 100px;
+  }
 }
 
 /* 骞虫澘璁惧鏍峰紡 */
diff --git a/pages/QC/SJ/List.vue b/pages/QC/SJ/List.vue
index 0360664..7125a48 100644
--- a/pages/QC/SJ/List.vue
+++ b/pages/QC/SJ/List.vue
@@ -35,9 +35,15 @@
           <view v-if="item.urgent == 1" class="badge urgent">鎬ユ枡</view>
           <view v-if="item.isFirst == 1" class="badge normal">棣栨</view>
           <view class="card-title">妫�楠屽崟鍙�: {{ item.billNo }}</view>
-          <view :class="{'status-pending': current === 0, 'status-assigned': current === 0 && item.statusUser, 'status-pass': current === 1 && item.result === '鍚堟牸', 'status-fail': current === 1 && item.result === '涓嶅悎鏍�'}"
+          <view :class="{
+                  'status-pending': !item.result && current === 0,
+                  'status-assigned': current === 0 && item.statusUser && !item.result,
+                  'status-pass': item.result === '鍚堟牸',
+                  'status-fail': item.result === '涓嶅悎鏍�',
+                  'status-submitted': !item.result && current === 1
+                }"
                 class="status">
-            {{ current === 0 ? (item.statusUser ? '宸插垎閰�' : '鏈彁浜�') : (item.result ? item.result : '宸叉彁浜�') }}
+            {{ current === 0 ? (item.result ? item.result : '鏈彁浜�') : (item.result ? item.result : '宸叉彁浜�') }}
           </view>
         </view>
 
@@ -460,7 +466,12 @@
 }
 
 .status-fail {
-  background: linear-gradient(135deg, #e74c3c, #c0392b);
+  background: linear-gradient(135deg, #3498db, #2980b9);
+  color: white;
+}
+
+.status-submitted {
+  background: linear-gradient(135deg, #95a5a6, #7f8c8d);
   color: white;
 }
 
diff --git a/pages/QC/SJ/detail.vue b/pages/QC/SJ/detail.vue
index 366942d..b8fc3ea 100644
--- a/pages/QC/SJ/detail.vue
+++ b/pages/QC/SJ/detail.vue
@@ -76,7 +76,7 @@
               <view class="info-value">{{ formData.result }}</view>
             </view>
             <view v-if="formData.remarks" class="info-item">
-              <view class="info-label">涓嶅悎鏍兼弿杩�</view>
+              <view class="info-label">澶囨敞</view>
               <view class="info-value danger">{{ formData.remarks }}</view>
             </view>
           </view>
@@ -104,7 +104,7 @@
               </button>
               <button class="btn upload-btn" @click="saveRemarks">
                 <uni-icons color="#fff" size="16" type="compose"></uni-icons>
-                涓嶅悎鏍兼弿杩�
+                澶囨敞
               </button>
             </view>
           </view>
@@ -118,7 +118,7 @@
               </button>
               <button class="btn upload-btn" @click="saveRemarks">
                 <uni-icons color="#fff" size="16" type="compose"></uni-icons>
-                涓嶅悎鏍兼弿杩�
+                澶囨敞
               </button>
             </view>
             <view class="input-wrapper" style="margin-top: 15px;">
@@ -181,13 +181,13 @@
         </view>
       </view>
 
-      <!-- 寮瑰嚭灞� - 涓嶅悎鏍兼弿杩� -->
+      <!-- 寮瑰嚭灞� - 澶囨敞 -->
       <view v-if="remarksPopup" class="overlay">
         <view class="popup">
-          <h3>淇敼涓嶅悎鏍兼弿杩�</h3>
+          <h3>淇敼澶囨敞</h3>
           <form>
             <view class="form-group">
-              <label class="form-label">涓嶅悎鏍兼弿杩�:</label>
+              <label class="form-label">澶囨敞:</label>
               <input v-model="remarks" class="form-input" type="text"/>
             </view>
             <view class="popup-buttons">

--
Gitblit v1.9.3