From 648f83f5d4480ae9c2794d5f4e114085943bdf6e Mon Sep 17 00:00:00 2001
From: chenhj <1263187585@qq.com>
Date: 星期五, 20 三月 2026 13:54:10 +0800
Subject: [PATCH] 造粒报工

---
 src/views/productionManagement/workOrder/components/ProductionRecordForm.vue |    6 
 src/views/productionManagement/productionReporting/components/Detail.vue     |   25 +
 src/views/productionManagement/workOrder/index.vue                           |    6 
 src/views/productionManagement/workOrder/components/GranulationForm.vue      |  757 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 787 insertions(+), 7 deletions(-)

diff --git a/src/views/productionManagement/productionReporting/components/Detail.vue b/src/views/productionManagement/productionReporting/components/Detail.vue
index 8820727..6439989 100644
--- a/src/views/productionManagement/productionReporting/components/Detail.vue
+++ b/src/views/productionManagement/productionReporting/components/Detail.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import {computed, onMounted} from "vue";
+import {computed, onMounted, ref} from "vue";
 
 defineOptions({
   name: "ReportingDetail"
@@ -23,10 +23,19 @@
   set: (value: boolean) => emits("update:isShow", value),
 });
 
-const otherData = ref([])
+const otherData = ref({})
+const otherDataEntries = computed(() => {
+  return Object.entries(otherData.value || {})
+      .filter(([key]) => key !== "rows")
+      .map(([key, value]) => ({key, value}));
+});
 const init = () => {
   if (props.row.otherData !== null && props.row.otherData !== '') {
-    otherData.value = JSON.parse(props.row.otherData);
+    try {
+      otherData.value = JSON.parse(props.row.otherData);
+    } catch {
+      otherData.value = {};
+    }
   }
 };
 
@@ -52,7 +61,15 @@
       <el-descriptions-item label="鍗曚綅">{{ row.scrapQty || '-' }}</el-descriptions-item>
       <el-descriptions-item label="鍒涘缓鏃堕棿">{{ row.createTime || '-' }}</el-descriptions-item>
       <el-descriptions-item
-          v-for="item in otherData"
+          v-for="item in otherDataEntries"
+          :key="item.key"
+          :label="item.key"
+      >
+        {{ item.value || '-' }}
+      </el-descriptions-item>
+      <el-descriptions-item
+          v-for="item in (otherData.rows || [])"
+          :key="item.parameterItem"
           :label="`${item.parameterItem}`"
       >
         {{ item.value || '-' }}
diff --git a/src/views/productionManagement/workOrder/components/GranulationForm.vue b/src/views/productionManagement/workOrder/components/GranulationForm.vue
new file mode 100644
index 0000000..ce7a8b8
--- /dev/null
+++ b/src/views/productionManagement/workOrder/components/GranulationForm.vue
@@ -0,0 +1,757 @@
+<script setup lang="ts">
+import {computed, onMounted, reactive, ref} from "vue";
+import {userListNoPageByTenantId} from "@/api/system/user.js";
+import {ElMessage} from "element-plus";
+import {addProductMain} from "@/api/productionManagement/workOrder.js";
+
+defineOptions({
+  name: "GranulationForm"
+});
+
+const props = defineProps({
+  isShow: {
+    type: Boolean,
+    required: true
+  },
+  isEdit: {
+    type: Boolean,
+    default: false
+  },
+  row: {
+    type: Object,
+    default: () => ({}),
+  }
+});
+
+const emits = defineEmits(["update:isShow", "refreshData"]);
+
+const visible = computed({
+  get: () => props.isShow,
+  set: (value: boolean) => emits("update:isShow", value),
+});
+
+const formData = reactive({
+  productProcessRouteItemId: undefined,
+  workOrderId: undefined,
+  planQuantity: undefined,
+  reportWork: undefined,
+  productMainId: undefined,
+  quantity: undefined, // 浜у嚭鏁伴噺
+  userId: undefined, // 浣滀笟鍛�
+  userName: undefined, // 浣滀笟鍛�
+  otherData: {
+    whiteMaterialNumber: undefined, // 鐧芥枡鏂欏彿
+    ingredientDateTime: undefined, // 閰嶆枡鏃ユ湡鏃堕棿
+    weight: undefined, // 閲嶉噺
+    stirredMillIncludesMixing: {
+      oneBucketStartTime: undefined, // 1妗跺紑濮嬫椂闂�
+      oneBucketEndTime: undefined, // 1妗剁粨鏉熸椂闂�
+      twoBucketStartTime: undefined, // 2妗跺紑濮嬫椂闂�
+      twoBucketEndTime: undefined, // 2妗剁粨鏉熸椂闂�
+      fiveBucketStartTime: undefined, // 5妗跺紑濮嬫椂闂�
+      fiveBucketEndTime: undefined, // 5妗剁粨鏉熸椂闂�
+      powderWeight: undefined, // 绮夋枡閲嶉噺
+      waterWeight: undefined, // 姘撮噸閲�
+      stirStartTime: undefined, //  鎼呮媽寮�濮嬫椂闂�
+      stirEndTime: undefined, //  鎼呮媽缁撴潫鏃堕棿
+      stirDispersantWeight: undefined, //  鎼呮媽鍒嗘暎鍓傞噸閲�
+      userId: undefined,
+      userName: undefined,
+      confirmId: undefined,
+      confirmName: undefined,
+    },
+    granulation: {
+      output: undefined, // 浜у嚭鎬讳骇閲�
+      qualifiedMaterialWeight: undefined, // 鍚堟牸鏂欓噸閲�
+      wallMaterial: undefined, // 澹佹枡
+      wasteMaterials: undefined, // 灏炬枡
+    },
+    burningMaterial: {
+      startTime: undefined, // 寮�濮嬫椂闂�
+      endTime: undefined, // 缁撴潫鏃堕棿
+      furnaceNumber: undefined, // 鐐夊彿
+      highestTemperatureZone: undefined, // 鏈�楂樻俯鍖�
+      calcinationRate: undefined, // 鐓呯儳閫熷害
+      calcinationWeight: undefined, // 鐓呯儳閲嶉噺
+      userId: undefined,
+      userName: undefined,
+      confirmId: undefined,
+      confirmName: undefined,
+    },
+    powder: {
+      excess: undefined, // 绮夌鏂欐斁鏂欐病瓒呰繃鏂欐枟闄愪綅绾�
+    },
+    burntBlockBatchNumber: undefined, // 鐑у潡鏂欐壒娆″彿
+    burntBlockBatchNumberDate: undefined, // 鐑у潡鏂欐棩鏈�
+    stirredMill: {
+      threeBucketStartTime: undefined, // 3妗跺紑濮嬫椂闂�
+      threeBucketEndTime: undefined, // 3妗剁粨鏉熸椂闂�
+      threeBucketMixingPowderWeight: undefined, // 3妗跺姞绮夋枡閲嶉噺
+      fourBucketStartTime: undefined, // 4妗跺紑濮嬫椂闂�
+      fourBucketEndTime: undefined, // 4妗剁粨鏉熸椂闂�
+      fourBucketMixingPowderWeight: undefined, // 4妗跺姞绮夋枡閲嶉噺
+      sixBucketStartTime: undefined, // 6妗跺紑濮嬫椂闂�
+      sixBucketEndTime: undefined, // 6妗剁粨鏉熸椂闂�
+      sixBucketMixingPowderWeight: undefined, // 6妗跺姞绮夋枡閲嶉噺
+      userId: undefined,
+      userName: undefined,
+      confirmId: undefined,
+      confirmName: undefined,
+    },
+    stir: {
+      startTime: undefined,
+      endTime: undefined,
+      weightRatio: undefined, // 閲嶉噺姣旓紙姘�/鏂欙級
+      pva: undefined, // PVAn绮樺悎鍓傞噸閲�
+      dispersantWeight: undefined, // 鍒嗘暎鍓傞噸閲�
+      releaseAgentWeight: undefined, // 鑴辨ā鍓傞噸閲�
+    },
+    granulationB: {
+      startTime: undefined,
+      endTime: undefined,
+      atomizerRotationalSpeed: undefined, // 闆惧寲鍣ㄨ浆閫�
+      importSpeed: undefined, // 杩涘彛閫熷害
+      outSpeed: undefined, // 鍑哄彛閫熷害
+      qualifiedWeight: undefined, // 鍚堟牸閲嶉噺
+      wallMaterial: undefined, // 澹佹枡
+      wasteMaterials: undefined, // 灏炬枡
+      userId: undefined,
+      userName: undefined,
+      confirmId: undefined,
+      confirmName: undefined,
+    },
+    remark: undefined, // 澶囨敞
+  }
+})
+
+const userOptions = ref([]);
+const getUserList = () => {
+  userListNoPageByTenantId()
+      .then(res => {
+        if (res.code === 200) {
+          userOptions.value = res.data || [];
+        }
+      })
+      .catch(err => {
+        console.error("鑾峰彇鐢ㄦ埛鍒楄〃澶辫触", err);
+      });
+};
+// 鐢ㄦ埛閫夋嫨鍙樺寲鏃舵洿鏂� userName
+const handleUserChange = (userId: any, reportType: string) => {
+  if (userId) {
+    const selectedUser = userOptions.value.find(user => user.userId === userId);
+
+    switch (reportType) {
+      case 'stirredMillIncludesMixingUserId':
+        formData.otherData.stirredMillIncludesMixing.userName = selectedUser.userName;
+        break;
+      case 'stirredMillIncludesMixingConfirmId':
+        formData.otherData.stirredMillIncludesMixing.confirmName = selectedUser.userName;
+        break;
+      case 'burningMaterialUserId':
+        formData.otherData.burningMaterial.userName = selectedUser.userName;
+        break;
+      case 'burningMaterialConfirmId':
+        formData.otherData.stirredMillIncludesMixing.confirmName = selectedUser.userName;
+        break;
+      case 'stirredMillUserId':
+        formData.otherData.stirredMill.userName = selectedUser.userName;
+        break;
+      case 'stirredMillConfirmId':
+        formData.otherData.stirredMill.confirmName = selectedUser.userName;
+        break;
+    }
+  } else {
+    switch (reportType) {
+      case 'stirredMillIncludesMixingUserId':
+        formData.otherData.stirredMillIncludesMixing.userName = "";
+        break;
+      case 'stirredMillIncludesMixingConfirmId':
+        formData.otherData.stirredMillIncludesMixing.confirmName = "";
+        break;
+      case 'burningMaterialUserId':
+        formData.otherData.burningMaterial.userName = "";
+        break;
+      case 'burningMaterialConfirmId':
+        formData.otherData.stirredMillIncludesMixing.confirmName = "";
+        break;
+      case 'stirredMillUserId':
+        formData.otherData.stirredMill.userName = "";
+        break;
+      case 'stirredMillConfirmId':
+        formData.otherData.stirredMill.confirmName = "";
+        break;
+    }
+  }
+};
+// todo 淇敼浣滀笟鍛橈紝鍦ㄦ墍鏈変綔涓氬憳涓幏鍙栧~鍏ョ殑鍊硷紝濡傛灉娌℃湁鍒欐彁绀轰笉鎻愪氦
+const handleReport = () => {
+  if (!formData.otherData.userId && !formData.otherData.surfaceCopperPasteUserId && !formData.otherData.underlyingCopperPasteUserId) {
+    ElMessage.error('璇烽�夋嫨浣滀笟鍛�')
+    return;
+  }
+  if (!formData.quantity || formData.quantity <= 0) {
+    ElMessage.error('璇疯緭鍏ョ敓浜ф暟閲�')
+    return;
+  }
+  formData.userId = formData.otherData.surfaceCopperPasteUserId || formData.otherData.underlyingCopperPasteUserId;
+
+  const otherData = JSON.stringify(formData.otherData);
+  const submitData = {
+    ...formData,
+    otherData: otherData
+  };
+
+  addProductMain(submitData).then(res => {
+    if (res.code === 200) {
+      ElMessage({
+        message: '鎶ュ伐鎴愬姛',
+        type: 'success',
+      })
+      emits("refreshData")
+      visible.value = false;
+    } else {
+      ElMessage.error('鎶ュ伐澶辫触')
+    }
+  });
+};
+
+const initData = () => {
+  if (!props.isEdit) {
+    formData.otherData = JSON.parse(props.row.otherData || '{}');
+    formData.quantity = props.row.quantity;
+  } else {
+    const row = props.row;
+    formData.planQuantity = row.planQuantity
+    formData.productProcessRouteItemId = row.productProcessRouteItemId
+    formData.workOrderId = row.id
+    formData.reportWork = row.reportWork
+    formData.productMainId = row.productMainId
+  }
+}
+
+const displayValue = (value: any) => {
+  return value === undefined || value === null || value === "" ? "-" : value;
+};
+
+onMounted(() => {
+  getUserList();
+  initData()
+})
+</script>
+
+<template>
+  <el-dialog v-model="visible"
+             :title="isEdit? '閫犵矑鎶ュ伐' : '璇︽儏'"
+             width="90%">
+    <el-form :model="formData">
+      <table class="report-table">
+        <tbody>
+        <tr>
+          <td class="label" colspan="2">鐧芥枡鏂欏彿锛�</td>
+          <td colspan="3">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.whiteMaterialNumber" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.whiteMaterialNumber) }}</span>
+          </td>
+          <td class="label" colspan="2">閰嶆枡鏃ユ湡锛�</td>
+          <td colspan="5">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.ingredientDateTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.ingredientDateTime) }}</span>
+          </td>
+          <td class="label" colspan="2">閲嶉噺锛�</td>
+          <td colspan="2">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.weight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.weight) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2" rowspan="5">鎼呮媽纾紙鍚悈鎷岋級锛�</td>
+          <td class="label" colspan="7">鎼呮媽纾�</td>
+          <td class="label" colspan="5" rowspan="2">鎼呮媽妗舵悈鎷�</td>
+          <td class="label"  colspan="2" rowspan="3">
+            <span>浣滀笟鍛�:</span>
+            <el-select v-model="formData.otherData.stirredMillIncludesMixing.userId"
+                       v-if="props.isEdit"
+                       style="width: 100%"
+                       placeholder="璇烽�夋嫨浣滀笟鍛�"
+                       clearable
+                       filterable
+                       @change="handleUserChange($event, 'stirredMillIncludesMixingUserId')">
+              <el-option v-for="user in userOptions"
+                         :key="user.userId"
+                         :label="user.userName"
+                         :value="user.userId"/>
+            </el-select>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.userName || formData.otherData.stirredMillIncludesMixing.userId) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2"></td>
+          <td class="label" colspan="1">1鍙锋《锛�</td>
+          <td class="label" colspan="2">2鍙锋《锛�</td>
+          <td class="label" colspan="2">5鍙锋《锛�</td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2">寮�濮嬫椂闂达細</td>
+          <td colspan="1">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.oneBucketStartTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.oneBucketStartTime) }}</span>
+          </td>
+          <td colspan="2">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.twoBucketStartTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.twoBucketStartTime) }}</span>
+          </td>
+          <td colspan="2">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.fiveBucketStartTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.fiveBucketStartTime) }}</span>
+          </td>
+            <td class="label" colspan="5">
+              <span>寮�濮嬫椂闂达細</span>
+              <el-date-picker
+                  v-if="props.isEdit"
+                  v-model="formData.otherData.stirredMillIncludesMixing.stirStartTime"
+                  type="datetime"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  format="YYYY-MM-DD HH:mm:ss"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+              />
+              <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.stirStartTime) }}</span>
+            </td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2">缁撴潫鏃堕棿锛�</td>
+          <td colspan="1">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.oneBucketEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.oneBucketEndTime) }}</span>
+          </td>
+          <td colspan="2">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.twoBucketEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.twoBucketEndTime) }}</span>
+          </td>
+          <td colspan="2">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.fiveBucketEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.fiveBucketEndTime) }}</span>
+          </td>
+          <td colspan="5">
+            <span>缁撴潫鏃堕棿锛�</span>
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMillIncludesMixing.stirEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.stirEndTime) }}</span>
+          </td>
+          <td class="label"  colspan="2" rowspan="3">
+            <span>纭浜�:</span>
+            <el-select v-model="formData.otherData.stirredMillIncludesMixing.confirmId"
+                       v-if="props.isEdit"
+                       style="width: 100%"
+                       placeholder="璇烽�夋嫨纭浜�"
+                       clearable
+                       filterable
+                       @change="handleUserChange($event, 'stirredMillIncludesMixingConfirmId')">
+              <el-option v-for="user in userOptions"
+                         :key="user.userId"
+                         :label="user.userName"
+                         :value="user.userId"/>
+            </el-select>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.confirmName || formData.otherData.stirredMillIncludesMixing.confirmId) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2">绮夋枡閲嶉噺锛�</td>
+          <td colspan="1">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.stirredMillIncludesMixing.powderWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.powderWeight) }}</span>
+            <span>KG</span>
+          </td>
+          <td class="label" colspan="2">姘撮噸閲忥細</td>
+          <td colspan="2">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.stirredMillIncludesMixing.waterWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.waterWeight) }}</span>
+            <span>KG</span>
+          </td>
+          <td class="label" colspan="2">鍒嗘暎鍓傞噸閲忥細</td>
+          <td colspan="3">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.stirredMillIncludesMixing.stirDispersantWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMillIncludesMixing.stirDispersantWeight) }}</span>
+            <span>g</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2">閫犵矑锛�</td>
+          <td class="label" colspan="2">浜у嚭鎬婚噸閲忥細</td>
+          <td colspan="1">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.granulation.output" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.granulation.output) }}</span>
+            <span>KG</span>
+          </td>
+          <td class="label" colspan="2">鍚堟牸鏂欓噸閲忥細</td>
+          <td colspan="2">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.granulation.qualifiedMaterialWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.granulation.qualifiedMaterialWeight) }}</span>
+            <span>KG</span>
+          </td>
+          <td class="label" colspan="2">
+            澹佹枡锛�
+            <el-input v-if="props.isEdit" v-model="formData.otherData.granulation.wallMaterial" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.granulation.wallMaterial) }}</span>
+          </td>
+          <td colspan="3">
+            灏炬枡锛�
+            <el-input v-if="props.isEdit" v-model="formData.otherData.granulation.wasteMaterials" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.granulation.wasteMaterials) }}</span>
+            <span>KG</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label" colspan="2" rowspan="3">鐑ф枡锛�</td>
+          <td class="label"  colspan="7">
+            <span>寮�濮嬫椂闂达細</span>
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.burningMaterial.startTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.startTime) }}</span>
+          </td>
+          <td class="label"  colspan="5">
+            <span>缁撴潫鏃堕棿锛�</span>
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.burningMaterial.endTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.endTime) }}</span>
+          </td>
+          <td class="label"  colspan="2" rowspan="2">
+            <span>浣滀笟鍛�:</span>
+            <el-select v-model="formData.otherData.burningMaterial.userId"
+                       v-if="props.isEdit"
+                       style="width: 100%"
+                       placeholder="璇烽�夋嫨浣滀笟鍛�"
+                       clearable
+                       filterable
+                       @change="handleUserChange($event, 'burningMaterialUserId')">
+              <el-option v-for="user in userOptions"
+                         :key="user.userId"
+                         :label="user.userName"
+                         :value="user.userId"/>
+            </el-select>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.userName || formData.otherData.burningMaterial.userId) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="7">
+            <span>鐐夊彿锛�</span>
+            <el-input v-if="props.isEdit" v-model="formData.otherData.burningMaterial.furnaceNumber" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.furnaceNumber) }}</span>
+          </td>
+          <td class="label"  colspan="5">
+            <span>鏈�楂樻俯搴﹀尯锛�</span>
+            <el-input v-if="props.isEdit" v-model="formData.otherData.burningMaterial.highestTemperatureZone" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.highestTemperatureZone) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="7">
+            <span>鐓呯儳閫熷害锛�</span>
+            <el-input v-if="props.isEdit" v-model="formData.otherData.burningMaterial.calcinationRate" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.calcinationRate) }}</span>
+            <span>min/鏉�</span>
+          </td>
+          <td class="label"  colspan="5">
+            <span>鐓呯儳鍚庨噸閲忥細</span>
+            <el-input v-if="props.isEdit" v-model="formData.otherData.burningMaterial.calcinationWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.calcinationWeight) }}</span>
+            <span>KG</span>
+          </td>
+          <td class="label"  colspan="2" rowspan="3">
+            <span>纭浜�:</span>
+            <el-select v-model="formData.otherData.burningMaterial.confirmId"
+                       v-if="props.isEdit"
+                       style="width: 100%"
+                       placeholder="璇烽�夋嫨纭浜�"
+                       clearable
+                       filterable
+                       @change="handleUserChange($event, 'burningMaterialConfirmId')">
+              <el-option v-for="user in userOptions"
+                         :key="user.userId"
+                         :label="user.userName"
+                         :value="user.userId"/>
+            </el-select>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burningMaterial.confirmName || formData.otherData.burningMaterial.confirmId) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="2">绮夋枡</td>
+          <td class="label"  colspan="12">
+            <span>绮夌鏂欐斁鏂欐病瓒呰繃鏂欐枟闄愪綅绾匡細</span>
+            <el-checkbox-group v-if="props.isEdit" v-model="formData.otherData.powder.excess">
+              <el-checkbox label="鏄�" value="鏄�" />
+              <el-checkbox label="鍚�" value="鍚�" />
+            </el-checkbox-group>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.powder.excess) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="9">
+            <span>鐑у潡鏂欐壒鍙�:</span>
+            <el-input v-if="props.isEdit" v-model="formData.otherData.burntBlockBatchNumber" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burntBlockBatchNumber) }}</span>
+          </td>
+          <td class="label"  colspan="2">鏃ユ湡锛�</td>
+          <td class="label"  colspan="3">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.burntBlockBatchNumberDate" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.burntBlockBatchNumberDate) }}</span>
+          </td>
+          <td class="label"  colspan="2" rowspan="4">
+            <span>浣滀笟鍛�:</span>
+            <el-select v-model="formData.otherData.stirredMill.userId"
+                       v-if="props.isEdit"
+                       style="width: 100%"
+                       placeholder="璇烽�夋嫨浣滀笟鍛�"
+                       clearable
+                       filterable
+                       @change="handleUserChange($event, 'stirredMillUserId')">
+              <el-option v-for="user in userOptions"
+                         :key="user.userId"
+                         :label="user.userName"
+                         :value="user.userId"/>
+            </el-select>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.userName || formData.otherData.stirredMill.userId) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="2" rowspan="4">鎼呮媽纾�</td>
+          <td class="label"  colspan="2"></td>
+          <td class="label"  colspan="3">3鍙锋《</td>
+          <td class="label"  colspan="4">4鍙锋《</td>
+          <td class="label"  colspan="3">6鍙锋《</td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="2">鎼呮媽绮夋枡閲嶉噺锛�</td>
+          <td class="label"  colspan="3">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.stirredMill.threeBucketMixingPowderWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.threeBucketMixingPowderWeight) }}</span>
+          </td>
+          <td class="label"  colspan="4">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.stirredMill.fourBucketMixingPowderWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.fourBucketMixingPowderWeight) }}</span>
+          </td>
+          <td class="label"  colspan="3">
+            <el-input v-if="props.isEdit" v-model="formData.otherData.stirredMill.sixBucketMixingPowderWeight" placeholder="璇疯緭鍏�"/>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.sixBucketMixingPowderWeight) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="2">寮�濮嬫椂闂达細</td>
+          <td class="label"  colspan="3">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMill.threeBucketStartTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.threeBucketStartTime) }}</span>
+          </td>
+          <td class="label"  colspan="4">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMill.fourBucketStartTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.fourBucketStartTime) }}</span>
+          </td>
+          <td class="label"  colspan="3">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMill.sixBucketStartTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.sixBucketStartTime) }}</span>
+          </td>
+        </tr>
+        <tr>
+          <td class="label"  colspan="2">缁撴潫鏃堕棿锛�</td>
+          <td class="label"  colspan="3">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMill.threeBucketEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.threeBucketEndTime) }}</span>
+          </td>
+          <td class="label"  colspan="4">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMill.fourBucketEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.fourBucketEndTime) }}</span>
+          </td>
+          <td class="label"  colspan="3">
+            <el-date-picker
+                v-if="props.isEdit"
+                v-model="formData.otherData.stirredMill.sixBucketEndTime"
+                type="datetime"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                format="YYYY-MM-DD HH:mm:ss"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+            />
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.sixBucketEndTime) }}</span>
+          </td>
+          <td class="label"  colspan="2" rowspan="3">
+            <span>纭浜�:</span>
+            <el-select v-model="formData.otherData.stirredMill.confirmId"
+                       v-if="props.isEdit"
+                       style="width: 100%"
+                       placeholder="璇烽�夋嫨纭浜�"
+                       clearable
+                       filterable
+                       @change="handleUserChange($event, 'stirredMillConfirmId')">
+              <el-option v-for="user in userOptions"
+                         :key="user.userId"
+                         :label="user.userName"
+                         :value="user.userId"/>
+            </el-select>
+            <span v-else class="view-value">{{ displayValue(formData.otherData.stirredMill.confirmName || formData.otherData.stirredMill.confirmId) }}</span>
+          </td>
+        </tr>
+        <!-- todo鎼呮媽琛屽紑濮嬶紝纭浜鸿鐣欑┖锛屽凡鍦ㄤ笂闈㈣〃鏍奸鐣� -->
+        </tbody>
+      </table>
+    </el-form>
+    <template #footer>
+        <span class="dialog-footer">
+          <el-button v-if="props.isEdit" type="primary"
+                     @click="handleReport">纭畾</el-button>
+          <el-button @click="visible = false">{{ props.isEdit ? "鍙栨秷" : "鍏抽棴" }}</el-button>
+        </span>
+    </template>
+  </el-dialog>
+</template>
+
+<style scoped>
+.report-table {
+  width: 100%;
+  border-collapse: collapse;
+  table-layout: fixed;
+  font-size: 13px;
+}
+
+.report-table td {
+  border: 1px solid #dcdfe6;
+  padding: 6px;
+  vertical-align: middle;
+}
+
+.report-table .label {
+  width: 90px;
+  background: #f5f7fa;
+  text-align: center;
+  font-weight: 500;
+}
+
+.report-table .tip {
+  text-align: center;
+  font-weight: 500;
+  line-height: 1.4;
+  background: #fafafa;
+}
+
+.view-value {
+  display: inline-block;
+  min-height: 32px;
+  line-height: 32px;
+}
+</style>
diff --git a/src/views/productionManagement/workOrder/components/ProductionRecordForm.vue b/src/views/productionManagement/workOrder/components/ProductionRecordForm.vue
index 9b2938e..fb309a1 100644
--- a/src/views/productionManagement/workOrder/components/ProductionRecordForm.vue
+++ b/src/views/productionManagement/workOrder/components/ProductionRecordForm.vue
@@ -12,6 +12,10 @@
     default() {
       return [];
     }
+  },
+  labelWidth: {
+    type: Number,
+    default: 120
   }
 });
 
@@ -79,7 +83,7 @@
 </script>
 
 <template>
-  <el-form ref="formRef" :model="formData" :rules="rules" label-width="120px">
+  <el-form ref="formRef" :model="formData" :rules="rules" :label-width="`${labelWidth}px`">
     <el-form-item
         v-for="(item, index) in formData.list"
         :key="item.id"
diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index 9a5aadd..901a7dc 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -406,7 +406,9 @@
   productProcessRouteItemId: "",
   userId: "",
   productMainId: null,
-  otherData: {}
+  otherData: {
+    rows: [],
+  }
 });
 const productionRecordFormRef = ref();
 
@@ -695,7 +697,7 @@
 
 const handleReport = async () => {
   const data = await productionRecordFormRef.value.submitData()
-  reportForm.otherData = JSON.stringify(data || {});
+  reportForm.otherData.rows = JSON.stringify(data || {});
   reportFormRef.value?.validate((valid) => {
     if (!valid) {
       return false;

--
Gitblit v1.9.3