36b909e117c3ccc22dd266a94479e2a02335d261..4ccf803bfff08d76653376c99d8cb862a7030157
2026-03-27 gaoluyang
军泰伟业 1.已发货数量等于总数量时,状态为已发货。已发货数量小于总数量时,状态建议新增发货中 2.产品清除工艺路线点击确定后,仍然回显绑定的工艺路线...
4ccf80 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.已发货数量等于总数量时,状态为已发货。已发货数量小于总数量时,状态建议新增发货中 2.产品清除工艺路线点击确定后,仍然回显绑定的工艺路线...
c83157 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.已发货数量等于总数量时,状态为已发货。已发货数量小于总数量时,状态建议新增发货中 2.产品清除工艺路线点击确定后,仍然回显绑定的工艺路线...
9c9d12 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.已发货数量等于总数量时,状态为已发货。已发货数量小于总数量时,状态建议新增发货中 2.产品清除工艺路线点击确定后,仍然回显绑定的工艺路线
612c77 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.生产订单添加领料功能 2.将报工台账单的查看投入迁移到生产订单
131f45 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.生产订单添加领料功能 2.将报工台账单的查看投入迁移到生产订单
89b4cc 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.产品维护列表展示工艺路线
19aa78 对比 | 目录
2026-03-27 gaoluyang
军泰伟业 1.生产订单新增编辑逻辑重写
4c6f9b 对比 | 目录
已添加1个文件
已修改9个文件
447 ■■■■ 文件已修改
src/api/productionManagement/productStructureRecord.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PIMTable/PIMTable.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/index.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productStructure/Detail/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/New.vue 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/index.vue 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionReporting/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrder/index.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/returnOrder/components/formDia.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/productStructureRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
// ç”Ÿäº§è®¢å•领料记录接口
import request from "@/utils/request";
// æ ¹æ®è®¢å•ID查询物料清单(领料数据)
export function listPage(query) {
  return request({
    url: "/productStructureRecord/listPage",
    method: "get",
    params: query,
  });
}
// é¢†æ–™æäº¤
export function pick(data) {
  return request({
    url: "/productStructureRecord/pick",
    method: "post",
    data: data,
  });
}
src/components/PIMTable/PIMTable.vue
@@ -137,7 +137,7 @@
              v-if="o.showHide ? o.showHide(scope.row) : true"
              :disabled="o.disabled ? o.disabled(scope.row) : false"
              :plain="o.plain"
              type="primary"
              :type="o.type && ['primary', 'success', 'warning', 'danger', 'info'].includes(o.type) ? o.type : 'primary'"
              :style="{
                color:
                  o.name === '删除' || o.name === 'delete'
src/views/basicData/product/index.vue
@@ -259,6 +259,11 @@
    minWidth: 100,
  },
  {
    label: "工艺路线",
    prop: "routeName",
    minWidth: 100,
  },
  {
    label: "产品属性",
    prop: "productType",
    width: 100,
@@ -385,7 +390,13 @@
    modelForm.value = { ...data };
    modelForm.value.tempFileIds = data.tempFileIds || [];
    modelForm.value.salesLedgerFiles = data.salesLedgerFiles || [];
    if (data.drawingFile) {
    // å¤„理图纸文件反显
    if (data.salesLedgerFiles && data.salesLedgerFiles.length > 0) {
      drawingFileList.value = data.salesLedgerFiles.map(file => ({
        name: file.name,
        url: file.url
      }));
    } else if (data.drawingFile) {
      drawingFileList.value = [{
        name: data.drawingFile.split('/').pop(),
        url: data.drawingFile
@@ -397,7 +408,13 @@
const submitModelForm = () => {
  modelFormRef.value.validate((valid) => {
    if (valid) {
      addOrEditProductModel(modelForm.value).then((res) => {
      // æž„建提交数据,确保 routeId ä¸ºç©ºæ—¶ä¼  null,同时清空 routeName
      const submitData = {
        ...modelForm.value,
        routeId: modelForm.value.routeId || 0,
        routeName: modelForm.value.routeId ? modelForm.value.routeName : null
      };
      addOrEditProductModel(submitData).then((res) => {
        proxy.$modal.msgSuccess("提交成功");
        closeModelDia();
        getModelList();
src/views/productionManagement/productStructure/Detail/index.vue
@@ -167,25 +167,6 @@
              :value="item.id" />
          </el-select>
        </el-form-item>
        <!-- é€‰ä¸­äº§å“åŽå±•示产品信息 -->
        <div v-if="selectedBomProduct" class="selected-product-info">
          <div class="product-info-row">
            <span class="info-label">产品编号</span>
            <span class="info-value">{{ selectedBomProduct.model || selectedBomProduct.productCode || '-' }}</span>
          </div>
          <div class="product-info-row">
            <span class="info-label">产品名称</span>
            <span class="info-value">{{ selectedBomProduct.productName || '-' }}</span>
          </div>
          <div class="product-info-row">
            <span class="info-label">产品规格</span>
            <span class="info-value">{{ selectedBomProduct.spec || selectedBomProduct.drawingNumber || '-' }}</span>
          </div>
          <div class="stock-info-box">
            <div class="stock-number">{{ selectedBomProduct.stockQuantity || 0 }}</div>
            <div class="stock-label">库存数量(台)</div>
          </div>
        </div>
        <el-form-item label="用量系数" prop="coefficient" style="margin-top: 20px;">
          <el-input-number v-model="bomAddForm.coefficient" :min="0.01" :precision="2" :step="1"
            controls-position="right" style="width: 100%" />
@@ -273,6 +254,7 @@
  const parentProductOptions = ref([]);
  const selectedBomProduct = ref(null);
  const selectedBomTreeData = ref([]); // ä¿å­˜é€‰ä¸­äº§å“æ—¶èŽ·å–çš„BOM树数据
  const showAdvancedProductDialog = ref(false);
  const bomAddForm = reactive({
    parentProductId: undefined,
    coefficient:1
src/views/productionManagement/productionOrder/New.vue
@@ -225,7 +225,14 @@
            <el-table-column label="产品名称" prop="productName" min-width="120" />
            <el-table-column label="单位产出需要数量" min-width="140">
              <template #default="{ row }">
                <el-input-number v-model="row.unitQuantity" :min="0" :precision="2" size="small" style="width: 100%" />
                <el-input-number
                  v-model="row.unitQuantity"
                  :min="0"
                  :precision="2"
                  size="small"
                  style="width: 100%"
                  @change="(val) => handleUnitQuantityChange(val, row)"
                />
              </template>
            </el-table-column>
            <el-table-column label="需求数量" min-width="120">
@@ -419,7 +426,8 @@
    const items = res.data || [];
    processRouteItemsOptions.value = items;
    
    // è‡ªåŠ¨æ·»åŠ å·¥åº
    // è‡ªåŠ¨æ·»åŠ å·¥åºï¼Œè®¡åˆ’æ•°ä½¿ç”¨åŸºæœ¬ä¿¡æ¯çš„éœ€æ±‚æ•°é‡
    const demandQty = formState.value.quantity || 1;
    processRouteItems.value = items.map(item => ({
      processId: item.processId,
      processName: item.processName,
@@ -427,7 +435,7 @@
      userPower: item.userPower ? item.userPower.split(',') : [],
      planStartTime: "",
      planEndTime: "",
      planNum: 1,
      planNum: demandQty,
      isQuality: item.isQuality || false,
    }));
  });
@@ -477,16 +485,39 @@
  });
};
// ç›‘听需求数量变化,重新计算物料需求数量
// ç›‘听物料清单变化,当单位产出需要数量变化时重新计算需求数量
watch(() => productStructureRecords.value, (newRecords, oldRecords) => {
  if (oldRecords && oldRecords.length > 0) {
    oldRecords.forEach((oldItem, index) => {
      const newItem = newRecords[index];
      if (oldItem && newItem && newItem.unitQuantity !== oldItem.unitQuantity) {
        newItem.demandedQuantity = (newItem.unitQuantity || 1) * (formState.value.quantity || 1);
      }
    });
  }
}, { deep: true });
// ç›‘听需求数量变化,重新计算物料需求数量和工序计划数
watch(() => formState.value.quantity, (newQty) => {
  // æ›´æ–°ç‰©æ–™æ¸…单的需求数量
  if (productStructureRecords.value.length > 0 && newQty) {
    productStructureRecords.value = productStructureRecords.value.map(item => ({
      ...item,
      demandedQuantity: (item.unitQuantity || 1) * newQty
    }));
    productStructureRecords.value.forEach(item => {
      item.demandedQuantity = (item.unitQuantity || 1) * newQty;
    });
  }
  // æ›´æ–°å·¥åºçš„计划数
  if (processRouteItems.value.length > 0 && newQty) {
    processRouteItems.value.forEach(item => {
      item.planNum = newQty;
    });
  }
});
// å•位产出需要数量变化处理
const handleUnitQuantityChange = (val, row) => {
  row.demandedQuantity = (val || 1) * (formState.value.quantity || 1);
};
// å·¥åºé€‰æ‹©å˜åŒ–处理
const handleProcessChange = (processId, row) => {
  const selectedProcess = processRouteItemsOptions.value.find(item => item.processId === processId);
src/views/productionManagement/productionOrder/index.vue
@@ -71,12 +71,82 @@
                         v-model:visible="isShowNewModal"
                         type="qualified"
                         @completed="handleQuery" />
    <!-- æŸ¥çœ‹æŠ•入弹框 -->
    <el-dialog v-model="inputDialogVisible"
               title="投入"
               width="1000px">
      <PIMTable
        rowKey="id"
        :column="inputTableColumn"
        :tableData="inputTableData"
        :page="inputPage"
        :tableLoading="inputTableLoading"
        @pagination="handleInputPagination"
      />
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="inputDialogVisible = false">关闭</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- é¢†æ–™å¼¹æ¡† -->
    <el-dialog v-model="pickingDialogVisible"
               title="工单领料"
               width="1200px"
               :close-on-click-modal="false">
      <el-table
        :data="pickingTableData"
        border
        size="small"
        @selection-change="handlePickingSelectionChange"
        :header-cell-style="{ background: '#f5f7fa' }"
        show-summary
        :summary-method="summarizePickingTable"
      >
        <el-table-column type="selection" width="50" align="center" />
        <el-table-column label="产品名称" prop="productName" min-width="120" />
        <el-table-column label="图纸编号" prop="model" min-width="100" />
        <el-table-column label="单位用量" prop="unitQuantity" min-width="100" align="center" />
        <el-table-column label="单位" prop="unit" min-width="100" align="center" />
        <el-table-column label="需求数量" prop="demandedQuantity" min-width="100" align="center" />
        <el-table-column label="已领料数量" prop="completedQuantity" min-width="100" align="center" />
        <el-table-column label="未领料数量" prop="unpickedQuantity" min-width="100" align="center" />
        <el-table-column label="领料数量" min-width="180" align="center" prop="quantity">
          <template #default="{ row }">
            <el-input-number
              v-model="row.quantity"
              :min="0"
              :max="row.unpickedQuantity"
              :precision="0"
              size="small"
              style="width: 160px"
              @change="(val) => handlePickingQuantityChange(val, row)"
            />
          </template>
        </el-table-column>
      </el-table>
      <div class="picking-footer-info">
        <span>已选 {{ pickingSelectedRows.length }} æ¡</span>
        <span>{{ pickingTableData.length }} æ¡è®°å½•</span>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="success" @click="handlePickingNext">确认</el-button>
          <el-button @click="pickingDialogVisible = false">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
  import { onMounted, ref } from "vue";
  import { onMounted, ref, computed } from "vue";
  import { ElMessageBox } from "element-plus";
  import { Setting } from '@element-plus/icons-vue';
  import dayjs from "dayjs";
  import { useRouter } from "vue-router";
  import {
@@ -86,6 +156,9 @@
    listProcessBom, delProductOrder, startOrPause,
  } from "@/api/productionManagement/productionOrder.js";
  import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
  import { productionProductInputListPage } from "@/api/productionManagement/productionProductInput.js";
  import { listPage as listProductStructureRecord, pick as pickMaterial } from "@/api/productionManagement/productStructureRecord.js";
  import {fileDel} from "@/api/financialManagement/revenueManagement.js";
  import PIMTable from "@/components/PIMTable/PIMTable.vue";
  const NewProductOrder = defineAsyncComponent(() => import("@/views/productionManagement/productionOrder/New.vue"));
@@ -158,11 +231,11 @@
      label: "操作",
      align: "center",
      fixed: "right",
      width: 240,
      width: 360,
      operation: [
        {
          name: "开始",
          type: "text",
          type: "success",
          showHide: row => row.status === '待生产',
          clickFun: row => {
            handleStartOrPause(row);
@@ -170,10 +243,17 @@
        },
        {
          name: "暂停",
          type: "text",
          type: "danger",
          showHide: row => row.status === '生产中',
          clickFun: row => {
            handleStartOrPause(row);
          },
        },
        {
          name: "领料",
          type: "success",
          clickFun: row => {
            showPickingDialog(row);
          },
        },
        {
@@ -198,6 +278,13 @@
            showProductStructure(row);
          },
        },
        {
          name: "查看投入",
          type: "text",
          clickFun: row => {
            showInputDialog(row);
          },
        },
      ],
    },
  ]);
@@ -209,6 +296,43 @@
    total: 0,
  });
  const selectedRows = ref([]);
  // æŸ¥çœ‹æŠ•入相关
  const inputDialogVisible = ref(false);
  const inputTableData = ref([]);
  const inputTableLoading = ref(false);
  const inputCurrentRow = ref(null);
  const inputPage = reactive({
    current: 1,
    size: 100,
    total: 0,
  });
  const inputTableColumn = ref([
    {
      label: '投入产品名称',
      prop: 'productName',
    },
    {
      label: '图纸编号',
      prop: 'model'
    },
    {
      label: '投入数量',
      prop: 'quantity',
    },
    {
      label: '单位',
      prop: 'unit',
    },
  ]);
  // é¢†æ–™ç›¸å…³
  const pickingDialogVisible = ref(false);
  const pickingTableData = ref([]);
  const pickingSelectedRows = ref([]);
  const pickingForm = reactive({
    orderId: null,
  });
  const data = reactive({
    searchForm: {
@@ -459,6 +583,117 @@
  const handleConfirmRoute = () => {};
  // æ˜¾ç¤ºæŸ¥çœ‹æŠ•入弹框
  const showInputDialog = (row) => {
    inputCurrentRow.value = row;
    inputDialogVisible.value = true;
    inputPage.current = 1;
    inputPage.total = 0;
    fetchInputData();
  };
  // æŸ¥çœ‹æŠ•入分页
  const handleInputPagination = (obj) => {
    inputPage.current = obj.page;
    inputPage.size = obj.limit;
    fetchInputData();
  };
  // èŽ·å–æŠ•å…¥æ•°æ®
  const fetchInputData = () => {
    inputTableLoading.value = true;
    const params = { productOrderId: inputCurrentRow.value.id, ...inputPage };
    productionProductInputListPage(params)
      .then(res => {
        inputTableLoading.value = false;
        inputTableData.value = res.data.records;
        inputPage.total = res.data.total;
      })
      .catch(err => {
        inputTableLoading.value = false;
        console.error("获取投入数据失败:", err);
      });
  };
  // æ˜¾ç¤ºé¢†æ–™å¼¹æ¡†
  const showPickingDialog = async (row) => {
    pickingForm.orderId = row.id;
    pickingDialogVisible.value = true;
    pickingTableData.value = [];
    // èŽ·å–ç‰©æ–™æ¸…å•æ•°æ®
    try {
      const res = await listProductStructureRecord({ productOrderId: row.id });
      const materials = res.data?.records || [];
      pickingTableData.value = materials.map(item => ({
        ...item,
        quantity: 0,
        unpickedQuantity: (item.demandedQuantity || 0) - (item.completedQuantity || 0),
      }));
    } catch (e) {
      console.error("获取物料清单失败:", e);
      proxy.$modal.msgError("获取物料清单失败");
    }
  };
  // é¢†æ–™è¡¨æ ¼é€‰æ‹©å˜åŒ–
  const handlePickingSelectionChange = (selection) => {
    pickingSelectedRows.value = selection;
  };
  // é¢†æ–™æ•°é‡å˜åŒ–处理
  const handlePickingQuantityChange = (val, row) => {
    if (val > row.unpickedQuantity) {
      proxy.$modal.msgWarning("领料数量不能超过未领料数量");
      row.quantity = row.unpickedQuantity;
    }
  };
  // ç¡®è®¤é¢†æ–™
  const handlePickingNext = async () => {
    if (pickingSelectedRows.value.length === 0) {
      proxy.$modal.msgWarning("请选择要领料的物料");
      return;
    }
    // æ ¡éªŒé¢†æ–™æ•°é‡
    for (const row of pickingSelectedRows.value) {
      if (row.quantity > row.unpickedQuantity) {
        proxy.$modal.msgWarning(`${row.productName} çš„领料数量不能超过未领料数量`);
        return;
      }
      if (row.quantity <= 0) {
        proxy.$modal.msgWarning(`${row.productName} çš„领料数量必须大于0`);
        return;
      }
    }
    // æäº¤é¢†æ–™æ•°æ®
    try {
      const pickData = pickingSelectedRows.value.map(row => ({
        productOrderId: row.productOrderId,
        productStructureRecordId: row.id,
        productModelId: row.productModelId,
        quantity: row.quantity,
      }));
      await pickMaterial(pickData);
      proxy.$modal.msgSuccess("领料成功");
      pickingDialogVisible.value = false;
    } catch (e) {
      console.error("领料失败:", e);
      proxy.$modal.msgError("领料失败");
    }
  };
  // é¢†æ–™è¡¨æ ¼åˆè®¡æ–¹æ³•
  const summarizePickingTable = (param) => {
    return proxy.summarizeTable(param, [
      "quantity",
      "unpickedQuantity",
      "inventoryQuantity",
      "demandedQuantity",
    ]);
  };
  onMounted(() => {
    getList();
  });
@@ -484,4 +719,13 @@
:deep(.purple){
  background-color: #F4DEFA;
}
.picking-footer-info {
  display: flex;
  justify-content: space-between;
  padding: 10px;
  font-size: 14px;
  color: #606266;
}
</style>
src/views/productionManagement/productionReporting/index.vue
@@ -121,9 +121,6 @@
    </div>
    <form-dia ref="formDia"
              @close="handleQuery"></form-dia>
    <input-modal v-if="isShowInput"
                 v-model:visible="isShowInput"
                 :production-product-main-id="isShowingId" />
  </div>
</template>
@@ -138,7 +135,7 @@
  } from "@/api/productionManagement/productionReporting.js";
  import { productionProductMainListPage } from "@/api/productionManagement/productionProductMain.js";
  import { userListNoPageByTenantId } from "@/api/system/user.js";
  import InputModal from "@/views/productionManagement/productionReporting/Input.vue";
  const data = reactive({
    searchForm: {
@@ -196,7 +193,7 @@
    {
      label: "创建时间",
      prop: "createTime",
      width: 120,
      width: 180,
    },
    {
      dataType: "action",
@@ -204,13 +201,6 @@
      align: "center",
      fixed: "right",
      operation: [
        {
          name: "查看投入",
          type: "text",
          clickFun: row => {
            showInput(row);
          },
        },
        {
          name: "删除",
          type: "danger",
@@ -378,14 +368,6 @@
      const rowInfo = type === "add" ? selectedRows.value[0] : row;
      formDia.value?.openDialog(type, rowInfo);
    });
  };
  // æ‰“开投入模态框
  const isShowInput = ref(false);
  const isShowingId = ref(0);
  const showInput = row => {
    isShowInput.value = true;
    isShowingId.value = row.id;
  };
  // å¯¼å‡º
src/views/productionManagement/workOrder/index.vue
@@ -128,6 +128,10 @@
              <span class="info-value">{{ transferCardRowData.completeQuantity }}</span>
            </div>
            <div class="info-item">
              <span class="info-label">待生产数量</span>
              <span class="info-value">{{ (transferCardRowData.planQuantity || 0) - (transferCardRowData.completeQuantity || 0) }}</span>
            </div>
            <div class="info-item">
              <span class="info-label">良品数量</span>
              <span class="info-value">0</span>
            </div>
@@ -224,6 +228,7 @@
    downProductWorkOrder,
  } from "@/api/productionManagement/workOrder.js";
  import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js";
  import QRCode from "qrcode";
  import { getCurrentInstance, reactive, toRefs } from "vue";
  import FilesDia from "./components/filesDia.vue";
@@ -270,6 +275,11 @@
    {
      label: "完成数量",
      prop: "completeQuantity",
      width: "140",
    },
    {
      label: "待生产数量",
      prop: "pendingQuantity",
      width: "140",
    },
    {
@@ -402,7 +412,10 @@
    productWorkOrderPage(params)
      .then(res => {
        tableLoading.value = false;
        tableData.value = res.data.records;
        tableData.value = res.data.records.map(item => ({
          ...item,
          pendingQuantity: (item.planQuantity || 0) - (item.completeQuantity || 0)
        }));
        page.total = res.data.total;
      })
      .catch(() => {
@@ -637,6 +650,7 @@
      justify-content: flex-start;
    }
  }
</style>
<style  lang="scss">
src/views/salesManagement/returnOrder/components/formDia.vue
@@ -211,8 +211,13 @@
const { form, rules } = toRefs(data);
const calcAlreadyReturned = (row) => {
  // å¦‚æžœ row.unQuantity å·²ç»æœ‰å€¼ï¼ˆä»ŽåŽç«¯èŽ·å–çš„æœªé€€è´§æ•°é‡ï¼‰ï¼Œç›´æŽ¥è¿”å›ž
  if (row?.unQuantity !== undefined && row?.unQuantity !== null) {
    return Number(row.unQuantity);
  }
  // å¦åˆ™æ ¹æ®æ€»æ•°é‡å’Œå·²é€€è´§æ•°é‡è®¡ç®—
  const total = Number(row?.shippingNum ?? row?.totalQuantity ?? 0);
  const returned = Number(row?.returnQuantity ?? row?.num ?? 0);
  const returned = Number(row?.returnNum ?? 0);
  if (!Number.isFinite(total) || !Number.isFinite(returned)) return 0;
  return total - returned;
};
src/views/salesManagement/salesLedger/index.vue
@@ -1964,26 +1964,23 @@
    // çŠ¶æ€æ˜¯å­—ç¬¦ä¸²
    const statusStr = String(status).trim();
    
    // å¦‚果状态是"已撤销",直接返回
    if (statusStr === '已撤销') {
        return '已撤销';
    }
    // å¦‚果已发货(有发货日期或车牌号),显示"已发货"
    if (row.shippingDate || row.shippingCarNumber) {
        return '已发货';
    }
    const statusTextMap = {
        '待发货': '待发货',
        '待审核': '待审核',
        '审核中': '审核中',
        '发货中': '发货中',
        '审核拒绝': '审核拒绝',
        '审核通过': '审核通过',
        '已发货': '已发货',
        '已撤销': '已撤销'
    };
    return statusTextMap[statusStr] || '待发货';
    // å¦‚果状态在映射表中,直接返回对应文本
    if (statusTextMap[statusStr]) {
        return statusTextMap[statusStr];
    }
    return '待发货';
};
/**
@@ -2002,16 +1999,6 @@
    // çŠ¶æ€æ˜¯å­—ç¬¦ä¸²
    const statusStr = String(status).trim();
    
    // å¦‚果状态是"已撤销",显示橙色
    if (statusStr === '已撤销') {
        return 'warning';
    }
    // å¦‚果已发货(有发货日期或车牌号),显示绿色
    if (row.shippingDate || row.shippingCarNumber) {
        return 'success';
    }
    const typeTextMap = {
        '待发货': 'info',
        '待审核': 'info',
@@ -2019,9 +2006,16 @@
        '审核拒绝': 'danger',
        '已撤销': 'warning',
        '审核通过': 'success',
        '已发货': 'success'
        '已发货': 'success',
        '发货中': 'warning'
    };
    return typeTextMap[statusStr] || 'info';
    // å¦‚果状态在映射表中,直接返回对应类型
    if (typeTextMap[statusStr]) {
        return typeTextMap[statusStr];
    }
    return 'info';
};
/**