From 70703e0fa04092997db53846d2cd2367f5997284 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 20 三月 2026 17:55:32 +0800
Subject: [PATCH] 生产报工页面更改

---
 src/views/productionManagement/productionReporting/components/ReportingDialog.vue |  367 ++++++++++++++++++++++++----------------------------
 1 files changed, 171 insertions(+), 196 deletions(-)

diff --git a/src/views/productionManagement/productionReporting/components/ReportingDialog.vue b/src/views/productionManagement/productionReporting/components/ReportingDialog.vue
index 9016880..8eff508 100644
--- a/src/views/productionManagement/productionReporting/components/ReportingDialog.vue
+++ b/src/views/productionManagement/productionReporting/components/ReportingDialog.vue
@@ -5,8 +5,7 @@
              @close="handleClose">
     <!-- 姝ラ鏉� -->
     <el-steps :active="activeStep"
-              finish-status="success"
-              v-if="!props.data.id">
+              finish-status="success">
       <el-step title="閫夋嫨鐢熶骇璁㈠崟" />
       <el-step title="濉啓鍩虹淇℃伅" />
       <el-step title="鏌ョ湅宸ュ簭鍙傛暟" />
@@ -98,42 +97,98 @@
                      :key="process.id"
                      :label="process.processName"
                      :name="process.id + ''">
-          <el-form :model="form"
-                   ref="formRef"
-                   label-width="120px">
-            <!-- 鍔ㄦ�佸弬鏁� -->
-            <el-form-item v-for="param in params"
-                          :key="param.id"
-                          :label="param.paramName">
-              <template v-if="param.paramType == '1'">
-                <!-- 鏁板瓧绫诲瀷 -->
-                <el-input v-model="form.params[param.id]" />
-              </template>
-              <template v-else-if="param.paramType == '2'">
-                <!-- 鏂囨湰绫诲瀷 -->
-                <el-input v-model="form.params[param.id]" />
-              </template>
-              <template v-else-if="param.paramType == '3'">
-                <!-- 瀛楀吀绫诲瀷 -->
-                <el-select v-model="form.params[param.id]"
-                           placeholder="璇烽�夋嫨"
-                           style="width: 100%">
-                  <el-option v-for="option in dictOptions[param.paramFormat] || []"
-                             :key="option.dictValue"
-                             :label="option.dictLabel"
-                             :value="option.dictValue" />
-                </el-select>
-              </template>
-              <template v-else-if="param.paramType == '4'">
-                <!-- 鏃ユ湡绫诲瀷 -->
-                <el-date-picker v-model="form.params[param.id]" />
-              </template>
-              <template v-else>
-                <!-- 鍏朵粬绫诲瀷 -->
-                <el-input v-model="form.params[param.id]" />
-              </template>
-            </el-form-item>
-          </el-form>
+          <div>
+            <!-- 鍙傛暟缁勫垪琛� -->
+            <div v-for="(group, groupIndex) in form.paramGroups[process.id] || []"
+                 :key="groupIndex"
+                 class="param-group">
+              <div class="group-header">
+                <span>鍙傛暟缁� {{ groupIndex + 1 }}</span>
+                <el-button type="danger"
+                           size="small"
+                           @click="removeParamGroup(process.id, groupIndex)"
+                           v-if="(form.paramGroups[process.id] || []).length > 1">
+                  鍒犻櫎
+                </el-button>
+              </div>
+              <el-form :model="form"
+                       ref="formRef"
+                       label-width="120px">
+                <!-- 鍔ㄦ�佸弬鏁� -->
+                <el-form-item v-for="param in params"
+                              :key="param.id"
+                              :label="param.paramName">
+                  <template v-if="param.paramType == '1'">
+                    <!-- 鏁板瓧绫诲瀷 -->
+                    <div style="display: flex; align-items: center; gap: 8px;">
+                      <el-input-number v-model="group[param.id]"
+                                       controls-position="right"
+                                       :precision="getPrecision(param.paramFormat)"
+                                       style="flex: 1" />
+                      <span v-if="param.unit && param.unit != '/'">
+                        {{ param.unit }}
+                      </span>
+                    </div>
+                  </template>
+                  <template v-else-if="param.paramType == '2'">
+                    <!-- 鏂囨湰绫诲瀷 -->
+                    <div style="display: flex; align-items: center; gap: 8px;">
+                      <el-input v-model="group[param.id]"
+                                style="flex: 1" />
+                      <span v-if="param.unit && param.unit != '/'">
+                        {{ param.unit }}
+                      </span>
+                    </div>
+                  </template>
+                  <template v-else-if="param.paramType == '3'">
+                    <!-- 瀛楀吀绫诲瀷 -->
+                    <div style="display: flex; align-items: center; gap: 8px;">
+                      <el-select v-model="group[param.id]"
+                                 placeholder="璇烽�夋嫨"
+                                 style="flex: 1;width: 150px">
+                        <el-option v-for="option in dictOptions[param.paramFormat] || []"
+                                   :key="option.dictValue"
+                                   :label="option.dictLabel"
+                                   :value="option.dictValue" />
+                      </el-select>
+                      <span v-if="param.unit && param.unit != '/'">
+                        {{ param.unit }}
+                      </span>
+                    </div>
+                  </template>
+                  <template v-else-if="param.paramType == '4'">
+                    <!-- 鏃ユ湡绫诲瀷 -->
+                    <div style="display: flex; align-items: center; gap: 8px;">
+                      <el-date-picker :value-format="param.paramFormat"
+                                      :format="param.paramFormat"
+                                      :type="param.paramFormat=='YYYY-MM-DD'?'daterange':'datetimerange'"
+                                      v-model="group[param.id]"
+                                      style="flex: 1" />
+                      <span v-if="param.unit && param.unit != '/'">
+                        {{ param.unit }}
+                      </span>
+                    </div>
+                  </template>
+                  <template v-else>
+                    <!-- 鍏朵粬绫诲瀷 -->
+                    <div style="display: flex; align-items: center; gap: 8px;">
+                      <el-input v-model="group[param.id]"
+                                style="flex: 1" />
+                      <span v-if="param.unit && param.unit != '/'">
+                        {{ param.unit }}
+                      </span>
+                    </div>
+                  </template>
+                </el-form-item>
+              </el-form>
+            </div>
+            <!-- 鏂板鍙傛暟缁勬寜閽� -->
+            <el-button type="primary"
+                       size="small"
+                       @click="addParamGroup(process.id)">
+              鏂板鍙傛暟缁�
+            </el-button>
+          </div>
         </el-tab-pane>
       </el-tabs>
     </div>
@@ -169,135 +224,6 @@
         </el-form-item>
       </el-form>
     </div>
-    <!-- 缂栬緫妯″紡锛氱洿鎺ユ樉绀烘墍鏈変俊鎭� -->
-    <div v-if="props.data.id">
-      <el-form :model="form"
-               :rules="rules"
-               ref="formRef"
-               label-width="120px">
-        <el-form-item label="鐢熶骇璁㈠崟鍙�"
-                      prop="npsNo"
-                      disabled>
-          <el-input v-model="form.npsNo" />
-        </el-form-item>
-        <el-form-item label="鐝粍"
-                      prop="teamName">
-          <el-select v-model="form.teamName"
-                     placeholder="璇烽�夋嫨鐝粍"
-                     style="width: 100%">
-            <el-option label="鐧界彮"
-                       value="鐧界彮" />
-            <el-option label="澶滅彮"
-                       value="澶滅彮" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="浜у搧缂栫爜"
-                      prop="materialCode"
-                      disabled>
-          <el-input v-model="form.materialCode" />
-        </el-form-item>
-        <el-form-item label="浜у搧鍚嶇О"
-                      prop="productName"
-                      disabled>
-          <el-input v-model="form.productName" />
-        </el-form-item>
-        <el-form-item label="瑙勬牸"
-                      prop="specification"
-                      disabled>
-          <el-input v-model="form.specification" />
-        </el-form-item>
-        <el-form-item label="鍒涘缓浜�"
-                      prop="createBy">
-          <el-input v-model="form.createBy"
-                    placeholder="璇疯緭鍏ュ垱寤轰汉" />
-        </el-form-item>
-        <el-form-item label="鍒涘缓鏃堕棿"
-                      prop="createTime"
-                      disabled>
-          <el-date-picker v-model="form.createTime"
-                          type="datetime"
-                          placeholder="璇烽�夋嫨鍒涘缓鏃堕棿"
-                          style="width: 100%" />
-        </el-form-item>
-        <el-form-item label="浜у嚭鏂归噺"
-                      prop="outputVolume">
-          <el-input-number v-model="form.outputVolume"
-                           :min="0"
-                           :precision="2"
-                           style="width: 100%" />
-        </el-form-item>
-        <el-form-item label="涓嶅悎鏍兼柟閲�"
-                      prop="unqualifiedVolume">
-          <el-input-number v-model="form.unqualifiedVolume"
-                           :min="0"
-                           :precision="2"
-                           style="width: 100%" />
-        </el-form-item>
-        <el-form-item label="瀹屾垚鏂归噺"
-                      prop="completedVolume">
-          <el-input-number v-model="form.completedVolume"
-                           :min="0"
-                           :precision="2"
-                           style="width: 100%" />
-        </el-form-item>
-      </el-form>
-      <!-- 宸ュ簭Tab椤� -->
-      <el-tabs v-model="activeProcessId"
-               @tab-click="handleTabClick">
-        <el-tab-pane v-for="process in processList"
-                     :key="process.id"
-                     :label="process.processName"
-                     :name="process.id + ''">
-          <el-form :model="form"
-                   :rules="rules"
-                   ref="formRef"
-                   label-width="120px">
-            <!-- 鍔ㄦ�佸弬鏁� -->
-            <el-form-item v-for="param in params"
-                          :key="param.id"
-                          :label="param.paramName"
-                          :prop="`params.${param.id}`"
-                          :rules="param.isRequired ? [{ required: true, message: `璇疯緭鍏�${param.paramName}`, trigger: 'blur' }] : []">
-              <template v-if="param.paramType == '1'">
-                <!-- 鏁板瓧绫诲瀷 -->
-                <el-input-number v-model="form.params[param.id]"
-                                 :min="0"
-                                 :precision="getPrecision(param.paramFormat)"
-                                 style="width: 100%" />
-              </template>
-              <template v-else-if="param.paramType == '2'">
-                <!-- 鏂囨湰绫诲瀷 -->
-                <el-input v-model="form.params[param.id]"
-                          :placeholder="`璇疯緭鍏�${param.paramName}`" />
-              </template>
-              <template v-else-if="param.paramType == '3'">
-                <!-- 瀛楀吀绫诲瀷 -->
-                <el-select v-model="form.params[param.id]"
-                           placeholder="璇烽�夋嫨"
-                           style="width: 100%">
-                  <el-option v-for="option in dictOptions[param.paramFormat] || []"
-                             :key="option.dictValue"
-                             :label="option.dictLabel"
-                             :value="option.dictValue" />
-                </el-select>
-              </template>
-              <template v-else-if="param.paramType == '4'">
-                <!-- 鏃ユ湡绫诲瀷 -->
-                <el-date-picker v-model="form.params[param.id]"
-                                type="datetime"
-                                placeholder="璇烽�夋嫨鏃ユ湡鏃堕棿"
-                                style="width: 100%" />
-              </template>
-              <template v-else>
-                <!-- 鍏朵粬绫诲瀷 -->
-                <el-input v-model="form.params[param.id]"
-                          :placeholder="`璇疯緭鍏�${param.paramName}`" />
-              </template>
-            </el-form-item>
-          </el-form>
-        </el-tab-pane>
-      </el-tabs>
-    </div>
     <template #footer>
       <span class="dialog-footer">
         <el-button @click="handleClose">鍙� 娑�</el-button>
@@ -305,10 +231,10 @@
                    v-if="activeStep > 0"
                    @click="activeStep--">涓婁竴姝�</el-button>
         <el-button type="primary"
-                   v-if="activeStep < 3 && !props.data.id"
+                   v-if="activeStep < 3"
                    @click="handleNextStep">涓嬩竴姝�</el-button>
         <el-button type="primary"
-                   v-if="activeStep === 3 || props.data.id"
+                   v-if="activeStep === 3"
                    :loading="submitLoading"
                    @click="handleSubmit">纭� 璁�</el-button>
       </span>
@@ -369,7 +295,7 @@
     completedVolume: props.data.completedVolume || 0,
     createBy: props.data.createBy || "褰撳墠鐧诲綍浜�",
     createTime: props.data.createTime || new Date(),
-    params: props.data.params || {},
+    paramGroups: props.data.paramGroups || {}, // 瀛樺偍姣忎釜宸ュ簭鐨勫弬鏁扮粍
   });
 
   const rules = {
@@ -478,15 +404,21 @@
     findProcessParamListOrder({ orderId, routeItemId: processId }).then(
       async res => {
         params.value = res.data || [];
-        // 鍒濆鍖栧弬鏁板�煎苟鑾峰彇瀛楀吀鏁版嵁
-        for (const param of params.value) {
-          if (!form.params[param.id]) {
-            form.params[param.id] = param.standardValue || "";
+        // 鍒濆鍖栧弬鏁扮粍
+        if (!form.paramGroups[processId]) {
+          form.paramGroups[processId] = [];
+        }
+        // 濡傛灉娌℃湁鍙傛暟缁勶紝娣诲姞涓�涓粯璁ゅ弬鏁扮粍
+        if (form.paramGroups[processId].length === 0) {
+          const defaultGroup = {};
+          for (const param of params.value) {
+            defaultGroup[param.id] = param.standardValue || "";
+            // 濡傛灉鏄瓧鍏哥被鍨嬪弬鏁帮紝鑾峰彇瀛楀吀鏁版嵁
+            if (param.paramType == "3" && param.paramFormat) {
+              await getDictOptions(param.paramFormat);
+            }
           }
-          // 濡傛灉鏄瓧鍏哥被鍨嬪弬鏁帮紝鑾峰彇瀛楀吀鏁版嵁
-          if (param.paramType == "3" && param.paramFormat) {
-            await getDictOptions(param.paramFormat);
-          }
+          form.paramGroups[processId].push(defaultGroup);
         }
       }
     );
@@ -564,29 +496,50 @@
     localVisible.value = false;
   };
 
+  // 鏂板鍙傛暟缁�
+  const addParamGroup = processId => {
+    if (!form.paramGroups[processId]) {
+      form.paramGroups[processId] = [];
+    }
+    // 鍒涘缓涓�涓柊鐨勫弬鏁扮粍锛屼娇鐢ㄩ粯璁ゅ��
+    const newGroup = {};
+    params.value.forEach(param => {
+      newGroup[param.id] = param.standardValue || "";
+    });
+    form.paramGroups[processId].push(newGroup);
+  };
+
+  // 鍒犻櫎鍙傛暟缁�
+  const removeParamGroup = (processId, index) => {
+    if (form.paramGroups[processId] && form.paramGroups[processId].length > 1) {
+      form.paramGroups[processId].splice(index, 1);
+    }
+  };
+
   // 鍒濆鍖�
   const init = () => {
-    if (!props.data.id) {
-      // 鏂板鏃跺姞杞借鍗曞垪琛�
-      loadOrders();
-      // 璁剧疆榛樿鍒涘缓浜哄拰鍒涘缓鏃堕棿
+    // 鏃犺鏂板杩樻槸缂栬緫锛岄兘鍔犺浇璁㈠崟鍒楄〃
+    loadOrders();
+
+    if (props.data.id) {
+      // 缂栬緫鏃惰缃〃鍗曟暟鎹�
+      Object.assign(form, props.data);
+      // 璁剧疆orderId
+      orderId.value = props.data.orderId || "";
+      // 濡傛灉鏈夎鍗旾D锛屽姞杞藉伐搴忓拰鍙傛暟
+      if (props.data.orderId) {
+        // 妯℃嫙閫夋嫨璁㈠崟鐨勬搷浣滐紝瑙﹀彂鏁版嵁鍔犺浇
+        setTimeout(() => {
+          handleOrderChange(props.data.orderId);
+        }, 100);
+      }
+    } else {
+      // 鏂板鏃惰缃粯璁ゅ��
       form.createBy = "褰撳墠鐧诲綍浜�";
       form.createTime = new Date();
-    } else {
-      // 缂栬緫鏃跺姞杞界浉鍏虫暟鎹�
-      if (props.data.orderId) {
-        orderId.value = props.data.orderId;
-        if (props.data.processId) {
-          processId.value = props.data.processId;
-          activeProcessId.value = props.data.processId + "";
-          loadParams(props.data.processId, props.data.orderId);
-        } else {
-          loadProcesses(props.data.orderId);
-        }
-      } else {
-        loadOrders();
-      }
     }
+    // 濮嬬粓浠庣涓�姝ュ紑濮�
+    activeStep.value = 0;
   };
 
   // 鐩戝惉props.visible鍙樺寲
@@ -610,4 +563,26 @@
   .dialog-footer {
     text-align: right;
   }
+
+  .param-group {
+    border: 1px solid #e4e7ed;
+    border-radius: 4px;
+    padding: 16px;
+    margin-bottom: 16px;
+    background-color: #f9f9f9;
+  }
+
+  .group-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 16px;
+    padding-bottom: 8px;
+    border-bottom: 1px solid #e4e7ed;
+  }
+
+  .group-header span {
+    font-weight: bold;
+    font-size: 14px;
+  }
 </style>
\ No newline at end of file

--
Gitblit v1.9.3