zhangwencui
7 小时以前 8d48fa86c9096f6bac90e83ed779e5a5b62b0fc7
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"
@@ -305,10 +305,10 @@
                                    :label="`${item.productName} ${item.model}`"
                                    class="form-item">
                        <div class="consumable-input-group">
                          <el-input-number v-model="getProcessInfo(parseInt(activeProcessId)).consumables[item.id]"
                          <el-input-number v-model="getProcessInfo(parseInt(activeProcessId)).consumables[item.bomId]"
                                           :min="0"
                                           :model-value="getConsumableValue(parseInt(activeProcessId), item.id)"
                                           @change="val => getProcessInfo(parseInt(activeProcessId)).consumables[item.id] = val"
                                           :model-value="getConsumableValue(parseInt(activeProcessId), item.bomId)"
                                           @change="val => getProcessInfo(parseInt(activeProcessId)).consumables[item.bomId] = val"
                                           class="consumable-input" />
                          <span class="consumable-unit">{{ item.unit }}</span>
                        </div>
@@ -353,17 +353,19 @@
                    </div>
                    <div class="card-body">
                      <div class="param-grid">
                        <el-form-item v-for="param in params"
                        <el-form-item v-for="param in params[activeProcessId] || []"
                                      :key="param.id"
                                      :label="param.paramName"
                                      :label-width="120"
                                      :prop="`paramGroups.${activeProcessId}.${index}.${param.id}`"
                                      class="param-item">
                          <template v-if="param.paramType == '1'">
                            <!-- 数字类型 -->
                            <div class="param-input-group">
                              <!-- :precision="getPrecision(param.paramFormat)" -->
                              <el-input-number v-model="form.paramGroups[activeProcessId][index][param.id]"
                                               controls-position="right"
                                               :precision="getPrecision(param.paramFormat)"
                                               :key="param.id"
                                               class="param-input" />
                              <span v-if="param.unit && param.unit != '/'"
                                    class="param-unit">
@@ -375,6 +377,7 @@
                            <!-- 文本类型 -->
                            <div class="param-input-group">
                              <el-input v-model="form.paramGroups[activeProcessId][index][param.id]"
                                        :key="param.id"
                                        class="param-input" />
                              <span v-if="param.unit && param.unit != '/'"
                                    class="param-unit">
@@ -387,6 +390,7 @@
                            <div class="param-input-group">
                              <el-select v-model="form.paramGroups[activeProcessId][index][param.id]"
                                         placeholder="请选择"
                                         :key="param.id"
                                         class="param-select"
                                         style="width: 100%">
                                <el-option v-for="option in dictOptions[param.paramFormat] || []"
@@ -405,6 +409,7 @@
                            <div class="param-input-group">
                              <el-date-picker :value-format="param.paramFormat"
                                              :format="param.paramFormat"
                                              :key="param.id"
                                              :type="param.paramFormat=='YYYY-MM-DD'?'date':'datetime'"
                                              v-model="form.paramGroups[activeProcessId][index][param.id]"
                                              class="param-input" />
@@ -418,6 +423,7 @@
                            <!-- 其他类型 -->
                            <div class="param-input-group">
                              <el-input v-model="form.paramGroups[activeProcessId][index][param.id]"
                                        :key="param.id"
                                        class="param-input" />
                              <span v-if="param.unit && param.unit != '/'"
                                    class="param-unit">
@@ -452,27 +458,32 @@
                      </template>
                    </el-table-column>
                    <!-- 参数列 -->
                    <el-table-column v-for="param in params"
                    <el-table-column v-for="param in params[activeProcessId] || []"
                                     :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'">
                          <!-- 数字类型 -->
                          <!-- :precision="getPrecision(param.paramFormat)" -->
                          <el-input-number v-model="row[param.id]"
                                           controls-position="right"
                                           :precision="getPrecision(param.paramFormat)"
                                           :key="param.id"
                                           class="table-input" />
                        </template>
                        <template v-else-if="param.paramType == '2'">
                          <!-- 文本类型 -->
                          <el-input v-model="row[param.id]"
                                    :key="param.id"
                                    class="table-input" />
                        </template>
                        <template v-else-if="param.paramType == '3'">
                          <!-- 字典类型 -->
                          <el-select v-model="row[param.id]"
                                     placeholder="请选择"
                                     :key="param.id"
                                     class="table-select">
                            <el-option v-for="option in dictOptions[param.paramFormat] || []"
                                       :key="option.dictValue"
@@ -484,6 +495,7 @@
                          <!-- 日期类型 -->
                          <el-date-picker :value-format="param.paramFormat"
                                          :format="param.paramFormat"
                                          :key="param.id"
                                          width="100%"
                                          :type="param.paramFormat=='YYYY-MM-DD'?'date':'datetime'"
                                          v-model="row[param.id]"
@@ -560,6 +572,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 +585,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 +616,16 @@
  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,
    productionRecordEditSubmit,
  } 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();
@@ -622,7 +633,9 @@
  const route = useRoute();
  const data = route.query.data ? JSON.parse(route.query.data) : {};
  const dialogTitle = computed(() => (data.id ? "编辑报工" : "新增报工"));
  const dialogTitle = computed(() =>
    form.type === "edit" ? "编辑报工" : "新增报工"
  );
  const formRef = ref(null);
  const isSubmitting = ref(false);
@@ -655,20 +668,23 @@
  const useTableView = ref(false); // 控制是否使用表格视图
  const form = reactive({
    type: data.type || "add",
    id: data.id || undefined,
    orderId: data.orderId || "",
    orderId: data.productOrderId || "",
    npsNo: data.npsNo || "",
    teamName: data.teamName || "",
    teamName: data.schedule || data.teamName || "白班",
    materialCode: data.materialCode || "",
    productName: data.productName || "",
    specification: data.specification || "",
    outputVolume: data.outputVolume || 0,
    unqualifiedVolume: data.unqualifiedVolume || 0,
    completedVolume: data.completedVolume || 0,
    createBy: data.createBy || "当前登录人",
    specification: data.productModelName || "",
    outputVolume: data.totalQuantity || data.outputVolume || 0,
    unqualifiedVolume: data.scrapQty || data.unqualifiedQuantity || 0,
    completedVolume: data.quantity || data.completedVolume || 0,
    createBy: data.createBy || data.postName || "当前登录人",
    createTime: data.createTime || new Date(),
    paramGroups: data.paramGroups || {}, // 存储每个工序的参数组
    processInfo: data.processInfo || {}, // 存储每个工序的基本信息
    productionProductRouteItemDtoList:
      data.productionProductRouteItemDtoList || [], // 工序信息
  });
  const rules = {
@@ -695,6 +711,9 @@
      .finally(() => {
        orderLoading.value = false;
      });
  };
  const handleVolumeChange = () => {
    form.completedVolume = form.outputVolume - form.unqualifiedVolume;
  };
  // 处理生产订单选择
@@ -739,6 +758,7 @@
          processList.value.forEach(process => {
            form.processStructures[process.processId] =
              process.orderStructureVos || [];
            loadParams(process.processId, orderId);
          });
          // 如果有工序,默认选择第一个
          if (processList.value.length > 0) {
@@ -747,7 +767,7 @@
            processId.value = firstProcess.processId;
            form.processId = firstProcess.processId;
            // 加载第一个工序的参数
            loadParams(firstProcess.processId, orderId);
            // loadParams(firstProcess.processId, orderId);
          }
        }
      })
@@ -772,12 +792,13 @@
    }
    if (!form.processInfo[processId]) {
      form.processInfo[processId] = {
        postPersonnel: "",
        equipmentAbnormality: "",
        equipmentHandling: "",
        processInstructions: "",
        postName: "",
        equipmentMalfunction: "",
        equipmentDisposal: "",
        processExplained: "",
        files: [],
        consumables: {},
        delFileIds: [], // 存储要删除的文件id
      };
    }
    return form.processInfo[processId];
@@ -791,12 +812,12 @@
  };
  // 获取消耗品数量,默认为0
  const getConsumableValue = (processId, itemId) => {
  const getConsumableValue = (processId, bomId) => {
    const processInfo = getProcessInfo(processId);
    if (!processInfo.consumables[itemId]) {
      processInfo.consumables[itemId] = 0;
    if (!processInfo.consumables[bomId]) {
      processInfo.consumables[bomId] = 0;
    }
    return processInfo.consumables[itemId];
    return processInfo.consumables[bomId];
  };
  // 处理文件预览
@@ -843,12 +864,33 @@
    const processId = parseInt(activeProcessId.value);
    if (processId) {
      const processInfo = getProcessInfo(processId);
      // 记录被删除的文件id(只有编辑模式下的现有文件才需要记录)
      if (file.uid && !file.tempId) {
        processInfo.delFileIds.push(file.uid);
      }
      processInfo.files = fileList;
    }
  };
  // 处理文件变更
  const handleFileChange = (file, fileList) => {
  const handleFileChange = async (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()}`,
      },
    });
    if (uploadRes.code === 200) {
      const tempId = uploadRes.data.tempId;
      // 将tempId存储到file对象中
      file.tempId = tempId;
    }
    const processId = parseInt(activeProcessId.value);
    if (processId) {
      const processInfo = getProcessInfo(processId);
@@ -881,16 +923,79 @@
      p => p.processId === parseInt(processId)
    );
    if (process) {
      params.value = process.orderRouteItemParaVos || [];
      params.value[processId] = process.orderRouteItemParaVos || [];
      // 初始化参数组
      if (!form.paramGroups[processId]) {
        form.paramGroups[processId] = [];
      }
      // 检查是否有编辑数据
      if (
        form.productionProductRouteItemDtoList &&
        form.productionProductRouteItemDtoList.length > 0
      ) {
        const editProcess = form.productionProductRouteItemDtoList.find(
          p => p.processId === parseInt(processId)
        );
        if (editProcess && editProcess.productionProductRouteItemParamDtoList) {
          // 按sourceSort分组参数
          const paramGroups = {};
          editProcess.productionProductRouteItemParamDtoList.forEach(param => {
            if (!param.bomId) {
              // 只处理非BOM参数
              const sort = param.sourceSort || 1;
              if (!paramGroups[sort]) {
                paramGroups[sort] = {};
              }
              paramGroups[sort][param.orderItemParamId] = param.paramValue || "";
              // 如果是字典类型参数,获取字典数据
              if (param.paramType == "3" && param.paramFormat) {
                getDictOptions(param.paramFormat);
              }
            }
          });
          // 转换为数组
          form.paramGroups[processId] = Object.values(paramGroups);
          // 初始化工序基本信息
          if (editProcess) {
            const processInfo = getProcessInfo(parseInt(processId));
            processInfo.postName = editProcess.postName || "";
            processInfo.equipmentMalfunction =
              editProcess.equipmentMalfunction || "";
            processInfo.equipmentDisposal = editProcess.equipmentDisposal || "";
            processInfo.id = editProcess.id || "";
            processInfo.processExplained = editProcess.processExplained || "";
            // 处理文件
            if (editProcess.fileList) {
              processInfo.files = editProcess.fileList.map(file => ({
                name: file.fileName,
                url: file.fileUrl,
                uid: file.id,
              }));
            }
            // 处理BOM信息
            if (editProcess.productionProductRouteItemParamDtoList) {
              editProcess.productionProductRouteItemParamDtoList.forEach(
                param => {
                  if (param.bomId) {
                    // 使用bomId作为key,因为getProcessStructures返回的item.id是bomId
                    processInfo.consumables[param.bomId] =
                      param.productValue || 0;
                  }
                }
              );
            }
          }
        }
      }
      // 如果没有参数组,添加一个默认参数组
      if (form.paramGroups[processId].length === 0) {
        const defaultGroup = {};
        for (const param of params.value) {
        for (const param of params.value[processId]) {
          defaultGroup[param.id] = param.standardValue || "";
          // 如果是字典类型参数,获取字典数据
          if (param.paramType == "3" && param.paramFormat) {
@@ -926,7 +1031,6 @@
        }
      });
    } else if (activeStep.value === 2) {
      // 第三步:直接进入第四步
      activeStep.value = 3;
    }
  };
@@ -936,12 +1040,129 @@
    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);
        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) {
                  console.log(param, "param");
                  productionProductRouteItemParamDtoList.push({
                    id: parseInt(paramId),
                    // standardValue: param.standardValue,
                    // minValue: param.minValue,
                    // maxValue: param.maxValue,
                    productId: param.productId,
                    paramValue: value,
                    // productValue: value,
                    sourceSort: index + 1,
                    unit: param.unit,
                    // isRequired: param.isRequired,
                  });
                }
              });
            });
            // 添加BOM信息
            const structures = getProcessStructures(process.processId);
            structures.forEach(structure => {
              const consumableValue = getConsumableValue(
                process.processId,
                structure.bomId
              );
              if (consumableValue > 0) {
                productionProductRouteItemParamDtoList.push({
                  productId: structure.productModelId,
                  bomId: structure.bomId,
                  id: null,
                  productValue: consumableValue,
                  unit: structure.unit,
                });
              }
            });
            const fileIds = [];
            processInfo.files.forEach(file => {
              if (file.tempId) {
                fileIds.push(file.tempId);
              }
            });
            console.log(processInfo, "processInfo");
            return {
              postName: processInfo.postName,
              id: processInfo.id,
              equipmentMalfunction: processInfo.equipmentMalfunction,
              equipmentDisposal: processInfo.equipmentDisposal,
              processExplained: processInfo.processExplained,
              processId: process.processId,
              delFileIds: [...(processInfo.delFileIds || [])],
              productionProductRouteItemParamDtoList,
              // files: processInfo.files.map(file => file.tempId || file.uid),
              files: fileIds,
            };
          }),
        };
        console.log(submitParams, "submitParams");
        isSubmitting.value = false;
        // 调用API进行提交
        if (form.type === "edit") {
          submitParams.productMainId = form.id;
          productionRecordEditSubmit(submitParams)
            .then(res => {
              if (res.code === 200) {
                ElMessage.success(form.type === "edit" ? "修改成功" : "新增成功");
                router.back();
              } else {
                ElMessage.error(res.msg || "提交失败");
              }
            })
            .catch(error => {
              ElMessage.error("提交失败,请稍后重试");
              console.error("提交错误:", error);
            })
            .finally(() => {
              isSubmitting.value = false;
            });
        } else {
          productionRecordAddSubmit(submitParams)
            .then(res => {
              if (res.code === 200) {
                ElMessage.success(form.type === "edit" ? "修改成功" : "新增成功");
                router.back();
              } else {
                ElMessage.error(res.msg || "提交失败");
              }
            })
            .catch(error => {
              ElMessage.error("提交失败,请稍后重试");
              console.error("提交错误:", error);
            })
            .finally(() => {
              isSubmitting.value = false;
            });
        }
      }
    });
  };
@@ -958,9 +1179,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);
  };
@@ -1002,16 +1230,16 @@
    loadUsers();
    getCurrentUser();
    if (data.id) {
    if (form.type === "edit") {
      // 编辑时设置表单数据
      Object.assign(form, data);
      // 设置orderId
      orderId.value = data.orderId || "";
      orderId.value = form.orderId || "";
      // 如果有订单ID,加载工序和参数
      if (data.orderId) {
      if (form.orderId) {
        // 模拟选择订单的操作,触发数据加载
        setTimeout(() => {
          handleOrderChange(data.orderId);
          handleOrderChange(form.orderId);
        }, 100);
      }
    } else {