From 9b9542833ee33cf7e7f5a7e020050a4ceaf37c93 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期一, 23 三月 2026 18:00:33 +0800
Subject: [PATCH] 报工模块接口对接(还需调试)

---
 src/views/productionManagement/productionReporting/reportingDialog.vue |  233 +++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 175 insertions(+), 58 deletions(-)

diff --git a/src/views/productionManagement/productionReporting/reportingDialog.vue b/src/views/productionManagement/productionReporting/reportingDialog.vue
index 9b8b107..adae305 100644
--- a/src/views/productionManagement/productionReporting/reportingDialog.vue
+++ b/src/views/productionManagement/productionReporting/reportingDialog.vue
@@ -117,19 +117,6 @@
                         v-model="form.npsNo"
                         class="form-input" />
             </el-form-item>
-            <el-form-item label="鐝粍"
-                          prop="teamName"
-                          required
-                          class="form-item">
-              <el-select v-model="form.teamName"
-                         placeholder="璇烽�夋嫨鐝粍"
-                         class="form-select">
-                <el-option label="鐧界彮"
-                           value="鐧界彮" />
-                <el-option label="澶滅彮"
-                           value="澶滅彮" />
-              </el-select>
-            </el-form-item>
             <el-form-item label="浜у搧缂栫爜"
                           prop="materialCode"
                           class="form-item">
@@ -151,6 +138,28 @@
                         v-model="form.specification"
                         class="form-input" />
             </el-form-item>
+            <el-form-item label="鍒涘缓鏃堕棿"
+                          prop="createTime"
+                          class="form-item">
+              <el-date-picker disabled
+                              v-model="form.createTime"
+                              type="datetime"
+                              placeholder="璇烽�夋嫨鍒涘缓鏃堕棿"
+                              class="form-input" />
+            </el-form-item>
+            <el-form-item label="鐝粍"
+                          prop="teamName"
+                          required
+                          class="form-item">
+              <el-select v-model="form.teamName"
+                         placeholder="璇烽�夋嫨鐝粍"
+                         class="form-select">
+                <el-option label="鐧界彮"
+                           value="鐧界彮" />
+                <el-option label="澶滅彮"
+                           value="澶滅彮" />
+              </el-select>
+            </el-form-item>
             <el-form-item label="鍒涘缓浜�"
                           prop="createBy"
                           required
@@ -164,15 +173,6 @@
                            :label="user.nickName || user.userName"
                            :value="user.nickName || user.userName" />
               </el-select>
-            </el-form-item>
-            <el-form-item label="鍒涘缓鏃堕棿"
-                          prop="createTime"
-                          class="form-item">
-              <el-date-picker disabled
-                              v-model="form.createTime"
-                              type="datetime"
-                              placeholder="璇烽�夋嫨鍒涘缓鏃堕棿"
-                              class="form-input" />
             </el-form-item>
           </div>
         </el-form>
@@ -213,8 +213,8 @@
                  @click="handleProcessClick(process.processId)">
               <span class="process-name">{{ process.processName }}</span>
               <span class="process-badge"
-                    v-if="getProcessInfo(parseInt(process.processId)).postPersonnel">
-                {{ getProcessInfo(parseInt(process.processId)).postPersonnel }}
+                    v-if="getProcessInfo(parseInt(process.processId)).postName">
+                {{ getProcessInfo(parseInt(process.processId)).postName }}
               </span>
             </div>
           </div>
@@ -232,7 +232,7 @@
                     <div class="form-grid">
                       <el-form-item label="宀椾綅浜哄憳"
                                     class="form-item">
-                        <el-select v-model="getProcessInfo(parseInt(activeProcessId)).postPersonnel"
+                        <el-select v-model="getProcessInfo(parseInt(activeProcessId)).postName"
                                    placeholder="璇烽�夋嫨宀椾綅浜哄憳"
                                    class="form-select"
                                    :loading="userLoading">
@@ -244,7 +244,7 @@
                       </el-form-item>
                       <el-form-item label="璁惧寮傚父鎯呭喌"
                                     class="form-item">
-                        <el-input v-model="getProcessInfo(parseInt(activeProcessId)).equipmentAbnormality"
+                        <el-input v-model="getProcessInfo(parseInt(activeProcessId)).equipmentMalfunction"
                                   placeholder="璇疯緭鍏ヨ澶囧紓甯告儏鍐�"
                                   type="textarea"
                                   :rows="2"
@@ -252,7 +252,7 @@
                       </el-form-item>
                       <el-form-item label="褰撶彮璁惧澶勭疆"
                                     class="form-item">
-                        <el-input v-model="getProcessInfo(parseInt(activeProcessId)).equipmentHandling"
+                        <el-input v-model="getProcessInfo(parseInt(activeProcessId)).equipmentDisposal"
                                   placeholder="璇疯緭鍏ュ綋鐝澶囧缃�"
                                   type="textarea"
                                   :rows="2"
@@ -260,7 +260,7 @@
                       </el-form-item>
                       <el-form-item label="宸ヨ壓浜哄憳浜ゅ緟"
                                     class="form-item">
-                        <el-input v-model="getProcessInfo(parseInt(activeProcessId)).processInstructions"
+                        <el-input v-model="getProcessInfo(parseInt(activeProcessId)).processExplained"
                                   placeholder="璇疯緭鍏ュ伐鑹轰汉鍛樹氦寰�"
                                   type="textarea"
                                   :rows="2"
@@ -357,6 +357,7 @@
                                       :key="param.id"
                                       :label="param.paramName"
                                       :label-width="120"
+                                      :prop="`paramGroups.${activeProcessId}.${index}.${param.id}`"
                                       class="param-item">
                           <template v-if="param.paramType == '1'">
                             <!-- 鏁板瓧绫诲瀷 -->
@@ -454,8 +455,10 @@
                     <!-- 鍙傛暟鍒� -->
                     <el-table-column v-for="param in params"
                                      :key="param.id"
-                                     :label="param.paramName"
-                                     min-width="200">
+                                     :min-width="200">
+                      <template #header>
+                        <span>{{ param.paramName }}</span>
+                      </template>
                       <template #default="{ row }">
                         <template v-if="param.paramType == '1'">
                           <!-- 鏁板瓧绫诲瀷 -->
@@ -560,6 +563,7 @@
                 <el-input-number v-model="form.outputVolume"
                                  :min="0"
                                  :precision="2"
+                                 @change="handleVolumeChange"
                                  class="volume-input" />
                 <span class="volume-unit">鏂�</span>
               </div>
@@ -572,6 +576,7 @@
                 <el-input-number v-model="form.unqualifiedVolume"
                                  :min="0"
                                  :precision="2"
+                                 @change="handleVolumeChange"
                                  class="volume-input" />
                 <span class="volume-unit">鏂�</span>
               </div>
@@ -602,19 +607,15 @@
   import { useRouter, useRoute } from "vue-router";
   import { getDicts } from "@/api/system/dict/data";
   import { productOrderListPage } from "@/api/productionManagement/productionOrder.js";
-  import { productionRecordAdd } from "@/api/productionManagement/productProcessRoute.js";
+  import {
+    productionRecordAdd,
+    productionRecordAddSubmit,
+  } from "@/api/productionManagement/productProcessRoute.js";
   import { userListNoPage } from "@/api/system/user.js";
   import { getInfo } from "@/api/login.js";
-  import {
-    Check,
-    Close,
-    Delete,
-    Plus,
-    ArrowLeft,
-    ArrowRight,
-    Loading,
-    Upload,
-  } from "@element-plus/icons-vue";
+  import request from "@/utils/request";
+  import { getToken } from "@/utils/auth";
+  import dayjs from "dayjs";
 
   const router = useRouter();
 
@@ -658,7 +659,7 @@
     id: data.id || undefined,
     orderId: data.orderId || "",
     npsNo: data.npsNo || "",
-    teamName: data.teamName || "",
+    teamName: data.teamName || "鐧界彮",
     materialCode: data.materialCode || "",
     productName: data.productName || "",
     specification: data.specification || "",
@@ -695,6 +696,9 @@
       .finally(() => {
         orderLoading.value = false;
       });
+  };
+  const handleVolumeChange = () => {
+    form.completedVolume = form.outputVolume - form.unqualifiedVolume;
   };
 
   // 澶勭悊鐢熶骇璁㈠崟閫夋嫨
@@ -739,6 +743,7 @@
           processList.value.forEach(process => {
             form.processStructures[process.processId] =
               process.orderStructureVos || [];
+            loadParams(process.processId, orderId);
           });
           // 濡傛灉鏈夊伐搴忥紝榛樿閫夋嫨绗竴涓�
           if (processList.value.length > 0) {
@@ -747,7 +752,7 @@
             processId.value = firstProcess.processId;
             form.processId = firstProcess.processId;
             // 鍔犺浇绗竴涓伐搴忕殑鍙傛暟
-            loadParams(firstProcess.processId, orderId);
+            // loadParams(firstProcess.processId, orderId);
           }
         }
       })
@@ -772,10 +777,10 @@
     }
     if (!form.processInfo[processId]) {
       form.processInfo[processId] = {
-        postPersonnel: "",
-        equipmentAbnormality: "",
-        equipmentHandling: "",
-        processInstructions: "",
+        postName: "",
+        equipmentMalfunction: "",
+        equipmentDisposal: "",
+        processExplained: "",
         files: [],
         consumables: {},
       };
@@ -848,7 +853,26 @@
   };
 
   // 澶勭悊鏂囦欢鍙樻洿
-  const handleFileChange = (file, fileList) => {
+  const handleFileChange = async (file, fileList) => {
+    console.log(file, fileList);
+    const formData = new FormData();
+    formData.append("file", file.raw);
+
+    const uploadRes = await request({
+      url: "/file/upload",
+      method: "post",
+      data: formData,
+      headers: {
+        "Content-Type": "multipart/form-data",
+        Authorization: `Bearer ${getToken()}`,
+      },
+    });
+    console.log(uploadRes);
+    if (uploadRes.code === 200) {
+      const tempId = uploadRes.data.tempId;
+      // 灏唗empId瀛樺偍鍒癴ile瀵硅薄涓�
+      file.tempId = tempId;
+    }
     const processId = parseInt(activeProcessId.value);
     if (processId) {
       const processInfo = getProcessInfo(processId);
@@ -926,7 +950,6 @@
         }
       });
     } else if (activeStep.value === 2) {
-      // 绗笁姝ワ細鐩存帴杩涘叆绗洓姝�
       activeStep.value = 3;
     }
   };
@@ -936,12 +959,99 @@
     formRef.value.validate(valid => {
       if (valid) {
         isSubmitting.value = true;
-        // 杩欓噷鍙互璋冪敤API杩涜鎻愪氦
-        setTimeout(() => {
-          ElMessage.success(data.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
-          router.back();
-          isSubmitting.value = false;
-        }, 1000);
+
+        // 鏋勫缓璇锋眰鍙傛暟
+        const order = orderList.value.find(item => item.id === form.orderId);
+        console.log(order, "order");
+        const submitParams = {
+          productOrderId: form.orderId,
+          productId: order ? order.productId : null,
+          postName: form.createBy,
+          schedule: form.teamName,
+          // reportingTime: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss"),
+          qualifiedQuantity: form.outputVolume - form.unqualifiedVolume,
+          unqualifiedQuantity: form.unqualifiedVolume,
+          quantity: form.outputVolume,
+          productionProductRouteItemDtoList: processList.value.map(process => {
+            const processInfo = getProcessInfo(process.processId);
+            const paramGroups = form.paramGroups[process.processId] || [];
+            const productionProductRouteItemParamDtoList = [];
+
+            // 娣诲姞鍙傛暟缁�
+            paramGroups.forEach((group, index) => {
+              Object.entries(group).forEach(([paramId, value]) => {
+                // 浠庡綋鍓嶅伐搴忕殑鍙傛暟鍒楄〃涓煡鎵惧弬鏁�
+                const processData = processList.value.find(
+                  p => p.processId === process.processId
+                );
+                const param = processData
+                  ? processData.orderRouteItemParaVos.find(
+                      p => p.id === parseInt(paramId)
+                    )
+                  : null;
+                if (param) {
+                  productionProductRouteItemParamDtoList.push({
+                    id: parseInt(paramId),
+                    standardValue: param.standardValue,
+                    minValue: param.minValue,
+                    maxValue: param.maxValue,
+                    productId: param.productId,
+                    productValue: value,
+                    sourceSort: index + 1,
+                    unit: param.unit,
+                    isRequired: param.isRequired,
+                  });
+                }
+              });
+            });
+
+            // 娣诲姞BOM淇℃伅
+            const structures = getProcessStructures(process.processId);
+            console.log(structures, "structures");
+            structures.forEach(structure => {
+              const consumableValue = getConsumableValue(
+                process.processId,
+                structure.id
+              );
+              if (consumableValue > 0) {
+                productionProductRouteItemParamDtoList.push({
+                  productId: structure.productModelId,
+                  bomId: structure.bomId,
+                  id: null,
+                  productValue: consumableValue,
+                  unit: structure.unit,
+                });
+              }
+            });
+
+            return {
+              postName: processInfo.postName,
+              equipmentMalfunction: processInfo.equipmentMalfunction,
+              equipmentDisposal: processInfo.equipmentDisposal,
+              processExplained: processInfo.processExplained,
+              processId: process.processId,
+              productionProductRouteItemParamDtoList,
+              files: processInfo.files.map(file => file.tempId || file.uid),
+            };
+          }),
+        };
+        // 璋冪敤API杩涜鎻愪氦
+        productionRecordAddSubmit(submitParams)
+          .then(res => {
+            if (res.code === 200) {
+              ElMessage.success(data.id ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+              router.back();
+            } else {
+              ElMessage.error(res.msg || "鎻愪氦澶辫触");
+            }
+          })
+          .catch(error => {
+            ElMessage.error("鎻愪氦澶辫触锛岃绋嶅悗閲嶈瘯");
+            console.error("鎻愪氦閿欒:", error);
+          })
+          .finally(() => {
+            isSubmitting.value = false;
+          });
       }
     });
   };
@@ -958,9 +1068,16 @@
     }
     // 鍒涘缓涓�涓柊鐨勫弬鏁扮粍锛屼娇鐢ㄩ粯璁ゅ��
     const newGroup = {};
-    params.value.forEach(param => {
-      newGroup[param.id] = param.standardValue || "";
-    });
+    // 浠庡綋鍓嶅伐搴忕殑鍙傛暟鍒楄〃涓幏鍙栧弬鏁颁俊鎭�
+    const process = processList.value.find(
+      p => p.processId === parseInt(processId)
+    );
+    if (process) {
+      const processParams = process.orderRouteItemParaVos || [];
+      processParams.forEach(param => {
+        newGroup[param.id] = param.standardValue || "";
+      });
+    }
     form.paramGroups[processId].push(newGroup);
   };
 

--
Gitblit v1.9.3