From 91dec349aa88c58c587199d9601529d60824e1d0 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 02 七月 2026 13:24:34 +0800
Subject: [PATCH] 生产订单对齐管理端新增两个字段展示

---
 src/pages/inspectionUpload/components/formDia.vue |  364 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 284 insertions(+), 80 deletions(-)

diff --git a/src/pages/inspectionUpload/components/formDia.vue b/src/pages/inspectionUpload/components/formDia.vue
index 41837cb..62bf40f 100644
--- a/src/pages/inspectionUpload/components/formDia.vue
+++ b/src/pages/inspectionUpload/components/formDia.vue
@@ -8,53 +8,99 @@
   >
     <view class="popup-content">
       <view class="popup-header">
-        <text class="popup-title">涓婁紶</text>
+        <text class="popup-title">宸℃璁板綍涓婁紶</text>
       </view>
       
       <view class="upload-container">
+        <!-- 寮傚父鐘舵�侀�夋嫨 -->
         <view class="form-container">
-          <view class="title">鐢熶骇鍓�</view>
-          <u-upload
-            :fileList="beforeModelValue"
-            @afterRead="afterRead"
-            @delete="deleteFile"
-            name="before"
-            multiple
-            :maxCount="10"
-            :maxSize="1024 * 1024"
-            accept="video/*"
-            :previewFullImage="true"
-          ></u-upload>
+          <view class="title">宸℃鐘舵��</view>
+          <view class="exception-section">
+            <view class="exception-options">
+              <view 
+                class="exception-option" 
+                :class="{ active: hasException === false }"
+                @click="setExceptionStatus(false)"
+              >
+                <u-icon name="checkmark-circle" size="20" color="#52c41a"></u-icon>
+                <text class="option-text">姝e父</text>
+              </view>
+              <view 
+                class="exception-option" 
+                :class="{ active: hasException === true }"
+                @click="setExceptionStatus(true)"
+              >
+                <u-icon name="close-circle" size="20" color="#ff4d4f"></u-icon>
+                <text class="option-text">瀛樺湪寮傚父</text>
+              </view>
+            </view>
+          </view>
+        </view>
+
+        <!-- 寮傚父鎻忚堪锛堜粎鍦ㄥ紓甯告椂鏄剧ず锛� -->
+        <view class="form-container" v-if="hasException === true">
+          <view class="title">寮傚父鎻忚堪</view>
+          <u-input
+            v-model="exceptionDescription"
+            type="textarea"
+            :maxlength="500"
+            placeholder="璇锋弿杩板紓甯告儏鍐�..."
+            :customStyle="{ padding: '10px', backgroundColor: '#f5f5f5' }"
+          />
         </view>
         
-        <view class="form-container">
-          <view class="title">鐢熶骇鍚�</view>
-          <u-upload
-            :fileList="afterModelValue"
-            @afterRead="afterRead"
-            @delete="deleteFile"
-            name="after"
-            multiple
-            :maxCount="10"
-            :maxSize="1024 * 1024"
-            accept="video/*"
-            :previewFullImage="true"
-          ></u-upload>
-        </view>
-        
-        <view class="form-container">
-          <view class="title">鐢熶骇闂</view>
-          <u-upload
-            :fileList="issueModelValue"
-            @afterRead="afterRead"
-            @delete="deleteFile"
-            name="issue"
-            multiple
-            :maxCount="10"
-            :maxSize="1024 * 1024"
-            accept="video/*"
-            :previewFullImage="true"
-          ></u-upload>
+        <!-- 涓婁紶鍖哄煙锛堜粎鍦ㄥ紓甯告椂鏄剧ず锛� -->
+        <template v-if="hasException === true">
+          <view class="form-container">
+            <view class="title">鐢熶骇鍓�</view>
+            <u-upload
+              :fileList="beforeModelValue"
+              @afterRead="afterRead"
+              @delete="deleteFile"
+              name="before"
+              multiple
+              :maxCount="10"
+              :maxSize="5 * 1024 * 1024"
+              accept="image/*"
+              :previewFullImage="true"
+            ></u-upload>
+          </view>
+          
+          <view class="form-container">
+            <view class="title">鐢熶骇鍚�</view>
+            <u-upload
+              :fileList="afterModelValue"
+              @afterRead="afterRead"
+              @delete="deleteFile"
+              name="after"
+              multiple
+              :maxCount="10"
+              :maxSize="5 * 1024 * 1024"
+              accept="image/*"
+              :previewFullImage="true"
+            ></u-upload>
+          </view>
+          
+          <view class="form-container">
+            <view class="title">鐢熶骇闂</view>
+            <u-upload
+              :fileList="issueModelValue"
+              @afterRead="afterRead"
+              @delete="deleteFile"
+              name="issue"
+              multiple
+              :maxCount="10"
+              :maxSize="5 * 1024 * 1024"
+              accept="image/*"
+              :previewFullImage="true"
+            ></u-upload>
+          </view>
+        </template>
+
+        <!-- 姝e父鐘舵�佹彁绀� -->
+        <view class="form-container normal-tip" v-if="hasException === false">
+          <u-icon name="info-circle" size="40" color="#52c41a"></u-icon>
+          <text class="tip-text">璁惧杩愯姝e父锛屾棤闇�涓婁紶鐓х墖</text>
         </view>
       </view>
       
@@ -67,8 +113,10 @@
 </template>
 
 <script setup>
-import { ref } from 'vue'
+import { ref, computed } from 'vue'
 import { submitInspectionRecord } from '@/api/equipmentManagement/inspection.js'
+import { getToken } from '@/utils/auth'
+import config from '@/config'
 
 const emit = defineEmits(['closeDia'])
 
@@ -78,50 +126,111 @@
 const issueModelValue = ref([])
 const infoData = ref(null)
 
+// 寮傚父鐘舵�侊細null=鏈�夋嫨, false=姝e父, true=寮傚父
+const hasException = ref(null)
+// 寮傚父鎻忚堪
+const exceptionDescription = ref('')
+
+// 璁$畻涓婁紶URL
+const uploadFileUrl = computed(() => {
+  let baseUrl = '';
+  
+  if (process.env.VUE_APP_BASE_API) {
+    baseUrl = process.env.VUE_APP_BASE_API;
+  } else {
+    baseUrl = config.baseUrl;
+  }
+  
+  return baseUrl + '/file/upload';
+})
+
+const uploadSingleFile = async (fileItem, typeValue) => {
+  const token = getToken()
+  if (!token) throw new Error('鐢ㄦ埛鏈櫥褰�')
+
+  // H5: u-upload 鍙兘缁欏師鐢� File锛坒ileItem.file锛�
+  const rawFile = fileItem?.file
+  if (rawFile) {
+    const formData = new FormData()
+    formData.append('file', rawFile, rawFile.name || 'image.jpg')
+    formData.append('type', String(typeValue))
+    const res = await fetch(uploadFileUrl.value, {
+      method: 'POST',
+      headers: { Authorization: 'Bearer ' + token },
+      body: formData
+    })
+    const data = await res.json()
+    if (data?.code !== 200) throw new Error(data?.msg || '涓婁紶澶辫触')
+    return {
+      url: data?.data?.url,
+      name: rawFile.name || 'image.jpg',
+      status: 'success'
+    }
+  }
+
+  // 闈� H5 / 鍏煎锛氳蛋 uni.uploadFile
+  return await new Promise((resolve, reject) => {
+    uni.uploadFile({
+      url: uploadFileUrl.value,
+      filePath: fileItem.url,
+      name: 'file',
+      header: {
+        'Authorization': `Bearer ${token}`
+      },
+      formData: {
+        type: typeValue
+      },
+      success: (res) => {
+        try {
+          const data = JSON.parse(res.data)
+          if (data.code === 200) {
+            resolve({
+              url: data.data.url,
+              name: fileItem.name,
+              status: 'success'
+            })
+          } else {
+            reject(new Error(data.msg || '涓婁紶澶辫触'))
+          }
+        } catch (e) {
+          reject(e)
+        }
+      },
+      fail: (err) => reject(err)
+    })
+  })
+}
+
 // 鏂囦欢涓婁紶澶勭悊
 const afterRead = (event) => {
   const { name, file } = event
   
-  // 涓婁紶鏂囦欢鍒版湇鍔″櫒
-  uni.uploadFile({
-    url: '/api/upload', // 鏇挎崲涓哄疄闄呯殑涓婁紶鎺ュ彛
-    filePath: file.url,
-    name: 'file',
-    success: (res) => {
-      const data = JSON.parse(res.data)
-      if (data.code === 200) {
-        const fileItem = {
-          url: data.data.url,
-          name: file.name,
-          status: 'success'
-        }
-        
-        // 鏍规嵁name娣诲姞鍒板搴旂殑鏁扮粍
-        if (name === 'before') {
-          beforeModelValue.value.push(fileItem)
-        } else if (name === 'after') {
-          afterModelValue.value.push(fileItem)
-        } else if (name === 'issue') {
-          issueModelValue.value.push(fileItem)
-        }
-        
-        uni.showToast({
-          title: '涓婁紶鎴愬姛',
-          icon: 'success'
-        })
-      } else {
-        uni.showToast({
-          title: '涓婁紶澶辫触',
-          icon: 'error'
-        })
+  // 鏍规嵁涓婁紶绫诲瀷璁剧疆涓嶅悓鐨則ype鍊�
+  let typeValue = 10 // 榛樿鍊�
+  if (name === 'before') {
+    typeValue = 10 // 鐢熶骇鍓�
+  } else if (name === 'after') {
+    typeValue = 11 // 鐢熶骇涓�
+  } else if (name === 'issue') {
+    typeValue = 12 // 鐢熶骇鍚�
+  }
+
+  const files = Array.isArray(file) ? file : [file]
+  Promise.resolve().then(async () => {
+    for (const f of files) {
+      const uploaded = await uploadSingleFile(f, typeValue)
+      if (name === 'before') {
+        beforeModelValue.value.push(uploaded)
+      } else if (name === 'after') {
+        afterModelValue.value.push(uploaded)
+      } else if (name === 'issue') {
+        issueModelValue.value.push(uploaded)
       }
-    },
-    fail: () => {
-      uni.showToast({
-        title: '涓婁紶澶辫触',
-        icon: 'error'
-      })
     }
+    uni.showToast({ title: '涓婁紶鎴愬姛', icon: 'success' })
+  }).catch((err) => {
+    console.error('涓婁紶澶辫触:', err)
+    uni.showToast({ title: '涓婁紶澶辫触', icon: 'error' })
   })
 }
 
@@ -138,9 +247,43 @@
   }
 }
 
+// 璁剧疆寮傚父鐘舵��
+const setExceptionStatus = (status) => {
+  hasException.value = status
+}
+
 // 鎻愪氦琛ㄥ崟
 const submitForm = async () => {
   try {
+    // 妫�鏌ユ槸鍚﹂�夋嫨浜嗗贰妫�鐘舵��
+    if (hasException.value === null) {
+      uni.showToast({
+        title: '璇烽�夋嫨宸℃鐘舵��',
+        icon: 'none'
+      })
+      return
+    }
+
+    // 濡傛灉鏄紓甯哥姸鎬侊紝妫�鏌ユ槸鍚︽湁涓婁紶鏂囦欢
+    if (hasException.value === true) {
+      const totalFiles = beforeModelValue.value.length + afterModelValue.value.length + issueModelValue.value.length
+      if (totalFiles === 0) {
+        uni.showToast({
+          title: '璇蜂笂浼犲紓甯哥収鐗�',
+          icon: 'none'
+        })
+        return
+      }
+      // 妫�鏌ユ槸鍚﹀~鍐欎簡寮傚父鎻忚堪
+      if (!exceptionDescription.value.trim()) {
+        uni.showToast({
+          title: '璇峰~鍐欏紓甯告弿杩�',
+          icon: 'none'
+        })
+        return
+      }
+    }
+
     let arr = []
     if (beforeModelValue.value.length > 0) {
       arr.push(...beforeModelValue.value.map(item => ({ ...item, statusType: 0 })))
@@ -154,6 +297,8 @@
     
     // 鎻愪氦鏁版嵁
     infoData.value.storageBlobDTO = arr
+    infoData.value.hasException = hasException.value
+    infoData.value.exceptionDescription = exceptionDescription.value
     await submitInspectionRecord({ ...infoData.value })
     
     uni.showToast({
@@ -180,6 +325,8 @@
   beforeModelValue.value = []
   afterModelValue.value = []
   issueModelValue.value = []
+  hasException.value = null
+  exceptionDescription.value = ''
 }
 
 // 鍏抽棴寮规
@@ -253,4 +400,61 @@
   border-top: 1px solid #f0f0f0;
   background-color: #fafafa;
 }
+
+// 寮傚父鐘舵�侀�夋嫨鏍峰紡
+.exception-section {
+  padding: 10px 0;
+}
+
+.exception-options {
+  display: flex;
+  gap: 15px;
+}
+
+.exception-option {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 8px;
+  padding: 15px 20px;
+  border: 2px solid #e0e0e0;
+  border-radius: 8px;
+  cursor: pointer;
+  transition: all 0.3s;
+  background-color: #fff;
+  
+  &.active {
+    border-color: #1890ff;
+    background-color: #e6f7ff;
+  }
+  
+  &:active {
+    opacity: 0.8;
+  }
+}
+
+.option-text {
+  font-size: 14px;
+  color: #333;
+  font-weight: 500;
+}
+
+// 姝e父鐘舵�佹彁绀烘牱寮�
+.normal-tip {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 40px 20px;
+  background-color: #f6ffed;
+  border: 1px dashed #b7eb8f;
+  border-radius: 8px;
+  
+  .tip-text {
+    margin-top: 15px;
+    font-size: 14px;
+    color: #52c41a;
+  }
+}
 </style>

--
Gitblit v1.9.3