spring
2026-05-25 0c4429a719f5c95a7690fae51efaaa799ef4e77d
src/views/productionManagement/workOrder/components/ProductionRecordForm.vue
@@ -16,6 +16,21 @@
  labelWidth: {
    type: Number,
    default: 120
  },
  /** 本次生产数量(成型工序用于计算投入重量/数量) */
  quantity: {
    type: Number,
    default: null
  },
  /** 当前工序是否为「成型」 */
  isFormingProcess: {
    type: Boolean,
    default: false
  },
  /** 工单 BOM 投入重量,非成型工序回显到「投入重量/数量」 */
  bomInputQty: {
    type: Number,
    default: null
  }
});
@@ -24,11 +39,21 @@
  list: [] as any[],
});
const INPUT_WEIGHT_PARAM_ITEM = "投入重量/数量";
/** 参数项展示名(兼容库内旧名「投入重量」) */
const displayParameterItem = (name) => {
  const trimmed = String(name ?? "").trim();
  if (trimmed === "投入重量") return INPUT_WEIGHT_PARAM_ITEM;
  return trimmed;
};
const fieldLabel = (item: any) => {
  const parameterItem = displayParameterItem(item.parameterItem);
  if (!item.unit || item.unit === "/") {
    return item.parameterItem;
    return parameterItem;
  }
  return `${item.parameterItem}(${item.unit})`;
  return `${parameterItem}(${item.unit})`;
};
const getType = (item: any) => item.type || "文本格式";
@@ -37,7 +62,11 @@
  const result: Record<string, any[]> = {};
  formData.list.forEach((item, index) => {
    if (String(item.isRequired) === "1") {
      result[`list.${index}.value`] = [{required: true, message: `请输入${item.parameterItem}`, trigger: "blur"}];
      result[`list.${index}.value`] = [{
        required: true,
        message: `请输入${displayParameterItem(item.parameterItem)}`,
        trigger: "blur"
      }];
    }
  });
  return result;
@@ -49,14 +78,79 @@
  deviceOptions.value = data;
};
const normalizeUnit = (unit) => String(unit ?? "").trim().toLowerCase();
const isInputWeightItem = (item) => {
  const name = String(item?.parameterItem ?? "").trim();
  return (name === "投入重量" || name.includes(INPUT_WEIGHT_PARAM_ITEM)) &&
    normalizeUnit(item?.unit) === "kg";
};
const isBlankCoeffItem = (item) =>
  String(item?.parameterItem ?? "").includes("生坯系数") &&
  normalizeUnit(item?.unit) === "g";
/** 投入重量/数量(KG) = 本次生产数量 × 生坯系数(g) / 1000 */
const syncFormingInputWeight = () => {
  if (!props.isFormingProcess) return;
  const weightItem = formData.list.find(isInputWeightItem);
  if (!weightItem) return;
  const qty = Number(props.quantity);
  const coeffItem = formData.list.find(isBlankCoeffItem);
  const coeff = coeffItem?.value === null || coeffItem?.value === undefined || coeffItem?.value === ""
    ? NaN
    : Number(coeffItem.value);
  if (!Number.isFinite(qty) || qty < 1 || !Number.isFinite(coeff)) {
    return;
  }
  weightItem.value = Number(((qty * coeff) / 1000).toFixed(4));
};
/** 非成型:投入重量/数量取工单 bomInputQty(仅回显,不覆盖用户已编辑的值) */
const syncBomInputWeight = (force = false) => {
  if (props.isFormingProcess) return;
  const weightItem = formData.list.find(isInputWeightItem);
  if (!weightItem) return;
  const bom = props.bomInputQty;
  if (bom === null || bom === undefined || Number.isNaN(Number(bom))) {
    return;
  }
  const current = weightItem.value;
  const isEmpty =
    current === null || current === undefined || current === "";
  if (!force && !isEmpty) {
    return;
  }
  weightItem.value = Number(bom);
};
const syncInputWeight = () => {
  if (props.isFormingProcess) {
    syncFormingInputWeight();
  } else {
    syncBomInputWeight();
  }
};
const cloneParamList = (list) =>
  JSON.parse(JSON.stringify(list || []));
const initData = () => {
  formData.list = props.list || [];
  formData.list = cloneParamList(props.list);
  formData.list.forEach(item => {
    if (item.value === undefined) {
      item.value = null;
    }
  });
  loadDeviceName()
  loadDeviceName();
  if (props.isFormingProcess) {
    syncFormingInputWeight();
  } else {
    syncBomInputWeight(true);
  }
};
const submitData = async () => {
@@ -74,11 +168,44 @@
    () => {
      initData();
    },
    {immediate: true, deep: true}
    {immediate: true}
);
watch(
    () => [props.quantity, props.isFormingProcess],
    () => {
      if (props.isFormingProcess) {
        syncFormingInputWeight();
      }
    }
);
watch(
    () => {
      const coeffItem = formData.list.find(isBlankCoeffItem);
      return coeffItem?.value;
    },
    () => {
      if (props.isFormingProcess) {
        syncFormingInputWeight();
      }
    }
);
watch(
    () => [props.bomInputQty, props.isFormingProcess],
    () => {
      if (!props.isFormingProcess) {
        syncBomInputWeight();
      }
    }
);
defineExpose({
  submitData
  submitData,
  syncFormingInputWeight,
  syncBomInputWeight,
  syncInputWeight
})
</script>