From 18a6993750e192fb8af04ce407a72ba20d6024c5 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期六, 23 五月 2026 11:50:17 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_天津_阳光印刷' into dev_天津_阳光印刷

---
 src/views/qualityManagement/processInspection/components/formDia.vue          |   23 
 src/views/productionManagement/productionOrder/BindRouteDialog.vue            |    7 
 multiple/config.json                                                          |    2 
 src/views/productionManagement/workOrder/index.vue                            |   77 +-
 src/views/equipmentManagement/repair/Modal/RepairModal.vue                    |   10 
 src/views/qualityManagement/finalInspection/components/formDia.vue            |   23 
 src/views/productionManagement/productionCosting/index.vue                    |   15 
 src/views/equipmentManagement/repair/index.vue                                |    5 
 src/views/salesManagement/receiptPaymentLedger/index.vue                      |   14 
 src/views/qualityManagement/rawMaterialInspection/index.vue                   |  123 ++++
 src/views/qualityManagement/finalInspection/index.vue                         |  228 ++++++--
 src/views/equipmentManagement/inspectionManagement/index.vue                  |   27 
 src/views/qualityManagement/processInspection/index.vue                       |  228 ++++++--
 src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue   |    8 
 src/views/productionManagement/productionReporting/index.vue                  |   79 +-
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue      |   23 
 vite.config.js                                                                |    4 
 src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue |  620 +++++++++++++++++++++++
 18 files changed, 1,301 insertions(+), 215 deletions(-)

diff --git a/multiple/config.json b/multiple/config.json
index 04c80e8..5044486 100644
--- a/multiple/config.json
+++ b/multiple/config.json
@@ -20,7 +20,7 @@
   "YGYS": {
     "env": {
       "VITE_APP_TITLE": "闃冲厜鍗板埛淇℃伅绠$悊",
-      "VITE_BASE_API": "http://1.15.17.182:9022",
+      "VITE_BASE_API": "http://1.15.17.182:9023",
       "VITE_JAVA_API": "http://1.15.17.182:9022"
     },
     "screen": "screen/login-background.png",
diff --git a/src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue b/src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue
new file mode 100644
index 0000000..f183507
--- /dev/null
+++ b/src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue
@@ -0,0 +1,620 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="showUploadDialog"
+      title="涓婁紶宸℃璁板綍"
+      width="560px"
+      :before-close="closeUploadDialog"
+    >
+      <el-tabs v-model="currentUploadType">
+        <el-tab-pane label="鐢熶骇鍓�" name="before" />
+        <el-tab-pane label="鐢熶骇涓�" name="after" />
+        <el-tab-pane label="鐢熶骇鍚�" name="issue" />
+      </el-tabs>
+
+      <div class="exception-section">
+        <div class="section-title">鏄惁瀛樺湪寮傚父锛�</div>
+        <el-radio-group v-model="hasException">
+          <el-radio :value="false">姝e父</el-radio>
+          <el-radio :value="true">瀛樺湪寮傚父</el-radio>
+        </el-radio-group>
+      </div>
+
+      <div class="upload-buttons">
+        <el-upload
+          ref="uploadRef"
+          v-model:file-list="uploadFileList"
+          :action="uploadUrl"
+          :headers="uploadHeaders"
+          :show-file-list="false"
+          :accept="uploadAccept"
+          :multiple="false"
+          :before-upload="handleBeforeUpload"
+          :on-success="handleUploadSuccess"
+          :on-error="handleUploadError"
+          :on-progress="handleUploadProgress"
+          :disabled="uploading || getCurrentFiles().length >= uploadConfig.limit"
+        >
+          <el-button
+            type="primary"
+            :loading="uploading"
+            :disabled="getCurrentFiles().length >= uploadConfig.limit"
+          >
+            閫夋嫨鍥剧墖/瑙嗛
+          </el-button>
+        </el-upload>
+      </div>
+
+      <el-progress
+        v-if="uploading"
+        :percentage="uploadProgress"
+        style="margin: 12px 0"
+      />
+
+      <div v-if="getCurrentFiles().length" class="file-list">
+        <div
+          v-for="(file, index) in getCurrentFiles()"
+          :key="file.uid || file.id || index"
+          class="file-item"
+        >
+          <div class="file-preview-container">
+            <img
+              v-if="isImageFile(file)"
+              :src="file.url || file.downloadUrl"
+              class="file-preview"
+              @click="previewAttachment(file)"
+            />
+            <div
+              v-else
+              class="video-preview"
+              @click="previewAttachment(file)"
+            >
+              瑙嗛
+            </div>
+
+            <button class="delete-btn" @click="removeFile(index)">x</button>
+          </div>
+
+          <div class="file-name">
+            {{ file.bucketFilename || file.name || "闄勪欢" }}
+          </div>
+          <div class="file-size">
+            {{ formatFileSize(file.size || file.byteSize) }}
+          </div>
+        </div>
+      </div>
+
+      <el-empty
+        v-else
+        :description="`璇烽�夋嫨瑕佷笂浼犵殑${getUploadTypeText()}鍥剧墖鎴栬棰慲"
+      />
+
+      <div class="upload-summary">
+        鐢熶骇鍓嶏細{{ beforeModelValue.length }} 涓� |
+        鐢熶骇涓細{{ afterModelValue.length }} 涓� |
+        鐢熶骇鍚庯細{{ issueModelValue.length }} 涓�
+      </div>
+
+      <template #footer>
+				<el-button type="primary" @click="submitUpload">鎻愪氦</el-button>
+        <el-button @click="closeUploadDialog">鍙栨秷</el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog
+      v-model="showVideoDialog"
+      :title="currentVideoFile?.originalFilename || '瑙嗛棰勮'"
+      width="720px"
+    >
+      <video
+        v-if="currentVideoFile"
+        :src="currentVideoFile.url || currentVideoFile.downloadUrl"
+        class="video-player"
+        controls
+        autoplay
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import { ElLoading, ElMessage, ElMessageBox } from "element-plus";
+import { getToken } from "@/utils/auth";
+import { uploadInspectionTask } from "@/api/inspectionManagement/index.js";
+
+const emit = defineEmits(["closeDia", "success"]);
+
+const showUploadDialog = ref(false);
+const uploading = ref(false);
+const uploadProgress = ref(0);
+const uploadRef = ref(null);
+const uploadFileList = ref([]);
+
+const beforeModelValue = ref([]);
+const afterModelValue = ref([]);
+const issueModelValue = ref([]);
+const currentUploadType = ref("before");
+const hasException = ref(null);
+const currentTask = ref(null);
+
+const showVideoDialog = ref(false);
+const currentVideoFile = ref(null);
+
+const uploadConfig = {
+  action: "/file/upload",
+  limit: 10,
+  fileSize: 50,
+  fileType: ["jpg", "jpeg", "png", "gif", "webp", "mp4", "mov", "avi", "wmv"],
+};
+
+const uploadUrl = computed(() => {
+  const type = getTabType();
+  return `${import.meta.env.VITE_APP_BASE_API}${uploadConfig.action}?type=${type}`;
+});
+const uploadHeaders = {
+  Authorization: `Bearer ${getToken()}`,
+};
+const uploadAccept = computed(() =>
+  uploadConfig.fileType.map(item => `.${item}`).join(",")
+);
+const filePreviewBase = __BASE_API__;
+
+const cloneData = value => JSON.parse(JSON.stringify(value || {}));
+
+const normalizeFileUrl = rawUrl => {
+  if (!rawUrl || typeof rawUrl !== "string") return "";
+
+  let fileUrl = rawUrl.trim();
+  if (!fileUrl) return "";
+  if (/^https?:\/\//i.test(fileUrl)) return fileUrl;
+
+  if (fileUrl.indexOf("\\") > -1) {
+    const uploadsIndex = fileUrl.toLowerCase().indexOf("uploads");
+    if (uploadsIndex > -1) {
+      const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, "/");
+      fileUrl = `/${relativePath}`;
+    } else {
+      const parts = fileUrl.split("\\");
+      const fileName = parts[parts.length - 1];
+      fileUrl = `/uploads/${fileName}`;
+    }
+  }
+
+  if (!fileUrl.startsWith("http")) {
+    if (!fileUrl.startsWith("/")) {
+      fileUrl = `/${fileUrl}`;
+    }
+    fileUrl = `${filePreviewBase}${fileUrl}`;
+  }
+
+  return fileUrl;
+};
+
+const mapExistingFile = (file, type) => ({
+  ...file,
+  id: file?.id,
+  tempId: file?.tempId ?? file?.tempFileId ?? file?.id,
+  tempFileId: file?.tempFileId ?? file?.id,
+  url: normalizeFileUrl(file?.url || file?.downloadUrl || file?.fileUrl || ""),
+  downloadUrl: normalizeFileUrl(
+    file?.downloadUrl || file?.url || file?.fileUrl || ""
+  ),
+  bucketFilename:
+    file?.bucketFilename || file?.originalFilename || file?.fileName || file?.name,
+  originalFilename:
+    file?.originalFilename || file?.bucketFilename || file?.fileName || file?.name,
+  size: file?.size || file?.byteSize,
+  byteSize: file?.byteSize || file?.size,
+  contentType: file?.contentType || "",
+  type,
+  uid: file?.uid || `${type}-${file?.id || file?.url || Math.random()}`,
+});
+
+const resetDialogState = () => {
+  beforeModelValue.value = [];
+  afterModelValue.value = [];
+  issueModelValue.value = [];
+  currentUploadType.value = "before";
+  hasException.value = null;
+  currentTask.value = null;
+  uploadProgress.value = 0;
+  uploading.value = false;
+  uploadFileList.value = [];
+  uploadRef.value?.clearFiles?.();
+};
+
+const openDialog = task => {
+  const rawTask = cloneData(task?.__raw || task);
+  currentTask.value = {
+    ...rawTask,
+    taskId: rawTask.taskId || rawTask.id,
+    storageBlobDTO: [],
+  };
+
+  beforeModelValue.value = Array.isArray(rawTask.commonFileListBefore)
+    ? rawTask.commonFileListBefore.map(file => mapExistingFile(file, 10))
+    : [];
+  afterModelValue.value = Array.isArray(rawTask.commonFileListAfter)
+    ? rawTask.commonFileListAfter.map(file => mapExistingFile(file, 11))
+    : [];
+  issueModelValue.value = Array.isArray(rawTask.commonFileList)
+    ? rawTask.commonFileList.map(file => mapExistingFile(file, 12))
+    : [];
+
+  currentUploadType.value = "before";
+  hasException.value =
+    typeof rawTask.hasException === "boolean" ? rawTask.hasException : null;
+  uploadFileList.value = [];
+  showUploadDialog.value = true;
+};
+
+const closeUploadDialog = () => {
+  showUploadDialog.value = false;
+  resetDialogState();
+  emit("closeDia");
+};
+
+const getCurrentFiles = () => {
+  if (currentUploadType.value === "before") return beforeModelValue.value;
+  if (currentUploadType.value === "after") return afterModelValue.value;
+  return issueModelValue.value;
+};
+
+const getUploadTypeText = () => {
+  if (currentUploadType.value === "before") return "鐢熶骇鍓�";
+  if (currentUploadType.value === "after") return "鐢熶骇涓�";
+  return "鐢熶骇鍚�";
+};
+
+const getTabType = () => {
+  if (currentUploadType.value === "before") return 10;
+  if (currentUploadType.value === "after") return 11;
+  return 12;
+};
+
+const handleBeforeUpload = file => {
+  if (getCurrentFiles().length >= uploadConfig.limit) {
+    ElMessage.warning(`鏈�澶氬彧鑳介�夋嫨${uploadConfig.limit}涓枃浠禶);
+    return false;
+  }
+
+  const ext = file.name.split(".").pop()?.toLowerCase();
+  if (!uploadConfig.fileType.includes(ext)) {
+    ElMessage.warning(`鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼� ${uploadConfig.fileType.join("/")} 鏍煎紡`);
+    return false;
+  }
+
+  const maxSize = uploadConfig.fileSize * 1024 * 1024;
+  if (file.size > maxSize) {
+    ElMessage.warning(`鏂囦欢澶у皬涓嶈兘瓒呰繃 ${uploadConfig.fileSize}MB`);
+    return false;
+  }
+
+  uploading.value = true;
+  uploadProgress.value = 0;
+  return true;
+};
+
+const handleUploadProgress = event => {
+  if (event?.percent) {
+    uploadProgress.value = Math.round(event.percent);
+  }
+};
+
+const handleUploadSuccess = (response, file) => {
+  uploading.value = false;
+  uploadProgress.value = 0;
+  uploadFileList.value = [];
+  uploadRef.value?.clearFiles?.();
+
+  const uploadedFile = response?.data;
+  if (response?.code !== 200 || !uploadedFile) {
+    ElMessage.error(response?.msg || "涓婁紶鍝嶅簲鏁版嵁鏍煎紡閿欒");
+    return;
+  }
+
+  const type = getTabType();
+  const objectUrl = file?.raw ? URL.createObjectURL(file.raw) : "";
+  const fileData = {
+    id: uploadedFile.id,
+    tempId: uploadedFile.tempId ?? uploadedFile.tempFileId ?? uploadedFile.id,
+    tempFileId: uploadedFile.tempFileId ?? uploadedFile.id,
+    url: normalizeFileUrl(uploadedFile.url || uploadedFile.downloadUrl || objectUrl),
+    downloadUrl: normalizeFileUrl(
+      uploadedFile.downloadUrl || uploadedFile.url || objectUrl
+    ),
+    bucketFilename:
+      uploadedFile.bucketFilename || uploadedFile.originalFilename || file.name,
+    originalFilename:
+      uploadedFile.originalFilename || uploadedFile.bucketFilename || file.name,
+    size: uploadedFile.size || uploadedFile.byteSize || file.size,
+    byteSize: uploadedFile.byteSize || uploadedFile.size || file.size,
+    createTime: uploadedFile.createTime || Date.now(),
+    contentType: uploadedFile.contentType || file.raw?.type || "",
+    type,
+    uid: `${Date.now()}-${Math.random()}`,
+  };
+
+  if (currentUploadType.value === "before") {
+    beforeModelValue.value.push(fileData);
+  } else if (currentUploadType.value === "after") {
+    afterModelValue.value.push(fileData);
+  } else {
+    issueModelValue.value.push(fileData);
+  }
+
+  ElMessage.success("涓婁紶鎴愬姛");
+};
+
+const handleUploadError = error => {
+  uploading.value = false;
+  uploadProgress.value = 0;
+  uploadFileList.value = [];
+  uploadRef.value?.clearFiles?.();
+  ElMessage.error(error?.message || "涓婁紶澶辫触");
+};
+
+const removeFile = async index => {
+  try {
+    await ElMessageBox.confirm("纭畾瑕佸垹闄よ繖涓枃浠跺悧锛�", "纭鍒犻櫎", {
+      type: "warning",
+    });
+
+    if (currentUploadType.value === "before") {
+      beforeModelValue.value.splice(index, 1);
+    } else if (currentUploadType.value === "after") {
+      afterModelValue.value.splice(index, 1);
+    } else {
+      issueModelValue.value.splice(index, 1);
+    }
+
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  } catch {}
+};
+
+const buildSubmitFiles = () => {
+  const list = [
+    ...beforeModelValue.value,
+    ...afterModelValue.value,
+    ...issueModelValue.value,
+  ];
+
+  return list.map(item => ({
+    ...item,
+    url: item?.downloadUrl || item?.url || "",
+  }));
+};
+
+const buildSubmitFileItem = item => {
+  if (!item) return null;
+
+  return {
+    id: item.id,
+    tempId: item.tempId,
+    tempFileId: item.tempFileId,
+    type: item.type,
+    url: item?.downloadUrl || item?.url || "",
+    downloadUrl: item?.downloadUrl || item?.url || "",
+    bucketFilename: item.bucketFilename,
+    originalFilename: item.originalFilename,
+    size: item.size,
+    byteSize: item.byteSize,
+    contentType: item.contentType,
+  };
+};
+
+const buildGroupedFiles = list => {
+  return (list || []).map(buildSubmitFileItem).filter(Boolean);
+};
+
+const buildSubmitPayload = () => {
+  const {
+    createTime,
+    updateTime,
+    storageBlobDTO,
+    commonFileListBefore,
+    commonFileListAfter,
+    commonFileList,
+    __raw,
+    ...rest
+  } = currentTask.value || {};
+
+  const files = buildSubmitFiles();
+  const tempFileIds = files
+    .map(item => item?.tempId ?? item?.tempFileId ?? item?.id)
+    .filter(Boolean);
+
+  return {
+    ...rest,
+    hasException: hasException.value,
+    tempFileIds,
+    commonFileListBefore: buildGroupedFiles(beforeModelValue.value),
+    commonFileListAfter: buildGroupedFiles(afterModelValue.value),
+    commonFileList: buildGroupedFiles(issueModelValue.value),
+  };
+};
+
+const submitUpload = async () => {
+  if (hasException.value === null) {
+    ElMessage.warning("璇烽�夋嫨鏄惁瀛樺湪寮傚父");
+    return;
+  }
+
+  const files = buildSubmitFiles();
+  if (!files.length) {
+    ElMessage.warning("璇峰厛涓婁紶鏂囦欢");
+    return;
+  }
+
+  const loadingInstance = ElLoading.service({
+    text: "鎻愪氦涓�...",
+    background: "rgba(0, 0, 0, 0.3)",
+  });
+
+  try {
+    const payload = buildSubmitPayload();
+
+    const result = await uploadInspectionTask(payload);
+    if (result?.code === 200 || result?.success) {
+      ElMessage.success("鎻愪氦鎴愬姛");
+      showUploadDialog.value = false;
+      resetDialogState();
+      emit("success");
+      emit("closeDia");
+    } else {
+      ElMessage.error(result?.msg || result?.message || "鎻愪氦澶辫触");
+    }
+  } catch (error) {
+    ElMessage.error(error?.message || "鎻愪氦澶辫触");
+  } finally {
+    loadingInstance.close();
+  }
+};
+
+const goToRepair = () => {
+  const taskInfo = {
+    taskId: currentTask.value?.taskId || currentTask.value?.id,
+    taskName: currentTask.value?.taskName,
+    inspectionLocation: currentTask.value?.inspectionLocation,
+    inspector: currentTask.value?.inspector,
+    uploadedFiles: {
+      before: beforeModelValue.value,
+      after: afterModelValue.value,
+      issue: issueModelValue.value,
+    },
+  };
+
+  sessionStorage.setItem("repairTaskInfo", JSON.stringify(taskInfo));
+  window.location.href = "/equipmentManagement/repair";
+};
+
+const previewAttachment = file => {
+  if (isImageFile(file)) {
+    window.open(file.url || file.downloadUrl, "_blank");
+  } else {
+    currentVideoFile.value = file;
+    showVideoDialog.value = true;
+  }
+};
+
+const isImageFile = file => {
+  if (file?.contentType?.startsWith("image/")) return true;
+  const name =
+    file?.bucketFilename || file?.originalFilename || file?.name || "";
+  const ext = name.split(".").pop()?.toLowerCase();
+  return ["jpg", "jpeg", "png", "gif", "webp"].includes(ext);
+};
+
+const formatFileSize = size => {
+  if (!size) return "";
+  if (size < 1024) return `${size}B`;
+  if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)}KB`;
+  return `${(size / 1024 / 1024).toFixed(1)}MB`;
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+.exception-section {
+  margin-bottom: 16px;
+  padding: 12px;
+  background: #f8f9fa;
+  border-radius: 8px;
+}
+
+.section-title {
+  font-weight: 600;
+  margin-bottom: 8px;
+}
+
+.upload-buttons {
+  margin-bottom: 12px;
+}
+
+.file-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 12px;
+}
+
+.file-item {
+  width: 120px;
+  padding: 8px;
+  border: 1px solid #e5e5e5;
+  border-radius: 10px;
+  background: #fff;
+  text-align: center;
+}
+
+.file-preview-container {
+  position: relative;
+}
+
+.file-preview {
+  width: 90px;
+  height: 90px;
+  object-fit: cover;
+  border-radius: 8px;
+  border: 1px solid #eee;
+  cursor: pointer;
+}
+
+.video-preview {
+  width: 90px;
+  height: 90px;
+  margin: 0 auto;
+  border-radius: 8px;
+  background: #eef3f8;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #409eff;
+  cursor: pointer;
+}
+
+.delete-btn {
+  position: absolute;
+  top: -6px;
+  right: 6px;
+  width: 22px;
+  height: 22px;
+  border: none;
+  border-radius: 50%;
+  color: #fff;
+  background: #f56c6c;
+  cursor: pointer;
+}
+
+.file-name {
+  margin-top: 6px;
+  font-size: 12px;
+  color: #333;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.file-size {
+  font-size: 11px;
+  color: #999;
+}
+
+.upload-summary {
+  margin-top: 16px;
+  padding: 10px;
+  background: #f8f9fa;
+  border-left: 3px solid #409eff;
+  font-size: 13px;
+  color: #666;
+}
+
+.video-player {
+  width: 100%;
+  max-height: 70vh;
+  background: #000;
+}
+</style>
diff --git a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
index 9485d4e..982e771 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
@@ -30,9 +30,9 @@
           </div>
         </div>
         
-        <!-- 鐢熶骇鍚� -->
+        <!-- 鐢熶骇涓� -->
         <div class="form-container">
-          <div class="title">鐢熶骇鍚�</div>
+          <div class="title">鐢熶骇涓�</div>
           
           <!-- 鍥剧墖鍒楄〃 -->
           <div style="display: flex; flex-wrap: wrap;">
@@ -57,9 +57,9 @@
           </div>
         </div>
         
-        <!-- 鐢熶骇闂 -->
+        <!-- 鐢熶骇鍚� -->
         <div class="form-container">
-          <div class="title">鐢熶骇闂</div>
+          <div class="title">鐢熶骇鍚�</div>
           
           <!-- 鍥剧墖鍒楄〃 -->
           <div style="display: flex; flex-wrap: wrap;">
diff --git a/src/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index 35f82d5..d80d29a 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -76,6 +76,8 @@
     <form-dia ref="formDia"
               @closeDia="handleQuery"></form-dia>
     <view-files ref="viewFiles"></view-files>
+    <upload-files ref="uploadFiles"
+                  @closeDia="handleQuery"></upload-files>
   </div>
 </template>
 
@@ -87,6 +89,7 @@
   // 缁勪欢寮曞叆
   import PIMTable from "@/components/PIMTable/PIMTable.vue";
   import FormDia from "@/views/equipmentManagement/inspectionManagement/components/formDia.vue";
+  import UploadFiles from "@/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue";
   import ViewFiles from "@/views/equipmentManagement/inspectionManagement/components/viewFiles.vue";
 
   // 鎺ュ彛寮曞叆
@@ -100,6 +103,7 @@
   const { proxy } = getCurrentInstance();
   const formDia = ref();
   const viewFiles = ref();
+  const uploadFiles = ref();
 
   // 鏌ヨ鍙傛暟
   const queryParams = reactive({
@@ -184,8 +188,9 @@
 
     const operationConfig = {
       label: "鎿嶄綔",
-      width: 130,
+      width: operations.length > 1 ? 180 : 130,
       fixed: "right",
+			align: 'center',
       dataType: "action",
       operation: operations
         .map(op => {
@@ -194,6 +199,12 @@
               return {
                 name: "缂栬緫",
                 clickFun: handleAdd,
+                color: "#409EFF",
+              };
+            case "upload":
+              return {
+                name: "涓婁紶",
+                clickFun: openUploadFiles,
                 color: "#409EFF",
               };
             case "viewFile":
@@ -226,12 +237,12 @@
       ];
       operationsArr.value = ["edit"];
     } else if (value === "task") {
-      const operationColumn = getOperationColumn(["viewFile"]);
+      const operationColumn = getOperationColumn(["upload", "viewFile"]);
       tableColumns.value = [
         ...columns.value,
         ...(operationColumn ? [operationColumn] : []),
       ];
-      operationsArr.value = ["viewFile"];
+      operationsArr.value = ["upload", "viewFile"];
     }
     pageNum.value = 1;
     pageSize.value = 10;
@@ -273,6 +284,7 @@
         // 澶勭悊 inspector 瀛楁锛屽皢瀛楃涓茶浆鎹负鏁扮粍锛堥�傜敤浜庢墍鏈夋儏鍐碉級
         tableData.value = rawData.map(item => {
           const processedItem = { ...item };
+          processedItem.__raw = { ...item };
 
           // 澶勭悊 inspector 瀛楁
           if (processedItem.inspector) {
@@ -322,6 +334,13 @@
   const viewFile = row => {
     nextTick(() => {
       viewFiles.value?.openDialog(row);
+    });
+  };
+
+  // 涓婁紶闄勪欢
+  const openUploadFiles = row => {
+    nextTick(() => {
+      uploadFiles.value?.openDialog(row);
     });
   };
 
@@ -390,4 +409,4 @@
     color: #909399;
     font-size: 14px;
   }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 1aa82ec..106880a 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -31,6 +31,14 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
+          <el-form-item label="鎶ヤ慨椤圭洰">
+            <el-input
+              v-model="form.repairProject"
+              placeholder="璇疯緭鍏ユ姤淇」鐩�"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
           <el-form-item label="鎶ヤ慨鏃ユ湡">
             <el-date-picker
               v-model="form.repairTime"
@@ -111,6 +119,7 @@
   deviceLedgerId: undefined, // 璁惧Id
   deviceName: undefined, // 璁惧鍚嶇О
   deviceModel: undefined, // 瑙勬牸鍨嬪彿
+  repairProject: undefined, // 鎶ヤ慨椤圭洰
   repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
   repairName: userStore.nickName, // 鎶ヤ慨浜�
   remark: undefined, // 鏁呴殰鐜拌薄
@@ -126,6 +135,7 @@
   form.deviceLedgerId = data.deviceLedgerId;
   form.deviceName = data.deviceName;
   form.deviceModel = data.deviceModel;
+  form.repairProject = data.repairProject;
   form.repairTime = data.repairTime;
   form.repairName = data.repairName;
   form.remark = data.remark;
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
index 1e7af53..df5a39e 100644
--- a/src/views/equipmentManagement/repair/index.vue
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -188,6 +188,11 @@
         prop: "deviceModel",
       },
       {
+        label: "鎶ヤ慨椤圭洰",
+        align: "center",
+        prop: "repairProject",
+      },
+      {
         label: "鎶ヤ慨鏃ユ湡",
         align: "center",
         prop: "repairTime",
diff --git a/src/views/productionManagement/productionCosting/index.vue b/src/views/productionManagement/productionCosting/index.vue
index 5e90a0c..c437e78 100644
--- a/src/views/productionManagement/productionCosting/index.vue
+++ b/src/views/productionManagement/productionCosting/index.vue
@@ -149,6 +149,21 @@
     minWidth: 100,
   },
   {
+    label: "鎶ュ簾鏁伴噺",
+    prop: "scrapQty",
+    minWidth: 100,
+  },
+  {
+    label: "琛ヤ骇鏁伴噺",
+    prop: "replenishQty",
+    minWidth: 100,
+  },
+  {
+    label: "鍔犳斁鏁�",
+    prop: "addQty",
+    minWidth: 100,
+  },
+  {
     label: "鏈哄彴",
     prop: "deviceName",
     minWidth: 100,
diff --git a/src/views/productionManagement/productionOrder/BindRouteDialog.vue b/src/views/productionManagement/productionOrder/BindRouteDialog.vue
index 35ea376..f651360 100644
--- a/src/views/productionManagement/productionOrder/BindRouteDialog.vue
+++ b/src/views/productionManagement/productionOrder/BindRouteDialog.vue
@@ -62,7 +62,7 @@
         <el-table-column label="鏉愭枡鍚嶇О">
           <template #default="{ row, $index }">
             <el-tree-select
-                v-if="props.type === 'add'"
+                v-if="!isDetail && !row.productById"
                 v-model="row.productById"
                 placeholder="璇烽�夋嫨"
                 clearable
@@ -70,7 +70,6 @@
                 @change="(val) => getModels(val, row, $index)"
                 :data="productOptions"
                 :render-after-expand="false"
-                :disabled="isDetail"
                 style="width: 100%"
             />
             <span v-else>{{ row.name }}</span>
@@ -82,13 +81,13 @@
           </template>
           <template #default="{ row }">
             <el-select
-                v-if="props.type === 'add'"
+                v-if="!isDetail && !row.productModelId"
                 v-model="row.productModelId"
                 placeholder="璇烽�夋嫨瑙勬牸"
                 filterable
                 clearable
                 @change="(val) => handleMaterialModelChange(val, row)"
-                :disabled="isDetail"
+                style="width: 100%"
             >
               <el-option
                   v-for="item in row.modelOptions"
diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
index bd93574..6585237 100644
--- a/src/views/productionManagement/productionReporting/index.vue
+++ b/src/views/productionManagement/productionReporting/index.vue
@@ -19,12 +19,12 @@
                     style="width: 200px;"
                     @change="handleQuery" />
         </el-form-item>
-        <el-form-item label="瀹℃牳鐘舵��:">
-          <el-select v-model="searchForm.auditStatus" placeholder="璇烽�夋嫨" style="width: 200px;" @change="handleQuery">
-              <el-option v-for="item in auditStatusOptions" :key="item.value" :label="item.label" :value="item.value">
-              </el-option>
-          </el-select>
-        </el-form-item>
+<!--        <el-form-item label="瀹℃牳鐘舵��:">-->
+<!--          <el-select v-model="searchForm.auditStatus" placeholder="璇烽�夋嫨" style="width: 200px;" @change="handleQuery">-->
+<!--              <el-option v-for="item in auditStatusOptions" :key="item.value" :label="item.label" :value="item.value">-->
+<!--              </el-option>-->
+<!--          </el-select>-->
+<!--        </el-form-item>-->
         <el-form-item>
           <el-button type="primary"
                      @click="handleQuery">鎼滅储</el-button>
@@ -250,30 +250,30 @@
       prop: "deviceName",
       width: 120,
     },
-    {
-      label: "瀹℃牳浜�",
-      prop: "auditUserName",
-      width: 120,
-    },
-     {
-      label: "瀹℃牳鐘舵��",
-      prop: "auditStatus",
-      width: 120,
-      dataType: "tag",
-      formatData: val => {
-        const statusMap = { 0: "鏈鏍�", 1: "閫氳繃", 2: "涓嶉�氳繃" };
-        return statusMap[val] ?? "鏈煡";
-      },
-      formatType: val => {
-        const typeMap = { 0: "info", 1: "success", 2: "danger" };
-        return typeMap[val] ?? "";
-      },
-    },
-    {
-      label: "鏈�缁堝鏍镐汉",
-      prop: "sureAuditUserName",
-      width: 120,
-    },
+    // {
+    //   label: "瀹℃牳浜�",
+    //   prop: "auditUserName",
+    //   width: 120,
+    // },
+    //  {
+    //   label: "瀹℃牳鐘舵��",
+    //   prop: "auditStatus",
+    //   width: 120,
+    //   dataType: "tag",
+    //   formatData: val => {
+    //     const statusMap = { 0: "鏈鏍�", 1: "閫氳繃", 2: "涓嶉�氳繃" };
+    //     return statusMap[val] ?? "鏈煡";
+    //   },
+    //   formatType: val => {
+    //     const typeMap = { 0: "info", 1: "success", 2: "danger" };
+    //     return typeMap[val] ?? "";
+    //   },
+    // },
+    // {
+    //   label: "鏈�缁堝鏍镐汉",
+    //   prop: "sureAuditUserName",
+    //   width: 120,
+    // },
     {
       label: "浜у搧鍚嶇О",
       prop: "productName",
@@ -292,6 +292,11 @@
     {
       label: "鎶ュ簾鏁伴噺",
       prop: "scrapQty",
+      width: 120,
+    },
+    {
+      label: "鍔犳斁鏁�",
+      prop: "addQty",
       width: 120,
     },
     {
@@ -330,13 +335,13 @@
             deleteReport(row);
           },
         },
-        {
-          name:"瀹℃牳",
-          clickFun: row => {
-            handleAudit(row);
-          },
-          disabled: row => !(Number(row?.auditStatus) === 0 && (Number(row?.auditUserId) === -1 || Number(row?.auditUserId) === Number(userStore.id)))
-        },
+        // {
+        //   name:"瀹℃牳",
+        //   clickFun: row => {
+        //     handleAudit(row);
+        //   },
+        //   disabled: row => !(Number(row?.auditStatus) === 0 && (Number(row?.auditUserId) === -1 || Number(row?.auditUserId) === Number(userStore.id)))
+        // },
       ],
     },
   ]);
diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index c8a13a9..2456dfb 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -192,6 +192,7 @@
                   step="1"
                   placeholder="璇疯緭鍏ユ湰娆$敓浜ф暟閲�"
                   style="width: 100%"
+                  :class="{ 'over-limit': reportForm.quantity > reportForm.planQuantity }"
                   @input="handleQuantityInput"
               />
             </el-form-item>
@@ -218,6 +219,18 @@
                   step="1"
                   placeholder="璇疯緭鍏ユ姤搴熸暟閲�"
                   @input="handleScrapQtyInput"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="鍔犳斁鏁�" prop="addQty">
+              <el-input
+                  v-model.number="reportForm.addQty"
+                  type="number"
+                  min="0"
+                  step="1"
+                  placeholder="璇疯緭鍏ュ姞鏀炬暟"
               />
             </el-form-item>
           </el-col>
@@ -263,24 +276,24 @@
 <!--            </el-form-item>-->
 <!--          </el-col>-->
 
-          <el-col :span="12">
-            <el-form-item label="瀹℃牳浜�" prop="auditUserId">
-              <el-select
-                  v-model="reportForm.auditUserId"
-                  placeholder="璇烽�夋嫨瀹℃牳浜�"
-                  clearable
-                  filterable
-                  @change="handleReviewerIdChange"
-              >
-                <el-option
-                    v-for="user in userOptions"
-                    :key="user.userId"
-                    :label="user.nickName"
-                    :value="user.userId"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="瀹℃牳浜�" prop="auditUserId">-->
+<!--              <el-select-->
+<!--                  v-model="reportForm.auditUserId"-->
+<!--                  placeholder="璇烽�夋嫨瀹℃牳浜�"-->
+<!--                  clearable-->
+<!--                  filterable-->
+<!--                  @change="handleReviewerIdChange"-->
+<!--              >-->
+<!--                <el-option-->
+<!--                    v-for="user in userOptions"-->
+<!--                    :key="user.userId"-->
+<!--                    :label="user.nickName"-->
+<!--                    :value="user.userId"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
 
         </el-row>
       </el-form>
@@ -1121,6 +1134,7 @@
   planQuantity: 0,
   quantity: null,
   scrapQty: null,
+  addQty: 0,
   startTime: "",
   endTime: "",
   userName: "",
@@ -1228,7 +1242,7 @@
   scrapQty: [{validator: validateScrapQty, trigger: "blur"}],
   startTime: [{required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change"}],
   endTime: [{required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change"}],
-  auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
+  // auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
   teamList: [{required: true, message: "璇烽�夋嫨鐝粍", trigger: "change"}],
   deviceId: [{required: true, message: "璇烽�夋嫨璁惧", trigger: "change"}],
 };
@@ -1241,12 +1255,6 @@
   }
   const num = Number(value);
   if (isNaN(num)) {
-    return;
-  }
-  // 濡傛灉瓒呰繃寰呯敓浜ф暟閲�
-  if (num > reportForm.planQuantity) {
-    proxy.$modal.msgWarning("鏈鐢熶骇鏁伴噺涓嶈兘澶т簬寰呯敓浜ф暟閲�");
-    reportForm.quantity = reportForm.planQuantity;
     return;
   }
   // 濡傛灉灏忎簬1锛屾竻闄�
@@ -1456,6 +1464,7 @@
   reportForm.replenishQty = 0;
   reportForm.teamList = [];
   reportForm.scrapQty = 0;
+  reportForm.addQty = 0;
   reportForm.userIds = row.userIds || [];
 
   const ids = (row.userIds || "")
@@ -1464,7 +1473,7 @@
       .filter(Boolean);
 
   reportForm.userIdsList = userTeamOptions.value
-      .filter(item => ids.includes(String(item.userId)))
+      // .filter(item => ids.includes(String(item.userId)))
       .map(item => ({
         userId: item.userId,
         nickName: item.nickName
@@ -1535,12 +1544,12 @@
       return;
     }
 
-    if (quantity > reportForm.planQuantity) {
-      ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
-        confirmButtonText: "纭畾",
-      });
-      return;
-    }
+    // if (quantity > reportForm.planQuantity) {
+    //   ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
+    //     confirmButtonText: "纭畾",
+    //   });
+    //   return;
+    // }
 
     const submitData = {
       ...reportForm,
@@ -1805,4 +1814,8 @@
   white-space: normal !important;
   word-break: break-all;
 }
+
+.over-limit .el-input__inner {
+  color: #f56c6c !important;
+}
 </style>
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 5f4c975..2866cca 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -80,7 +80,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�楠屽憳锛�" prop="checkName">
-							<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
+							<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable filterable>
 								<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
 													 :value="item.nickName"/>
 							</el-select>
@@ -203,13 +203,13 @@
 const modelOptions = ref([]);
 
 // 鎵撳紑寮规
-const openDialog = async (type, row) => {
+const openDialog = async (type, row, defaultCheckResult = "", defaultCheckName = "") => {
   operationType.value = type;
   dialogFormVisible.value = true;
   // 鍏堟竻绌鸿〃鍗曢獙璇佺姸鎬侊紝閬垮厤闂儊
   await nextTick();
   proxy.$refs.formRef?.clearValidate();
-  
+
   // 骞惰鍔犺浇鍩虹鏁版嵁
   const [userListsRes] = await Promise.all([
     userListNoPage(),
@@ -218,17 +218,28 @@
       supplierList.value = res.data;
     })
   ]);
-  userList.value = userListsRes.data;
-  
+  // 绛涢�� roleIds 鍖呭惈 106 鐨勭敤鎴�
+  userList.value = (userListsRes.data || []).filter(user => {
+    const roleIds = user.roleIds || [];
+    return roleIds.includes(106) || roleIds.includes('106');
+  });
+
   form.value = {}
   testStandardOptions.value = [];
   tableData.value = [];
-  
+
   if (operationType.value === 'edit') {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
     const savedTestStandardId = row.testStandardId;
     // 鍏堣缃〃鍗曟暟鎹紝浣嗘殏鏃舵竻绌� testStandardId锛岀瓑閫夐」鍔犺浇瀹屾垚鍚庡啀璁剧疆
     form.value = {...row, testStandardId: ''}
+    // 濡傛灉浼犲叆浜嗛粯璁ゆ娴嬬粨鏋滐紝瑕嗙洊row涓殑鍊�
+    if (defaultCheckResult) {
+      form.value.checkResult = defaultCheckResult;
+    }
+    // 濡傛灉浼犲叆浜嗛粯璁ゆ楠屽憳锛岃鐩杛ow涓殑鍊硷紙浼樺厛浣跨敤浼犲叆鐨勬楠屽憳锛�
+    console.log('formDia checkName debug:', { defaultCheckName, rowCheckName: row.checkName });
+    form.value.checkName = defaultCheckName || row.checkName || "";
     currentProductId.value = row.productId || 0
     // 娓呯┖楠岃瘉鐘舵�侊紝閬垮厤鏁版嵁鍔犺浇杩囩▼涓殑鏍¢獙闂儊
     nextTick(() => {
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index db44222..456ae7f 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -40,23 +40,56 @@
     <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
     <FormDia ref="formDia" @close="handleQuery"></FormDia>
     <files-dia ref="filesDia" @close="handleQuery"></files-dia>
-		<el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
+    <!-- 妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗� -->
+    <el-dialog v-model="quickCheckVisible" title="妫�楠岀粨鏋�" width="30%" @close="closeQuickCheck">
+      <el-form :model="quickCheckForm" label-width="140px" label-position="top" ref="quickCheckRef">
+        <el-form-item label="妫�娴嬬粨鏋滐細" required>
+          <el-radio-group v-model="quickCheckForm.checkResult">
+            <el-radio value="鍚堟牸">鍚堟牸</el-radio>
+            <el-radio value="涓嶅悎鏍�">涓嶅悎鏍�</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="妫�楠屽憳锛�">
+          <el-select v-model="quickCheckForm.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+            <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妫�娴嬫棩鏈燂細">
+          <el-date-picker
+            v-model="quickCheckForm.checkTime"
+            type="date"
+            placeholder="璇烽�夋嫨鏃ユ湡"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            clearable
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="handleQuickCheckConfirm">纭</el-button>
+          <el-button @click="closeQuickCheck">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
 							 @close="closeDia">
-			<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
-				<el-form-item label="妫�楠屽憳锛�" prop="checkName">
-					<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
-						<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
-											 :value="item.nickName"/>
-					</el-select>
-				</el-form-item>
-			</el-form>
-			<template #footer>
-				<div class="dialog-footer">
-					<el-button type="primary" @click="submitForm">纭</el-button>
-					<el-button @click="closeDia">鍙栨秷</el-button>
-				</div>
-			</template>
-		</el-dialog>
+				<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+					<el-form-item label="妫�楠屽憳锛�" prop="checkName">
+						<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
+							<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
+												 :value="item.nickName"/>
+						</el-select>
+					</el-form-item>
+				</el-form>
+				<template #footer>
+					<div class="dialog-footer">
+						<el-button type="primary" @click="submitForm">纭</el-button>
+						<el-button @click="closeDia">鍙栨秷</el-button>
+					</div>
+				</template>
+			</el-dialog>
   </div>
 </template>
 
@@ -159,10 +192,10 @@
     width: 280,
     operation: [
       {
-        name: "缂栬緫",
+        name: "妫�楠�",
         type: "text",
         clickFun: (row) => {
-          openForm("edit", row);
+          openQuickCheck(row);
         },
 				disabled: (row) => {
 					// 宸叉彁浜ゅ垯绂佺敤
@@ -181,43 +214,43 @@
           openFilesFormDia(row);
         },
       },
-			{
-				name: "鎻愪氦",
-				type: "text",
-				clickFun: (row) => {
-					submit(row.id);
-				},
-				disabled: (row) => {
-					// 宸叉彁浜ゅ垯绂佺敤
-					if (row.inspectState == 1) return true;
-					// 濡傛灉妫�楠屽憳鏈夊�硷紝鍙湁褰撳墠鐧诲綍鐢ㄦ埛鑳芥彁浜�
-					if (row.checkName) {
-						return row.checkName !== userStore.nickName;
-					}
-					return false;
-				}
-			},
-			{
-				name: "鍒嗛厤妫�楠屽憳",
-				type: "text",
-				clickFun: (row) => {
-					if (!row.checkName) {
-						open(row)
-					} else {
-						proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
+				{
+					name: "鎻愪氦",
+					type: "text",
+					clickFun: (row) => {
+						submit(row.id);
+					},
+					disabled: (row) => {
+						// 宸叉彁浜ゅ垯绂佺敤
+						if (row.inspectState == 1) return true;
+						// 濡傛灉妫�楠屽憳鏈夊�硷紝鍙湁褰撳墠鐧诲綍鐢ㄦ埛鑳芥彁浜�
+						if (row.checkName) {
+							return row.checkName !== userStore.nickName;
+						}
+						return false;
 					}
 				},
-				disabled: (row) => {
-					return row.inspectState == 1 || row.checkName;
-				}
-			},
-			{
-				name: "涓嬭浇",
-				type: "text",
-				clickFun: (row) => {
-					downLoadFile(row);
+				{
+					name: "鍒嗛厤妫�楠屽憳",
+					type: "text",
+					clickFun: (row) => {
+						if (!row.checkName) {
+							open(row)
+						} else {
+							proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
+						}
+					},
+					disabled: (row) => {
+						return row.inspectState == 1 || row.checkName;
+					}
 				},
-			},
+				{
+					name: "涓嬭浇",
+					type: "text",
+					clickFun: (row) => {
+						downLoadFile(row);
+					},
+				},
     ],
   },
 ]);
@@ -240,6 +273,13 @@
 	checkName: ""
 });
 const dialogFormVisible = ref(false);
+const quickCheckVisible = ref(false);
+const quickCheckForm = ref({
+	checkResult: "鍚堟牸",
+	checkName: "",
+	checkTime: ""
+});
+const quickCheckRef = ref(null);
 
 const changeDaterange = (value) => {
   searchForm.value.entryDateStart = undefined;
@@ -367,7 +407,11 @@
 
 const open = async (row) => {
 	let userLists = await userListNoPage();
-	userList.value = userLists.data;
+	// 绛涢�� roleIds 鍖呭惈 106 鐨勭敤鎴�
+	userList.value = (userLists.data || []).filter(user => {
+		const roleIds = user.roleIds || [];
+		return roleIds.includes(106) || roleIds.includes('106');
+	});
 	currentRow.value = row
 	dialogFormVisible.value = true
 }
@@ -378,17 +422,91 @@
 			type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
 		})
 		const downloadUrl = window.URL.createObjectURL(blob)
-		
+
 		const link = document.createElement('a')
 		link.href = downloadUrl
 		link.download = '鍘熸潗鏂欐楠屾姤鍛�.docx'
 		document.body.appendChild(link)
 		link.click()
-		
+
 		document.body.removeChild(link)
 		window.URL.revokeObjectURL(downloadUrl)
 	})
 };
+
+// 鎵撳紑妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗�
+const openQuickCheck = async (row) => {
+	currentRow.value = row;
+	// 鍔犺浇鐢ㄦ埛鍒楄〃锛岀瓫閫� roleIds 鍖呭惈 106 鐨勭敤鎴�
+	try {
+		const userLists = await userListNoPage();
+		userList.value = (userLists.data || []).filter(user => {
+			const roleIds = user.roleIds || [];
+			return roleIds.includes(106) || roleIds.includes('106');
+		});
+	} catch (e) {
+		console.error("鍔犺浇妫�楠屽憳鍒楄〃澶辫触", e);
+		userList.value = [];
+	}
+	// 璁剧疆榛樿鍊硷紙妫�楠屽憳榛樿涓哄綋鍓嶇櫥褰曠敤鎴凤級
+	quickCheckForm.value = {
+		checkResult: "鍚堟牸",
+		checkName: userStore.nickName || "",
+		checkTime: dayjs().format("YYYY-MM-DD")
+	};
+	quickCheckVisible.value = true;
+};
+
+// 鍏抽棴妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗�
+const closeQuickCheck = () => {
+	quickCheckVisible.value = false;
+	quickCheckForm.value = {
+		checkResult: "鍚堟牸",
+		checkName: "",
+		checkTime: ""
+	};
+};
+
+// 纭妫�楠岀粨鏋�
+const handleQuickCheckConfirm = () => {
+	if (!quickCheckForm.value.checkResult) {
+		proxy.$modal.msgWarning("璇烽�夋嫨妫�娴嬬粨鏋�");
+		return;
+	}
+	if (!quickCheckForm.value.checkName) {
+		proxy.$modal.msgWarning("璇烽�夋嫨妫�楠屽憳");
+		return;
+	}
+	if (!quickCheckForm.value.checkTime) {
+		proxy.$modal.msgWarning("璇烽�夋嫨妫�娴嬫棩鏈�");
+		return;
+	}
+
+	if (quickCheckForm.value.checkResult === "鍚堟牸") {
+		// 鍚堟牸锛氱洿鎺ユ彁浜�
+		const data = {
+			id: currentRow.value.id,
+			checkResult: "鍚堟牸",
+			checkName: quickCheckForm.value.checkName,
+			checkTime: quickCheckForm.value.checkTime,
+			inspectType: 2
+		};
+		qualityInspectUpdate(data).then(res => {
+			proxy.$modal.msgSuccess("妫�楠屾垚鍔�");
+			closeQuickCheck();
+			getList();
+		});
+	} else {
+		// 涓嶅悎鏍硷細鎵撳紑璇︾粏濉啓椤甸潰锛屼紶閫掓楠屽憳淇℃伅
+		// 鍏堜繚瀛樻楠屽憳鍊硷紝閬垮厤 closeQuickCheck 閲嶇疆鍚庝涪澶�
+		const checkNameToPass = quickCheckForm.value.checkName;
+		closeQuickCheck();
+		nextTick(() => {
+			formDia.value?.openDialog("edit", currentRow.value, "涓嶅悎鏍�", checkNameToPass);
+		});
+	}
+};
+
 onMounted(() => {
   getList();
 });
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index c1185d2..fb2f830 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -89,7 +89,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�楠屽憳锛�" prop="checkName">
-							<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
+							<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable filterable>
 								<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
 													 :value="item.nickName"/>
 							</el-select>
@@ -216,7 +216,7 @@
 const modelOptions = ref([]);
 
 // 鎵撳紑寮规
-const openDialog = async (type, row) => {
+const openDialog = async (type, row, defaultCheckResult = "", defaultCheckName = "") => {
 	operationType.value = type;
 	getOptions().then((res) => {
 		supplierList.value = res.data;
@@ -230,12 +230,16 @@
 		processList.value = [];
 	}
 	let userLists = await userListNoPage();
-	userList.value = userLists.data;
-	// 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
+	// 绛涢�� roleIds 鍖呭惈 106 鐨勭敤鎴�
+	userList.value = (userLists.data || []).filter(user => {
+		const roleIds = user.roleIds || [];
+		return roleIds.includes(106) || roleIds.includes('106');
+	});
+	// 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡"闂竴涓�"锛�
 	form.value = {
 		checkTime: "",
 		process: "",
-		checkName: "",
+		checkName: defaultCheckName || "",
 		productName: "",
 		productId: "",
 		productModelId: "",
@@ -244,7 +248,7 @@
 		unit: "",
 		quantity: "",
 		checkCompany: "",
-		checkResult: "",
+		checkResult: defaultCheckResult || "",
 	}
 	testStandardOptions.value = [];
 	tableData.value = [];
@@ -255,6 +259,13 @@
 		const savedTestStandardId = row.testStandardId;
 		// 鍏堣缃〃鍗曟暟鎹紝浣嗘殏鏃舵竻绌� testStandardId锛岀瓑閫夐」鍔犺浇瀹屾垚鍚庡啀璁剧疆
 		form.value = {...row, testStandardId: ''}
+		// 濡傛灉浼犲叆浜嗛粯璁ゆ娴嬬粨鏋滐紝瑕嗙洊row涓殑鍊�
+		if (defaultCheckResult) {
+		form.value.checkResult = defaultCheckResult;
+		}
+		// 濡傛灉浼犲叆浜嗛粯璁ゆ楠屽憳锛岃鐩杛ow涓殑鍊硷紙浼樺厛浣跨敤浼犲叆鐨勬楠屽憳锛�
+		console.log('formDia checkName debug:', { defaultCheckName, rowCheckName: row.checkName });
+			form.value.checkName = defaultCheckName || row.checkName || "";
 		currentProductId.value = row.productId || 0
 		// 鍏抽敭锛氱紪杈戞椂鍔犺浇瑙勬牸鍨嬪彿涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
 		if (currentProductId.value) {
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index cbeab71..cf1e77c 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -40,23 +40,56 @@
     <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
     <FormDia ref="formDia" @close="handleQuery"></FormDia>
     <files-dia ref="filesDia" @close="handleQuery"></files-dia>
-		<el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
+    <!-- 妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗� -->
+    <el-dialog v-model="quickCheckVisible" title="妫�楠岀粨鏋�" width="30%" @close="closeQuickCheck">
+      <el-form :model="quickCheckForm" label-width="140px" label-position="top" ref="quickCheckRef">
+        <el-form-item label="妫�娴嬬粨鏋滐細" required>
+          <el-radio-group v-model="quickCheckForm.checkResult">
+            <el-radio value="鍚堟牸">鍚堟牸</el-radio>
+            <el-radio value="涓嶅悎鏍�">涓嶅悎鏍�</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="妫�楠屽憳锛�">
+          <el-select v-model="quickCheckForm.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+            <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妫�娴嬫棩鏈燂細">
+          <el-date-picker
+            v-model="quickCheckForm.checkTime"
+            type="date"
+            placeholder="璇烽�夋嫨鏃ユ湡"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            clearable
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="handleQuickCheckConfirm">纭</el-button>
+          <el-button @click="closeQuickCheck">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
 							 @close="closeDia">
-			<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
-				<el-form-item label="妫�楠屽憳锛�" prop="checkName">
-					<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
-						<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
-											 :value="item.nickName"/>
-					</el-select>
-				</el-form-item>
-			</el-form>
-			<template #footer>
-				<div class="dialog-footer">
-					<el-button type="primary" @click="submitForm">纭</el-button>
-					<el-button @click="closeDia">鍙栨秷</el-button>
-				</div>
-			</template>
-		</el-dialog>
+				<el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+					<el-form-item label="妫�楠屽憳锛�" prop="checkName">
+						<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
+							<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
+												 :value="item.nickName"/>
+						</el-select>
+					</el-form-item>
+				</el-form>
+				<template #footer>
+					<div class="dialog-footer">
+						<el-button type="primary" @click="submitForm">纭</el-button>
+						<el-button @click="closeDia">鍙栨秷</el-button>
+					</div>
+				</template>
+			</el-dialog>
   </div>
 </template>
 
@@ -164,10 +197,10 @@
     width: 280,
     operation: [
       {
-        name: "缂栬緫",
+        name: "妫�楠�",
         type: "text",
         clickFun: (row) => {
-          openForm("edit", row);
+          openQuickCheck(row);
         },
 				disabled: (row) => {
 					// 宸叉彁浜ゅ垯绂佺敤
@@ -186,43 +219,43 @@
           openFilesFormDia(row);
         },
       },
-			{
-				name: "鎻愪氦",
-				type: "text",
-				clickFun: (row) => {
-					submit(row.id);
-				},
-				disabled: (row) => {
-					// 宸叉彁浜ゅ垯绂佺敤
-					if (row.inspectState == 1) return true;
-					// 濡傛灉妫�楠屽憳鏈夊�硷紝鍙湁褰撳墠鐧诲綍鐢ㄦ埛鑳芥彁浜�
-					if (row.checkName) {
-						return row.checkName !== userStore.nickName;
-					}
-					return false;
-				}
-			},
-			{
-				name: "鍒嗛厤妫�楠屽憳",
-				type: "text",
-				clickFun: (row) => {
-					if (!row.checkName) {
-						open(row)
-					} else {
-						proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
+				{
+					name: "鎻愪氦",
+					type: "text",
+					clickFun: (row) => {
+						submit(row.id);
+					},
+					disabled: (row) => {
+						// 宸叉彁浜ゅ垯绂佺敤
+						if (row.inspectState == 1) return true;
+						// 濡傛灉妫�楠屽憳鏈夊�硷紝鍙湁褰撳墠鐧诲綍鐢ㄦ埛鑳芥彁浜�
+						if (row.checkName) {
+							return row.checkName !== userStore.nickName;
+						}
+						return false;
 					}
 				},
-				disabled: (row) => {
-					return row.inspectState == 1 || row.checkName;
-				}
-			},
-			{
-				name: "涓嬭浇",
-				type: "text",
-				clickFun: (row) => {
-					downLoadFile(row);
+				{
+					name: "鍒嗛厤妫�楠屽憳",
+					type: "text",
+					clickFun: (row) => {
+						if (!row.checkName) {
+							open(row)
+						} else {
+							proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�");
+						}
+					},
+					disabled: (row) => {
+						return row.inspectState == 1 || row.checkName;
+					}
 				},
-			},
+				{
+					name: "涓嬭浇",
+					type: "text",
+					clickFun: (row) => {
+						downLoadFile(row);
+					},
+				},
     ],
   },
 ]);
@@ -235,6 +268,13 @@
 const form = ref({
 	checkName: ""
 });
+const quickCheckVisible = ref(false);
+const quickCheckForm = ref({
+	checkResult: "鍚堟牸",
+	checkName: "",
+	checkTime: ""
+});
+const quickCheckRef = ref(null);
 const page = reactive({
   current: 1,
   size: 100,
@@ -310,7 +350,11 @@
 }
 const open = async (row) => {
 	let userLists = await userListNoPage();
-	userList.value = userLists.data;
+	// 绛涢�� roleIds 鍖呭惈 106 鐨勭敤鎴�
+	userList.value = (userLists.data || []).filter(user => {
+		const roleIds = user.roleIds || [];
+		return roleIds.includes(106) || roleIds.includes('106');
+	});
 	currentRow.value = row
 	dialogFormVisible.value = true
 }
@@ -363,13 +407,13 @@
 			type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
 		})
 		const downloadUrl = window.URL.createObjectURL(blob)
-		
+
 		const link = document.createElement('a')
 		link.href = downloadUrl
 		link.download = '杩囩▼妫�楠屾姤鍛�.docx'
 		document.body.appendChild(link)
 		link.click()
-		
+
 		document.body.removeChild(link)
 		window.URL.revokeObjectURL(downloadUrl)
 	})
@@ -388,6 +432,80 @@
         proxy.$modal.msg("宸插彇娑�");
       });
 };
+
+// 鎵撳紑妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗�
+const openQuickCheck = async (row) => {
+	currentRow.value = row;
+	// 鍔犺浇鐢ㄦ埛鍒楄〃锛岀瓫閫� roleIds 鍖呭惈 106 鐨勭敤鎴�
+	try {
+		const userLists = await userListNoPage();
+		userList.value = (userLists.data || []).filter(user => {
+			const roleIds = user.roleIds || [];
+			return roleIds.includes(106) || roleIds.includes('106');
+		});
+	} catch (e) {
+		console.error("鍔犺浇妫�楠屽憳鍒楄〃澶辫触", e);
+		userList.value = [];
+	}
+	// 璁剧疆榛樿鍊硷紙妫�楠屽憳榛樿涓哄綋鍓嶇櫥褰曠敤鎴凤級
+	quickCheckForm.value = {
+		checkResult: "鍚堟牸",
+		checkName: userStore.nickName || "",
+		checkTime: dayjs().format("YYYY-MM-DD")
+	};
+	quickCheckVisible.value = true;
+};
+
+// 鍏抽棴妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗�
+const closeQuickCheck = () => {
+	quickCheckVisible.value = false;
+	quickCheckForm.value = {
+		checkResult: "鍚堟牸",
+		checkName: "",
+		checkTime: ""
+	};
+};
+
+// 纭妫�楠岀粨鏋�
+const handleQuickCheckConfirm = () => {
+	if (!quickCheckForm.value.checkResult) {
+		proxy.$modal.msgWarning("璇烽�夋嫨妫�娴嬬粨鏋�");
+		return;
+	}
+	if (!quickCheckForm.value.checkName) {
+		proxy.$modal.msgWarning("璇烽�夋嫨妫�楠屽憳");
+		return;
+	}
+	if (!quickCheckForm.value.checkTime) {
+		proxy.$modal.msgWarning("璇烽�夋嫨妫�娴嬫棩鏈�");
+		return;
+	}
+
+	if (quickCheckForm.value.checkResult === "鍚堟牸") {
+		// 鍚堟牸锛氱洿鎺ユ彁浜�
+		const data = {
+			id: currentRow.value.id,
+			checkResult: "鍚堟牸",
+			checkName: quickCheckForm.value.checkName,
+			checkTime: quickCheckForm.value.checkTime,
+			inspectType: 1
+		};
+		qualityInspectUpdate(data).then(res => {
+			proxy.$modal.msgSuccess("妫�楠屾垚鍔�");
+			closeQuickCheck();
+			getList();
+		});
+	} else {
+		// 涓嶅悎鏍硷細鎵撳紑璇︾粏濉啓椤甸潰锛屼紶閫掓楠屽憳淇℃伅
+		// 鍏堜繚瀛樻楠屽憳鍊硷紝閬垮厤 closeQuickCheck 閲嶇疆鍚庝涪澶�
+		const checkNameToPass = quickCheckForm.value.checkName;
+		closeQuickCheck();
+		nextTick(() => {
+			formDia.value?.openDialog("edit", currentRow.value, "涓嶅悎鏍�", checkNameToPass);
+		});
+	}
+};
+
 onMounted(() => {
   getList();
 });
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 7e373bf..bec44df 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -100,7 +100,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�楠屽憳锛�" prop="checkName">
-              <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+              <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%" filterable>
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
               </el-select>
             </el-form-item>
@@ -228,7 +228,7 @@
 });
 
 // 鎵撳紑寮规
-const openDialog = async (type, row) => {
+const openDialog = async (type, row, defaultCheckResult = "", defaultCheckName = "") => {
   operationType.value = type;
   getOptions().then((res) => {
     supplierList.value = res.data;
@@ -236,16 +236,20 @@
 
   try {
     const userRes = await userListNoPage();
-    userList.value = userRes.data || [];
+    // 绛涢�� roleIds 鍖呭惈 106 鐨勭敤鎴�
+    userList.value = (userRes.data || []).filter(user => {
+      const roleIds = user.roleIds || [];
+      return roleIds.includes(106) || roleIds.includes('106');
+    });
   } catch (e) {
     console.error("鍔犺浇妫�楠屽憳鍒楄〃澶辫触", e);
     userList.value = [];
   }
-  // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
+  // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡"闂竴涓�"锛�
 	form.value = {
     checkTime: "",
     supplier: "",
-    checkName: "",
+    checkName: defaultCheckName || "",
     productName: "",
     productId: "",
     productModelId: "",
@@ -254,7 +258,7 @@
     unit: "",
     quantity: "",
     checkCompany: "",
-    checkResult: "",
+    checkResult: defaultCheckResult || "",
   }
   testStandardOptions.value = [];
   tableData.value = [];
@@ -264,6 +268,13 @@
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
     const savedTestStandardId = row.testStandardId;
     form.value = {...row}
+    // 濡傛灉浼犲叆浜嗛粯璁ゆ娴嬬粨鏋滐紝瑕嗙洊row涓殑鍊�
+    if (defaultCheckResult) {
+      form.value.checkResult = defaultCheckResult;
+    }
+    // 濡傛灉浼犲叆浜嗛粯璁ゆ楠屽憳锛岃鐩杛ow涓殑鍊硷紙浼樺厛浣跨敤浼犲叆鐨勬楠屽憳锛�
+    console.log('formDia checkName debug:', { defaultCheckName, rowCheckName: row.checkName });
+    form.value.checkName = defaultCheckName || row.checkName || "";
     currentProductId.value = row.productId || 0
     // 鍏抽敭锛氱紪杈戞椂鍔犺浇瑙勬牸鍨嬪彿涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
     if (currentProductId.value) {
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 26504b0..67bf6ef 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -41,6 +41,39 @@
     <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia>
     <FormDia ref="formDia" @close="handleQuery"></FormDia>
     <files-dia ref="filesDia" @close="handleQuery"></files-dia>
+    <!-- 妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗� -->
+    <el-dialog v-model="quickCheckVisible" title="妫�楠岀粨鏋�" width="30%" @close="closeQuickCheck">
+      <el-form :model="quickCheckForm" label-width="140px" label-position="top" ref="quickCheckRef">
+        <el-form-item label="妫�娴嬬粨鏋滐細" required>
+          <el-radio-group v-model="quickCheckForm.checkResult">
+            <el-radio value="鍚堟牸">鍚堟牸</el-radio>
+            <el-radio value="涓嶅悎鏍�">涓嶅悎鏍�</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="妫�楠屽憳锛�">
+          <el-select v-model="quickCheckForm.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+            <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妫�娴嬫棩鏈燂細">
+          <el-date-picker
+            v-model="quickCheckForm.checkTime"
+            type="date"
+            placeholder="璇烽�夋嫨鏃ユ湡"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            clearable
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="handleQuickCheckConfirm">纭</el-button>
+          <el-button @click="closeQuickCheck">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
     <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="30%"
                @close="closeDia">
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
@@ -166,10 +199,10 @@
     width: 280,
     operation: [
       {
-        name: "缂栬緫",
+        name: "妫�楠�",
         type: "text",
         clickFun: (row) => {
-          openForm("edit", row);
+          openQuickCheck(row);
         },
 				disabled: (row) => {
 					// 宸叉彁浜ゅ垯绂佺敤
@@ -236,6 +269,13 @@
 const form = ref({
   checkName: ""
 });
+const quickCheckVisible = ref(false);
+const quickCheckForm = ref({
+  checkResult: "鍚堟牸",
+  checkName: "",
+  checkTime: ""
+});
+const quickCheckRef = ref(null);
 const page = reactive({
   current: 1,
   size: 100,
@@ -367,7 +407,11 @@
 
 const open = async (row) => {
   let userLists = await userListNoPage();
-  userList.value = userLists.data;
+  // 绛涢�� roleIds 鍖呭惈 106 鐨勭敤鎴�
+  userList.value = (userLists.data || []).filter(user => {
+    const roleIds = user.roleIds || [];
+    return roleIds.includes(106) || roleIds.includes('106');
+  });
   currentRow.value = row
   dialogFormVisible.value = true
 }
@@ -390,6 +434,79 @@
   })
 };
 
+// 鎵撳紑妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗�
+const openQuickCheck = async (row) => {
+  currentRow.value = row;
+  // 鍔犺浇鐢ㄦ埛鍒楄〃锛岀瓫閫� roleIds 鍖呭惈 106 鐨勭敤鎴�
+  try {
+    const userLists = await userListNoPage();
+    userList.value = (userLists.data || []).filter(user => {
+      const roleIds = user.roleIds || [];
+      return roleIds.includes(106) || roleIds.includes('106');
+    });
+  } catch (e) {
+    console.error("鍔犺浇妫�楠屽憳鍒楄〃澶辫触", e);
+    userList.value = [];
+  }
+  // 璁剧疆榛樿鍊硷紙妫�楠屽憳榛樿涓哄綋鍓嶇櫥褰曠敤鎴凤級
+  quickCheckForm.value = {
+    checkResult: "鍚堟牸",
+    checkName: userStore.nickName || "",
+    checkTime: dayjs().format("YYYY-MM-DD")
+  };
+  quickCheckVisible.value = true;
+};
+
+// 鍏抽棴妫�楠岀粨鏋滈�夋嫨瀵硅瘽妗�
+const closeQuickCheck = () => {
+  quickCheckVisible.value = false;
+  quickCheckForm.value = {
+    checkResult: "鍚堟牸",
+    checkName: "",
+    checkTime: ""
+  };
+};
+
+// 纭妫�楠岀粨鏋�
+const handleQuickCheckConfirm = () => {
+  if (!quickCheckForm.value.checkResult) {
+    proxy.$modal.msgWarning("璇烽�夋嫨妫�娴嬬粨鏋�");
+    return;
+  }
+  if (!quickCheckForm.value.checkName) {
+    proxy.$modal.msgWarning("璇烽�夋嫨妫�楠屽憳");
+    return;
+  }
+  if (!quickCheckForm.value.checkTime) {
+    proxy.$modal.msgWarning("璇烽�夋嫨妫�娴嬫棩鏈�");
+    return;
+  }
+
+  if (quickCheckForm.value.checkResult === "鍚堟牸") {
+    // 鍚堟牸锛氱洿鎺ユ彁浜�
+    const data = {
+      id: currentRow.value.id,
+      checkResult: "鍚堟牸",
+      checkName: quickCheckForm.value.checkName,
+      checkTime: quickCheckForm.value.checkTime,
+      inspectType: 0
+    };
+    qualityInspectUpdate(data).then(res => {
+      proxy.$modal.msgSuccess("妫�楠屾垚鍔�");
+      closeQuickCheck();
+      getList();
+    });
+  } else {
+    // 涓嶅悎鏍硷細鎵撳紑璇︾粏濉啓椤甸潰锛屼紶閫掓楠屽憳淇℃伅
+    // 鍏堜繚瀛樻楠屽憳鍊硷紝閬垮厤 closeQuickCheck 閲嶇疆鍚庝涪澶�
+    const checkNameToPass = quickCheckForm.value.checkName;
+    closeQuickCheck();
+    nextTick(() => {
+      formDia.value?.openDialog("edit", currentRow.value, "涓嶅悎鏍�", checkNameToPass);
+    });
+  }
+};
+
 onMounted(() => {
   getList();
 });
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index 5345cad..bc78e1b 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -46,6 +46,13 @@
             :formatter="formattedNumber"
           />
           <el-table-column
+              label="鍥炴閲戦(鍏�)"
+              prop="receiptPaymentAmount"
+              show-overflow-tooltip
+              :formatter="formattedNumber"
+              width="200"
+          />
+          <el-table-column
             label="搴旀敹閲戦(鍏�)"
             prop="unReceiptPaymentAmount"
             show-overflow-tooltip
@@ -101,6 +108,13 @@
 						width="200"
           />
           <el-table-column
+              label="鍥炴閲戦(鍏�)"
+              prop="receiptPaymentAmount"
+              show-overflow-tooltip
+              :formatter="formattedNumber"
+              width="200"
+          />
+          <el-table-column
             label="搴旀敹閲戦(鍏�)"
             prop="unReceiptPaymentAmount"
             show-overflow-tooltip
diff --git a/vite.config.js b/vite.config.js
index af1ed35..4e392ae 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -8,11 +8,11 @@
   const { VITE_APP_ENV } = env;
   const baseUrl =
       env.VITE_APP_ENV === "development"
-          ? "http://1.15.17.182:9023"
+          ? "http://1.15.17.182:9038"
           : env.VITE_BASE_API;
   const javaUrl =
       env.VITE_APP_ENV === "development"
-          ? "http://1.15.17.182:9023"
+          ? "http://1.15.17.182:9039"
           : env.VITE_JAVA_API;
   return {
     define:{

--
Gitblit v1.9.3