spring
3 天以前 61449dbf92441b41e37c1d519e8662cca998ff6a
fix: 添加批号
已修改11个文件
180 ■■■■ 文件已修改
src/views/inventoryManagement/stockManagement/New.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Qualified.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Unqualified.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementLedger/index.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/Detail/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/New.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/finalInspection/components/formDia.vue 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/finalInspection/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/components/formDia.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/index.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/New.vue
@@ -44,6 +44,14 @@
          <el-input v-model="formState.unit"  disabled />
        </el-form-item>
        <el-form-item label="批号" prop="batchNo">
          <el-input
            v-model="formState.batchNo"
            clearable
            placeholder="可输入批号,留空将自动生成"
          />
        </el-form-item>
        <el-form-item
            label="库存数量"
            prop="qualitity"
@@ -109,10 +117,22 @@
  productModelName: "",
  materialCode: "",
  unit: "",
  batchNo: "",
  qualitity: 0,
  warnNum: 0,
  remark: '',
});
/** 未填写批号时生成唯一批号(前端生成,后端也可再覆盖) */
const generateBatchNo = () => {
  const d = new Date();
  const pad = (n) => String(n).padStart(2, "0");
  const ts = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
  const r = Math.floor(Math.random() * 10000)
    .toString()
    .padStart(4, "0");
  return `PH${ts}${r}`;
};
const isShow = computed({
  get() {
@@ -134,7 +154,12 @@
    productModelId: undefined,
    productName: "",
    productModelName: "",
    description: '',
    materialCode: "",
    unit: "",
    batchNo: "",
    qualitity: 0,
    warnNum: 0,
    remark: "",
  };
  isShow.value = false;
};
@@ -167,8 +192,12 @@
        proxy.$modal.msgError("请选择规格");
        return;
      }
      const payload = { ...formState.value };
      const bn = (payload.batchNo || "").trim();
      payload.batchNo = bn || generateBatchNo();
      if (props.type === 'qualified') {
        createStockInventory(formState.value).then(res => {
        createStockInventory(payload).then(res => {
          // 关闭模态框
          isShow.value = false;
          // 告知父组件已完成
@@ -176,7 +205,7 @@
          proxy.$modal.msgSuccess("提交成功");
        })
      } else {
        createStockUnInventory(formState.value).then(res => {
        createStockUnInventory(payload).then(res => {
          // 关闭模态框
          isShow.value = false;
          // 告知父组件已完成
src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -2,8 +2,13 @@
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title ml10">产品大类:</span>
        <span class="search_title ml10">产品名称:</span>
        <el-input v-model="searchForm.productName"
                  style="width: 240px"
                  placeholder="请输入"
                  clearable/>
        <span class="search_title ml10">规格型号:</span>
        <el-input v-model="searchForm.model"
                  style="width: 240px"
                  placeholder="请输入"
                  clearable/>
@@ -25,6 +30,7 @@
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column label="产品大类" prop="productName" show-overflow-tooltip />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="批号" prop="batchNo" show-overflow-tooltip />
        <el-table-column label="料号" prop="materialCode" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="库存数量" prop="qualitity" show-overflow-tooltip />
@@ -70,7 +76,7 @@
<script setup>
import pagination from '@/components/PIMTable/Pagination.vue'
import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue'
import { ref, reactive, toRefs, onMounted, getCurrentInstance, defineAsyncComponent } from 'vue'
import {ElMessage, ElMessageBox} from "element-plus";
import { getStockInventoryListPage } from "@/api/inventoryManagement/stockInventory.js";
const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue"));
@@ -100,6 +106,7 @@
const data = reactive({
  searchForm: {
    productName: '',
    model: '',
  }
})
const { searchForm } = toRefs(data)
src/views/inventoryManagement/stockManagement/Unqualified.vue
@@ -2,8 +2,13 @@
  <div class="app-container">
    <div class="search_form">
      <div>
        <span class="search_title ml10">产品大类:</span>
        <span class="search_title ml10">产品名称:</span>
        <el-input v-model="searchForm.productName"
                  style="width: 240px"
                  placeholder="请输入"
                  clearable/>
        <span class="search_title ml10">规格型号:</span>
        <el-input v-model="searchForm.model"
                  style="width: 240px"
                  placeholder="请输入"
                  clearable/>
@@ -22,6 +27,7 @@
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column label="产品大类" prop="productName" show-overflow-tooltip />
        <el-table-column label="规格型号" prop="model" show-overflow-tooltip />
        <el-table-column label="批号" prop="batchNo" show-overflow-tooltip />
        <el-table-column label="料号" prop="materialCode" show-overflow-tooltip />
        <el-table-column label="单位" prop="unit" show-overflow-tooltip />
        <el-table-column label="库存数量" prop="qualitity" show-overflow-tooltip />
@@ -61,7 +67,7 @@
<script setup>
import pagination from '@/components/PIMTable/Pagination.vue'
import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue'
import { ref, reactive, toRefs, onMounted, getCurrentInstance, defineAsyncComponent } from 'vue'
import { ElMessageBox } from "element-plus";
import { getStockUninventoryListPage } from "@/api/inventoryManagement/stockUninventory.js";
const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue"));
@@ -89,6 +95,7 @@
const data = reactive({
  searchForm: {
    productName: '',
    model: '',
  }
})
const { searchForm } = toRefs(data)
src/views/procurementManagement/procurementLedger/index.vue
@@ -580,6 +580,14 @@
                        disabled />
            </el-form-item>
          </el-col>
          <el-col :span="24">
            <el-form-item label="批号:"
                          prop="batchNo">
              <el-input v-model="productForm.batchNo"
                        clearable
                        placeholder="选填,可输入批号;留空将自动生成" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
@@ -966,6 +974,7 @@
      productModelId: "",
      specificationModel: "",
      materialCode: "",
      batchNo: "",
      unit: "",
      quantity: "",
      taxInclusiveUnitPrice: "",
@@ -1636,10 +1645,28 @@
      return newItem;
    });
  }
  /** 与库存新增一致:未填批号时前端生成(PH + 时间戳 + 随机数) */
  const generateProductBatchNo = () => {
    const d = new Date();
    const pad = (n) => String(n).padStart(2, "0");
    const ts = `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;
    const r = Math.floor(Math.random() * 10000)
      .toString()
      .padStart(4, "0");
    return `PH${ts}${r}`;
  };
  const ensureProductBatchNo = () => {
    const v = (productForm.value.batchNo ?? "").toString().trim();
    productForm.value.batchNo = v || generateProductBatchNo();
  };
  // 提交产品表单
  const submitProduct = () => {
    proxy.$refs["productFormRef"].validate(valid => {
      if (valid) {
        ensureProductBatchNo();
        if (operationType.value === "edit") {
          submitProductEdit();
        } else {
src/views/productionManagement/productionOrder/Detail/index.vue
@@ -8,7 +8,7 @@
        <div class="title">基础信息</div>
        <div class="sub">
          <span class="mr12">生产订单号:{{ header.npsNo || "-" }}</span>
          <span class="mr12">生产批号:{{ header.lotNo || "-" }}</span>
          <span class="mr12">生产批号:{{ header.batchNo || "-" }}</span>
          <span class="mr12">产品名称:{{ header.productCategory || "-" }}</span>
          <span class="mr12">规格:{{ header.specificationModel || "-" }}</span>
          <span class="mr12">料号:{{ header.materialCode || "-" }}</span>
@@ -202,7 +202,7 @@
const header = computed(() => ({
  orderId: route.query.orderId,
  npsNo: route.query.npsNo,
  lotNo: route.query.lotNo,
  batchNo: route.query.batchNo,
  productCategory: route.query.productCategory,
  specificationModel: route.query.specificationModel,
  materialCode: route.query.materialCode,
src/views/productionManagement/productionOrder/New.vue
@@ -57,9 +57,9 @@
        </el-form-item>
        <el-form-item
            label="生产批号"
            prop="lotNo"
            prop="batchNo"
        >
          <el-input v-model="formState.lotNo" placeholder="请输入生产批号" />
          <el-input v-model="formState.batchNo" placeholder="选填,可输入批号;留空将自动生成" />
        </el-form-item>
        <el-form-item
@@ -139,7 +139,7 @@
  unit: "",
  priority: undefined,
  quantity: 0,
  lotNo: "",
  batchNo: "",
});
const isShow = computed({
@@ -172,7 +172,7 @@
    materialCode: "",
    priority: priority_type.value && priority_type.value.length > 0 ? priority_type.value[2].value : undefined,
    quantity: '',
    lotNo: "",
    batchNo: "",
  };
  isShow.value = false;
};
src/views/productionManagement/productionOrder/index.vue
@@ -139,7 +139,7 @@
    },
    {
      label: "生产批号",
      prop: "lotNo",
      prop: "batchNo",
      width: '120px',
    },
    {
@@ -439,7 +439,7 @@
      query: {
        orderId: row.id,
        npsNo: row.npsNo || "",
        lotNo: row.lotNo || "",
        batchNo: row.batchNo || "",
        productCategory: row.productCategory || "",
        specificationModel: row.specificationModel || "",
        materialCode: row.materialCode || "",
src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -32,6 +32,15 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="生产批号:">
              <el-input
                :model-value="productionBatchDisplay"
                disabled
                placeholder="—"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="指标选择:" prop="testStandardId">
              <el-select
                v-model="form.testStandardId"
@@ -54,8 +63,6 @@
              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="请输入" clearable :precision="2" :disabled="quantityDisabled"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="料号:" prop="materialCode">
              <el-input v-model="form.materialCode" placeholder="请输入" disabled/>
@@ -77,8 +84,6 @@
              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="请输入" clearable :precision="2" disabled/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="不良原因:" prop="defectiveReason">
              <el-select v-model="form.defectiveReason" placeholder="请选择" clearable style="width: 100%">
@@ -171,6 +176,8 @@
    defectiveReason: undefined,
    unit: "",
    materialCode: "",
    /** 来自生产工单/台账,仅展示 */
    batchNo: "",
    qualifiedQuantity: "",
    quantity: "",
    checkCompany: "",
@@ -194,6 +201,16 @@
const quantityDisabled = computed(() => {
  const v = form.value || {};
  return !!(v.productMainId != null || v.purchaseLedgerId != null);
});
/** 生产批号展示(接口可能为 batchNo 或 productionBatchNo) */
const productionBatchDisplay = computed(() => {
  const f = form.value || {};
  const v = f.batchNo ?? f.productionBatchNo;
  if (v === null || v === undefined || String(v).trim() === "") {
    return "";
  }
  return String(v);
});
const supplierList = ref([]);
const productOptions = ref([]);
@@ -278,7 +295,10 @@
    // 先保存 testStandardId,避免被清空
    const savedTestStandardId = row.testStandardId;
    // 先设置表单数据,但暂时清空 testStandardId,等选项加载完成后再设置
    form.value = {...row, testStandardId: ''}
    form.value = { ...row, testStandardId: "" };
    // 生产批号:与生产工单字段对齐,兼容多种后端字段名
    form.value.batchNo =
      row.batchNo ?? row.productionBatchNo ?? form.value.batchNo ?? "";
    currentProductId.value = row.productId || 0
    // 清空验证状态,避免数据加载过程中的校验闪烁
    nextTick(() => {
src/views/qualityManagement/finalInspection/index.vue
@@ -101,6 +101,11 @@
    width: 120
  },
  {
    label: "生产批号",
    prop: "batchNo",
    width: 140
  },
  {
    label: "检验员",
    prop: "checkName",
  },
@@ -286,7 +291,11 @@
  params.entryDate = undefined
  qualityInspectListPage({...params, inspectType: 2}).then(res => {
    tableLoading.value = false;
    tableData.value = res.data.records
    const records = res.data.records || [];
    tableData.value = records.map((row) => ({
      ...row,
      batchNo: row.batchNo ?? row.productionBatchNo ?? "",
    }));
    page.total = res.data.total;
  }).catch(err => {
    tableLoading.value = false;
src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -40,6 +40,15 @@
            </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="生产批号:">
              <el-input
                :model-value="productionBatchDisplay"
                disabled
                placeholder="—"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
@@ -125,7 +134,7 @@
</template>
<script setup>
import {ref, reactive, toRefs} from "vue";
import { ref, reactive, toRefs, computed, getCurrentInstance } from "vue";
import {modelList, productTreeList} from "@/api/basicData/product.js";
import {
  getQualityUnqualifiedInfo,
@@ -151,6 +160,8 @@
    model: "",
    unit: "",
    materialCode: "",
    /** 来自业务数据,仅展示 */
    batchNo: "",
    quantity: "",
    checkCompany: "",
    checkResult: "",
@@ -174,6 +185,16 @@
  },
});
const { form, rules } = toRefs(data);
const productionBatchDisplay = computed(() => {
  const f = form.value || {};
  const v = f.batchNo ?? f.productionBatchNo;
  if (v === null || v === undefined || String(v).trim() === "") {
    return "";
  }
  return String(v);
});
const productOptions = ref([]);
const modelOptions = ref([]);
const userList = ref([]); // 检验员/处理人下拉列表
@@ -202,6 +223,7 @@
      model: '',
      unit: '',
      materialCode: '',
      batchNo: '',
      quantity: '',
      productName: '',
    };
@@ -213,6 +235,8 @@
    getQualityUnqualifiedInfo(row.id).then(res => {
      const { inspectState, ...rest } = (res.data || {})
      form.value = { ...rest }
      form.value.batchNo =
        rest.batchNo ?? rest.productionBatchNo ?? form.value.batchNo ?? ""
    })
  }
}
src/views/qualityManagement/nonconformingManagement/index.vue
@@ -34,7 +34,7 @@
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button>
      </div>
      <div>
        <el-button type="primary" @click="openForm('add')">新增</el-button>
        <!-- <el-button type="primary" @click="openForm('add')">新增</el-button> -->
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
@@ -141,6 +141,11 @@
    prop: "model",
  },
  {
    label: "生产批号",
    prop: "batchNo",
    width: 140,
  },
  {
    label: "料号",
    prop: "materialCode",
  },
@@ -237,7 +242,11 @@
  params.entryDate = undefined
  qualityUnqualifiedListPage(params).then(res => {
    tableLoading.value = false;
    tableData.value = res.data.records
    const records = res.data.records || [];
    tableData.value = records.map((row) => ({
      ...row,
      batchNo: row.batchNo ?? row.productionBatchNo ?? "",
    }));
    page.total = res.data.total;
  }).catch(err => {
    tableLoading.value = false;