Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材

# Conflicts:
# src/views/productionManagement/workOrder/index.vue
已修改4个文件
200 ■■■■ 文件已修改
src/views/productionManagement/productionOrder/New.vue 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/index.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionReporting/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrder/index.vue 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/New.vue
@@ -24,17 +24,29 @@
        </el-form-item>
        <el-form-item
            label="批号"
            prop="batchNo"
            :rules="[
                {
                required: true,
                }
            ]"
        >
          <el-input v-model="formState.batchNo"/>
        </el-form-item>
        <el-form-item
            label="规格"
            prop="productModelName"
        >
          <el-input v-model="formState.productModelName"  disabled />
          <el-input v-model="formState.productModelName" disabled/>
        </el-form-item>
        <el-form-item
            label="单位"
            prop="unit"
        >
          <el-input v-model="formState.unit"  disabled />
          <el-input v-model="formState.unit" disabled/>
        </el-form-item>
        <el-form-item label="工艺路线">
@@ -45,7 +57,7 @@
            <el-option v-for="item in routeOptions"
                       :key="item.id"
                       :label="`${item.processRouteCode || ''}`"
                       :value="item.id" />
                       :value="item.id"/>
          </el-select>
        </el-form-item>
@@ -53,7 +65,21 @@
            label="预计生产数量"
            prop="quantity"
        >
          <el-input-number v-model="formState.quantity" :step="1" :min="1" style="width: 100%" />
          <el-input-number v-model="formState.quantity" :step="1" :min="1" style="width: 100%"/>
        </el-form-item>
        <el-form-item
            label="预计日程(天)"
            prop="expectedSchedule"
        >
          <el-input-number v-model="formState.expectedSchedule" :step="0.01" :min="0" style="width: 100%" />
        </el-form-item>
        <el-form-item
            label="制造班组"
            prop="manufacturingTeam"
        >
          <el-input v-model="formState.manufacturingTeam"  disabled />
        </el-form-item>
      </el-form>
@@ -101,7 +127,10 @@
  productName: "",
  productModelName: "",
  unit: "",
  batchNo: "",
  quantity: 0,
  expectedSchedule: undefined,
  manufacturingTeam: undefined,
});
const isShow = computed({
@@ -115,7 +144,7 @@
const showProductSelectDialog = ref(false);
let { proxy } = getCurrentInstance()
let {proxy} = getCurrentInstance()
const closeModal = () => {
  // 重置表单数据
@@ -126,6 +155,7 @@
    productName: "",
    productModelName: "",
    quantity: '',
    batchNo: "",
  };
  isShow.value = false;
};
@@ -136,11 +166,16 @@
    const product = products[0];
    formState.value.productId = product.productId;
    formState.value.productName = product.productName;
    const productNameArr = product.productName.split('-');
    if (productNameArr.length === 3 && productNameArr[0] && productNameArr[1] !== '') {
      formState.value.manufacturingTeam = productNameArr[1].charAt(0) + '类车间';
    }
    formState.value.productModelName = product.model;
    formState.value.productModelId = product.id;
    formState.value.unit = product.unit;
    showProductSelectDialog.value = false;
    fetchRouteOptions( product.id);
    fetchRouteOptions(product.id);
    // 触发表单验证更新
    proxy.$refs["formRef"]?.validateField('productModelId');
  }
@@ -152,7 +187,7 @@
  formState.value.routeId = undefined;
  routeOptions.value = []
  bindRouteLoading.value = true;
  listProcessRoute({ productModelId: productModelId }).then(res => {
  listProcessRoute({productModelId: productModelId}).then(res => {
    routeOptions.value = res.data || [];
  }).finally(() => {
    bindRouteLoading.value = false;
src/views/productionManagement/productionOrder/index.vue
@@ -125,16 +125,6 @@
      width: '120px',
    },
    {
      label: "销售合同号",
      prop: "salesContractNo",
      width: '150px',
    },
    {
      label: "客户名称",
      prop: "customerName",
      width: '200px',
    },
    {
      label: "产品名称",
      prop: "productCategory",
      width: '120px',
@@ -184,6 +174,16 @@
      width: 120,
    },
    {
      label: "预计日程(天)",
      prop: "expectedSchedule",
      width: 120,
    },
    {
      label: "制造班组",
      prop: "manufacturingTeam",
      width: 120,
    },
    {
      dataType: "action",
      label: "操作",
      align: "center",
src/views/productionManagement/productionReporting/index.vue
@@ -173,11 +173,6 @@
      width: 120,
    },
    {
      label: "销售合同号",
      prop: "salesContractNo",
      width: 120,
    },
    {
      label: "产品名称",
      prop: "productName",
      width: 120,
src/views/productionManagement/workOrder/index.vue
@@ -176,6 +176,16 @@
                    readonly
                    style="width: 300px" />
        </el-form-item>
        <el-form-item label="投入总量(kg)"
                      prop="totalInvestment">
          <el-input v-model.number="reportForm.totalInvestment"
                    type="number"
                    min="1"
                    step="1"
                    style="width: 300px"
                    placeholder="请输入投入总量"
                    @input="handleTotalInvestmentInput" />
        </el-form-item>
        <el-form-item label="本次生产数量"
                      prop="quantity">
          <el-input v-model.number="reportForm.quantity"
@@ -195,6 +205,15 @@
                    style="width: 300px"
                    placeholder="请输入报废数量"
                    @input="handleScrapQtyInput" />
        </el-form-item>
        <el-form-item label="检品数量"
                      prop="inspectedQuantity">
          <el-input-number v-model.number="reportForm.inspectedQuantity"
                    :min="0"
                    :step="1"
                    style="width: 300px"
                    controls-position="right"
                    placeholder="请输入检品数量"/>
        </el-form-item>
        <el-form-item label="班组信息">
          <el-select v-model="reportForm.userId"
@@ -270,6 +289,10 @@
    {
      label: "工序名称",
      prop: "processName",
    },
    {
      label: "投入总量(kg)",
      prop: "totalInvestment",
    },
    {
      label: "预计生产数量",
@@ -358,8 +381,10 @@
  const userOptions = ref([]);
  const reportForm = reactive({
    planQuantity: 0,
    totalInvestment: 0,
    quantity: null,
    scrapQty: null,
    inspectedQuantity: null,
    userName: "",
    workOrderId: "",
    reportWork: "",
@@ -368,6 +393,26 @@
    productMainId: null,
  });
  // 投入总量验证规则
  const validateTotalInvestment = (rule, value, callback) => {
    if (value === null || value === undefined || value === "") {
      callback(new Error("请输入投入总量"));
      return;
    }
    const num = Number(value);
    if (isNaN(num) || !Number.isInteger(num) || num < 1) {
      callback(new Error("投入总量必须大于等于1"));
      return;
    }
    if (reportForm.quantity !== null && reportForm.quantity !== undefined && reportForm.quantity !== "") {
      if (num < Number(reportForm.quantity)) {
        callback(new Error("投入总量必须大于本次生产数量"));
        return;
      }
    }
    callback();
  };
  // 本次生产数量验证规则
  const validateQuantity = (rule, value, callback) => {
    if (value === null || value === undefined || value === "") {
@@ -375,10 +420,15 @@
      return;
    }
    const num = Number(value);
    // 整数且大于等于1
    if (isNaN(num) || !Number.isInteger(num) || num < 1) {
      callback(new Error("本次生产数量必须大于等于1"));
      return;
    }
    if (reportForm.totalInvestment !== null && reportForm.totalInvestment !== undefined && reportForm.totalInvestment !== "") {
      if (num > Number(reportForm.totalInvestment)) {
        callback(new Error("本次生产数量必须小于投入总量"));
        return;
      }
    }
    callback();
  };
@@ -400,37 +450,87 @@
  // 验证规则
  const reportFormRules = {
    totalInvestment: [{ required: true, validator: validateTotalInvestment, trigger: "blur" }],
    quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }],
    scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
  };
  // 处理本次生产数量输入,限制必须大于等于1
  const handleQuantityInput = value => {
  // 处理投入总量输入
  const handleTotalInvestmentInput = value => {
    if (value === "" || value === null || value === undefined) {
      reportForm.quantity = null;
      reportForm.totalInvestment = null;
      reportForm.scrapQty = null;
      return;
    }
    const num = Number(value);
    if (isNaN(num)) {
      return;
    }
    // 如果小于1,清除
    if (num < 1) {
      reportForm.quantity = null;
      reportForm.totalInvestment = null;
      reportForm.scrapQty = null;
      return;
    }
    // 如果是小数取整数部分
    if (!Number.isInteger(num)) {
      const intValue = Math.floor(num);
      // 如果取整后小于1,清除
      if (intValue < 1) {
        reportForm.totalInvestment = null;
        reportForm.scrapQty = null;
        return;
      }
      reportForm.totalInvestment = intValue;
    } else {
      reportForm.totalInvestment = num;
    }
    // 如果 quantity 有值,自动计算 scrapQty = totalInvestment - quantity
    if (reportForm.quantity !== null && reportForm.quantity !== undefined && reportForm.quantity !== "") {
      const total = Number(reportForm.totalInvestment);
      const qty = Number(reportForm.quantity);
      if (total > qty) {
        reportForm.scrapQty = total - qty;
      } else {
        reportForm.scrapQty = null;
      }
    }
  };
  // 处理本次生产数量输入,限制必须大于等于1
  const handleQuantityInput = value => {
    if (value === "" || value === null || value === undefined) {
      reportForm.quantity = null;
      reportForm.scrapQty = null;
      return;
    }
    const num = Number(value);
    if (isNaN(num)) {
      return;
    }
    if (num < 1) {
      reportForm.quantity = null;
      reportForm.scrapQty = null;
      return;
    }
    if (!Number.isInteger(num)) {
      const intValue = Math.floor(num);
      if (intValue < 1) {
        reportForm.quantity = null;
        reportForm.scrapQty = null;
        return;
      }
      reportForm.quantity = intValue;
      return;
    } else {
      reportForm.quantity = num;
    }
    reportForm.quantity = num;
    // 如果 totalInvestment 有值,自动计算 scrapQty = totalInvestment - quantity
    if (reportForm.totalInvestment !== null && reportForm.totalInvestment !== undefined && reportForm.totalInvestment !== "") {
      const total = Number(reportForm.totalInvestment);
      const qty = Number(reportForm.quantity);
      if (total > qty) {
        reportForm.scrapQty = total - qty;
      } else {
        reportForm.scrapQty = null;
      }
    }
  };
  // 处理报废数量
@@ -440,21 +540,17 @@
      return;
    }
    const num = Number(value);
    // 如果是NaN,保持原值
    if (isNaN(num)) {
      return;
    }
    // 如果是负数,清除输入
    if (num < 0) {
      reportForm.scrapQty = null;
      return;
    }
    // 如果是小数,取整数部分
    if (!Number.isInteger(num)) {
      reportForm.scrapQty = Math.floor(num);
      return;
    }
    // 有效的非负整数(包括0)
    reportForm.scrapQty = num;
  };
  const currentReportRowData = ref(null);
@@ -597,12 +693,14 @@
  const showReportDialog = row => {
    currentReportRowData.value = row;
    reportForm.planQuantity = row.planQuantity;
    reportForm.totalInvestment = row.totalInvestment;
    reportForm.quantity =
      row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
    reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
    reportForm.workOrderId = row.id;
    reportForm.reportWork = row.reportWork;
    reportForm.productMainId = row.productMainId;
    reportForm.inspectedQuantity = row.inspectedQuantity;
    reportForm.scrapQty =
      row.scrapQty !== undefined && row.scrapQty !== null ? row.scrapQty : null;
    nextTick(() => {