liu
2026-09-18 91dcbcbd7e5813a2c382d7aa57c5483c06fdf225
src/views/productionManagement/workOrderManagement/index.vue
@@ -65,15 +65,35 @@
                    readonly
                    style="width: 300px" />
        </el-form-item>
        <el-form-item label="生产合格数量"
        <el-form-item label="合格数量"
                      prop="quantity">
          <el-input v-model.number="reportForm.quantity"
                    type="number"
                    min="0"
                    step="0.001"
                    style="width: 300px"
                    placeholder="请输入生产合格数量"
                    placeholder="请输入合格零件数量"
                    @input="handleQuantityInput" />
        </el-form-item>
        <el-form-item label="轻微返工数量"
                      prop="reworkMinorQty">
          <el-input v-model.number="reportForm.reworkMinorQty"
                    type="number"
                    min="0"
                    step="1"
                    style="width: 300px"
                    placeholder="请输入轻微返工零件数量"
                    @input="handleNonNegativeIntInput('reworkMinorQty', $event)" />
        </el-form-item>
        <el-form-item label="严重返工数量"
                      prop="reworkMajorQty">
          <el-input v-model.number="reportForm.reworkMajorQty"
                    type="number"
                    min="0"
                    step="1"
                    style="width: 300px"
                    placeholder="请输入严重返工零件数量"
                    @input="handleNonNegativeIntInput('reworkMajorQty', $event)" />
        </el-form-item>
        <el-form-item label="报废数量"
                      prop="scrapQty">
@@ -82,19 +102,12 @@
                    min="0"
                    step="1"
                    style="width: 300px"
                    placeholder="请输入报废数量"
                    placeholder="请输入报废零件数量"
                    @input="handleScrapQtyInput" />
        </el-form-item>
        <el-form-item label="报工类型"
                      prop="reportType">
          <el-select v-model="reportForm.reportType"
                     style="width: 300px"
                     placeholder="请选择报工类型">
            <el-option label="合格" :value="0" />
            <el-option label="轻微返工" :value="1" />
            <el-option label="严重返工" :value="2" />
            <el-option label="报废" :value="3" />
          </el-select>
        <el-form-item label="计数合计">
          <span class="counted-total">{{ countedTotal }}</span>
          <span class="counted-total-tip">(合格 + 轻微返工 + 严重返工 + 报废,完成后分类进入质检入库)</span>
        </el-form-item>
        <el-form-item label="班组信息">
          <el-select v-model="reportForm.userId"
@@ -210,7 +223,7 @@
</template>
<script setup>
  import { onMounted, ref, nextTick } from "vue";
  import { onMounted, ref, nextTick, computed } from "vue";
  import { ElMessageBox } from "element-plus";
  import dayjs from "dayjs";
  import {
@@ -375,8 +388,9 @@
  const reportForm = reactive({
    planQuantity: 0,
    quantity: null,
    reworkMinorQty: null,
    reworkMajorQty: null,
    scrapQty: null,
    reportType: 0,
    userName: "",
    workOrderId: "",
    reportWork: "",
@@ -396,28 +410,26 @@
  // 生产合格数量验证规则
  const validateQuantity = (rule, value, callback) => {
    if (value === null || value === undefined || value === "") {
      callback(new Error("请输入生产合格数量"));
      callback();
      return;
    }
    const num = Number(value);
    // 整数且大于等于1
    if (isNaN(num) || num < 0) {
      callback(new Error("生产合格数量必须大于等于0"));
      callback(new Error("合格数量必须大于等于0"));
      return;
    }
    callback();
  };
  // 报废数量验证规则
  const validateScrapQty = (rule, value, callback) => {
  // 分类数量(返工/报废)验证规则:选填,非负
  const validateOptionalCount = label => (rule, value, callback) => {
    if (value === null || value === undefined || value === "") {
      callback();
      return;
    }
    const num = Number(value);
    // 整数且大于等于0
    if (isNaN(num) || num < 0) {
      callback(new Error("报废数量必须大于等于0"));
      callback(new Error(`${label}必须大于等于0`));
      return;
    }
    callback();
@@ -425,9 +437,25 @@
  // 验证规则
  const reportFormRules = {
    quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }],
    scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
    quantity: [{ validator: validateQuantity, trigger: "blur" }],
    reworkMinorQty: [{ validator: validateOptionalCount("轻微返工数量"), trigger: "blur" }],
    reworkMajorQty: [{ validator: validateOptionalCount("严重返工数量"), trigger: "blur" }],
    scrapQty: [{ validator: validateOptionalCount("报废数量"), trigger: "blur" }],
  };
  // 报工计数合计 = 合格 + 轻微返工 + 严重返工 + 报废
  const countedTotal = computed(() => {
    const total = [
      reportForm.quantity,
      reportForm.reworkMinorQty,
      reportForm.reworkMajorQty,
      reportForm.scrapQty,
    ].reduce((sum, value) => {
      const num = Number(value);
      return sum + (isNaN(num) || num < 0 ? 0 : num);
    }, 0);
    return Math.round(total * 1000) / 1000;
  });
  // 处理生产合格数量输入,限制必须大于等于0
  const handleQuantityInput = value => {
@@ -445,6 +473,20 @@
      return;
    }
    reportForm.quantity = num;
  };
  // 返工分类数量输入:非负整数
  const handleNonNegativeIntInput = (field, value) => {
    if (value === "" || value === null || value === undefined) {
      reportForm[field] = null;
      return;
    }
    const num = Number(value);
    if (isNaN(num) || num < 0) {
      reportForm[field] = null;
      return;
    }
    reportForm[field] = Number.isInteger(num) ? num : Math.floor(num);
  };
  // 处理报废数量
@@ -628,7 +670,8 @@
    reportForm.planQuantity = remainingQuantity;
    reportForm.quantity =
      row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
    reportForm.reportType = row.reportType ?? 0;
    reportForm.reworkMinorQty = row.reworkMinorQty ?? null;
    reportForm.reworkMajorQty = row.reworkMajorQty ?? null;
    reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
    reportForm.workOrderId = row.id;
    reportForm.reportWork = row.reportWork;
@@ -681,49 +724,25 @@
        return;
      }
      // 验证生产合格数量
      if (
        reportForm.quantity === null ||
        reportForm.quantity === undefined ||
        reportForm.quantity === ""
      ) {
        ElMessageBox.alert("请输入生产合格数量", "提示", {
          confirmButtonText: "确定",
        });
      // 分类数量取值:空或非法按0处理
      const toCount = value => {
        const num = Number(value);
        return isNaN(num) || num < 0 ? 0 : num;
      };
      const quantity = toCount(reportForm.quantity);
      const reworkMinorQty = toCount(reportForm.reworkMinorQty);
      const reworkMajorQty = toCount(reportForm.reworkMajorQty);
      const scrapQty = toCount(reportForm.scrapQty);
      // 对计数的零件做区分:四类数量合计必须大于0
      if (quantity + reworkMinorQty + reworkMajorQty + scrapQty <= 0) {
        ElMessageBox.alert(
          "请按合格/轻微返工/严重返工/报废分类填写零件数量,且合计需大于0",
          "提示",
          { confirmButtonText: "确定" }
        );
        return;
      }
      const quantity = Number(reportForm.quantity);
      if (isNaN(quantity) || quantity < 0) {
        ElMessageBox.alert("生产合格数量必须大于等于0", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
      // if (quantity > reportForm.planQuantity) {
      //   ElMessageBox.alert("本次生产数量不能超过待生产数量", "提示", {
      //     confirmButtonText: "确定",
      //   });
      //   return;
      // }
      // 验证报废数量
      const scrapQty = Number(reportForm.scrapQty);
      if (!isNaN(scrapQty) && scrapQty < 0) {
        ElMessageBox.alert("报废数量不能小于0", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
      // if (!isNaN(scrapQty) && scrapQty > quantity) {
      //   ElMessageBox.alert("报废数量不能大于本次生产数量", "提示", {
      //     confirmButtonText: "确定",
      //   });
      //   return;
      // }
      const productionOperationParamList = params.value.map(param => ({
        ...param,
@@ -732,8 +751,9 @@
      const submitParams = {
        quantity: quantity,
        scrapQty: isNaN(scrapQty) ? 0 : scrapQty,
        reportType: reportForm.reportType,
        reworkMinorQty: reworkMinorQty,
        reworkMajorQty: reworkMajorQty,
        scrapQty: scrapQty,
        userId: reportForm.userId,
        userName: reportForm.userName,
        productionOperationTaskId: reportForm.workOrderId,
@@ -913,6 +933,16 @@
    font-size: 12px;
    min-width: 30px;
  }
  .counted-total {
    font-size: 16px;
    font-weight: 600;
    color: #409eff;
  }
  .counted-total-tip {
    margin-left: 8px;
    font-size: 12px;
    color: #909399;
  }
</style>
<style  lang="scss">