湟水峡
1.生产报工单价默认值修改
2.车辆管理页面开发和联调
3.生产管理模块修改
4.发货前端页面开发
已修改7个文件
669 ■■■■■ 文件已修改
src/api/collaborativeApproval/vehicleManagement.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/index.scss 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/collaborativeApproval/vehicleManagement/index.vue 370 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/dispatchLog/index.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/issueManagement/index.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/index.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/collaborativeApproval/vehicleManagement.js
@@ -3,7 +3,7 @@
// 查询车辆列表
export function listVehicle(page, query) {
  return request({
    url: "/vehicleManagement/getList",
    url: "/carInfo/listPage",
    method: "get",
    params: {
      ...page,
@@ -15,7 +15,7 @@
// 新增车辆
export function addVehicle(data) {
  return request({
    url: "/vehicleManagement/add",
    url: "/carInfo/add",
    method: "post",
    data,
  });
@@ -24,7 +24,7 @@
// 修改车辆
export function updateVehicle(data) {
  return request({
    url: "/vehicleManagement/update",
    url: "/carInfo/update",
    method: "post",
    data,
  });
@@ -33,7 +33,7 @@
// 删除车辆
export function delVehicle(query) {
  return request({
    url: "/vehicleManagement/delete",
    url: "/carInfo/delete",
    method: "delete",
    data: query,
  });
@@ -50,7 +50,7 @@
// 使用车辆
export function useVehicle(data) {
  return request({
    url: "/vehicleManagement/useVehicle",
    url: "/carInfoRecord/add",
    method: "post",
    data,
  });
@@ -59,7 +59,7 @@
// 还车
export function returnVehicle(data) {
  return request({
    url: "/vehicleManagement/returnVehicle",
    url: "/carInfoRecord/update",
    method: "post",
    data,
  });
@@ -68,7 +68,7 @@
// 使用记录
export function getVehicleUsageRecords(page, query) {
  return request({
    url: "/vehicleManagement/getUsageRecords",
    url: "/carInfoRecord/list",
    method: "get",
    params: {
      ...page,
src/assets/styles/index.scss
@@ -138,7 +138,8 @@
.table_list {
  height: calc(100vh - 11em);
  background: #fff;
  padding: 18px
  padding: 18px;
  margin-top: 16px;
}
.components-container {
  margin: 30px 50px;
src/views/collaborativeApproval/vehicleManagement/index.vue
@@ -3,7 +3,7 @@
    <div class="search_form">
      <el-form :model="searchForm" :inline="true">
        <el-form-item label="车牌号:">
          <el-input v-model="searchForm.plateNumber" placeholder="请输入车牌号" clearable prefix-icon="Search"
          <el-input v-model="searchForm.carNo" placeholder="请输入车牌号" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="颜色:">
@@ -15,10 +15,10 @@
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="使用状态:">
          <el-select v-model="searchForm.status" placeholder="请选择" clearable @change="handleQuery" style="width: 200px">
            <el-option label="空闲" value="idle" />
            <el-option label="使用中" value="in_use" />
            <el-option label="维修中" value="maintenance" />
          <el-select v-model="searchForm.usageStatus" placeholder="请选择" clearable @change="handleQuery" style="width: 200px">
            <el-option label="空闲" value="空闲" />
            <el-option label="使用中" value="使用中" />
            <el-option label="维修中" value="维修中" />
          </el-select>
        </el-form-item>
        <el-form-item>
@@ -33,7 +33,7 @@
          <el-button type="primary" @click="openForm('add')">
            新增车辆
          </el-button>
          <el-button @click="handleOut">导出</el-button>
<!--          <el-button @click="handleOut">导出</el-button>-->
          <el-button type="danger" plain @click="handleDelete">删除</el-button>
        </div>
      </div>
@@ -42,8 +42,10 @@
        :column="tableColumns"
        :is-selection="true"
        :border="true"
        :row-key="'id'"
        :expand-row-keys="expandRowKeys"
        :table-loading="tableLoading"
        :table-style="{ width: '100%', height: 'calc(100vh - 18.5em)' }"
        :table-style="{ width: '100%', height: 'calc(100vh - 21.5em)' }"
        :page="{
          current: page.current,
          size: page.size,
@@ -52,14 +54,39 @@
        }"
        @selection-change="handleSelectionChange"
        @pagination="paginationChange"
        @expand-change="handleExpandChange"
      >
        <template #expand="{ row }">
          <div class="expand-wrapper">
            <el-skeleton v-if="expandChildLoading[row.id]" animated :rows="3" />
            <template v-else>
              <el-empty v-if="!(expandChildData[row.id] && expandChildData[row.id].length)" description="暂无使用记录" />
              <el-table
                v-else
                :data="expandChildData[row.id]"
                size="small"
                border
                style="width: 100%"
                :header-cell-style="{ background: '#F7F8FA' }"
              >
                <el-table-column prop="userName" label="使用人" width="140" />
                <el-table-column prop="desc" label="目的地" width="180" />
                <el-table-column prop="useTime" label="使用时间" width="180" />
                <el-table-column prop="carReturnDate" label="还车时间" width="180" />
                <el-table-column prop="odometerBefore" label="使用前里程(km)" width="140" />
                <el-table-column prop="odometerAfter" label="还车时里程(km)" width="140" />
                <el-table-column prop="thisTripMileage" label="本次行驶里程(km)" width="160" />
              </el-table>
            </template>
          </div>
        </template>
        <template #operation="{ row }">
          <el-button link type="primary" size="small" @click="openForm('edit', row)">编辑</el-button>
          <el-button link type="primary" size="small" v-if="row.status === 'idle'"
            @click="openUseForm(row)">使用车辆</el-button>
          <el-button link type="primary" size="small" v-if="row.status === 'in_use'"
          <el-button link type="primary" size="small" v-if="row.usageStatus === '空闲'"
            @click="openUseForm(row)">用车</el-button>
          <el-button link type="primary" size="small" v-if="row.usageStatus === '使用中'"
            @click="openReturnForm(row)">还车</el-button>
          <el-button link type="primary" size="small" @click="viewUsageRecords(row)">使用记录</el-button>
          <el-button link type="primary" size="small" @click="openUsageRecordsDialog(row)">使用记录</el-button>
        </template>
      </PIMTable>
    </div>
@@ -70,8 +97,8 @@
      <el-form :model="form" label-width="120px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="车牌号:" prop="plateNumber">
              <el-input v-model="form.plateNumber" placeholder="请输入车牌号" clearable />
            <el-form-item label="车牌号:" prop="carNo">
              <el-input v-model="form.carNo" placeholder="请输入车牌号" clearable />
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -87,11 +114,11 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="使用状态:" prop="status">
              <el-select v-model="form.status" placeholder="请选择" clearable style="width: 100%">
                <el-option label="空闲" value="idle" />
                <el-option label="使用中" value="in_use" />
                <el-option label="维修中" value="maintenance" />
            <el-form-item label="使用状态:" prop="usageStatus">
              <el-select v-model="form.usageStatus" placeholder="请选择" clearable style="width: 100%">
                <el-option label="空闲" value="空闲" />
                <el-option label="使用中" value="使用中" />
                <el-option label="维修中" value="维修中" />
              </el-select>
            </el-form-item>
          </el-col>
@@ -99,7 +126,7 @@
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="表显里程(km):">
              <el-input-number v-model="form.odometer" :min="0" :precision="2" style="width: 100%"
              <el-input-number v-model="form.odometerMileage" :min="0" :precision="2" style="width: 100%"
                placeholder="请输入表显里程" clearable />
            </el-form-item>
          </el-col>
@@ -126,7 +153,7 @@
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="车牌号:">
              <el-input :value="currentUseRow ? currentUseRow.plateNumber : ''" disabled />
              <el-input :value="currentUseRow ? currentUseRow.carNo : ''" disabled />
            </el-form-item>
          </el-col>
        </el-row>
@@ -138,25 +165,40 @@
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="表显里程(km):" prop="odometer">
              <el-input-number v-model="useForm.odometer" :min="0" :precision="2" style="width: 100%"
                placeholder="请输入表显里程" clearable />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="本次行驶里程(km):" prop="travelDistance">
              <el-input-number v-model="useForm.travelDistance" :min="0" :precision="2" style="width: 100%"
                placeholder="请输入本次行驶里程" clearable />
          <el-col :span="24">
            <el-form-item label="借用时间:" prop="carRentalDate">
              <el-date-picker
                style="width: 100%"
                v-model="useForm.carRentalDate"
                type="date"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                placeholder="请选择借用时间"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="使用人:" prop="userId">
              <el-select v-model="useForm.userId" placeholder="请选择使用人" clearable filterable>
                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
            <el-form-item label="使用人:" prop="userName">
              <el-select v-model="useForm.userName" placeholder="请选择使用人" clearable filterable>
                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="表显里程(km):" prop="odometerMileage">
              <el-input-number v-model="useForm.odometerMileage" :min="0" :precision="2" style="width: 100%"
                placeholder="请输入表显里程" clearable />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="本次预计行驶里程(km):" prop="thisTripMileage">
              <el-input-number v-model="useForm.thisTripMileage" :min="0" :precision="2" style="width: 100%"
                placeholder="请输入本次预计行驶里程" clearable />
            </el-form-item>
          </el-col>
        </el-row>
@@ -182,30 +224,23 @@
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="车牌号:">
              <el-input :value="currentReturnRow ? currentReturnRow.plateNumber : ''" disabled />
              <el-input :value="currentReturnRow ? currentReturnRow.carNo : ''" disabled />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="还车时间:" prop="returnTime">
              <el-date-picker style="width: 100%" v-model="returnForm.returnTime" value-format="YYYY-MM-DD HH:mm:ss"
                format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="请选择还车时间" clearable />
            <el-form-item label="还车时间:" prop="carReturnDate">
              <el-date-picker style="width: 100%" v-model="returnForm.carReturnDate" value-format="YYYY-MM-DD"
                format="YYYY-MM-DD" type="date" placeholder="请选择还车时间" clearable />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="表显里程(km):" prop="odometer">
              <el-input-number v-model="returnForm.odometer" :min="0" :precision="2" style="width: 100%"
          <el-col :span="24">
            <el-form-item label="表显里程(km):" prop="odometerMileage">
              <el-input-number v-model="returnForm.odometerMileage" :min="0" :precision="2" style="width: 100%"
                placeholder="请输入表显里程" clearable />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="使用人:" prop="userId">
              <el-select v-model="returnForm.userId" placeholder="请选择使用人" clearable filterable>
                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
@@ -232,7 +267,7 @@
        :column="usageRecordsColumns"
        :border="true"
        :table-loading="usageRecordsLoading"
        :table-style="{ width: '100%' }"
                :table-style="{ height: 'calc(100vh - 24em)', width: '100%' }"
        :page="{
          current: usageRecordsPage.current,
          size: usageRecordsPage.size,
@@ -270,33 +305,52 @@
const selectedRows = ref([]);
const userList = ref([]);
const tableLoading = ref(false);
const expandRowKeys = ref([]);
const page = reactive({
  current: 1,
  size: 100,
});
const total = ref(0);
// 使用记录弹窗
const usageRecordsVisible = ref(false);
const usageRecordsData = ref([]);
const usageRecordsLoading = ref(false);
const usageRecordsPage = reactive({
  current: 1,
  size: 10,
});
const usageRecordsTotal = ref(0);
const usageRecordsColumns = ref([
  { label: "使用人", prop: "userName", width: "120" },
  { label: "目的地", prop: "destination", width: "150" },
  { label: "借用时间", prop: "carRentalDate", },
  { label: "还车时间", prop: "carReturnDate",},
  { label: "使用前里程(km)", prop: "odometerMileage", },
  { label: "本次行驶里程(km)", prop: "thisTripMileage",},
]);
// 搜索表单
const data = reactive({
  searchForm: {
    plateNumber: "",
    carNo: "",
    color: "",
    brand: "",
    status: "",
        usageStatus: "",
  },
  form: {
    plateNumber: "",
    carNo: "",
    color: "",
    brand: "",
    status: "idle",
    odometer: 0,
        usageStatus: "空闲",
    odometerMileage: 0,
    remark: "",
  },
  rules: {
    plateNumber: [{ required: true, message: "请输入车牌号", trigger: "blur" }],
    carNo: [{ required: true, message: "请输入车牌号", trigger: "blur" }],
    color: [{ required: true, message: "请输入颜色", trigger: "blur" }],
    brand: [{ required: true, message: "请输入品牌", trigger: "blur" }],
    status: [{ required: true, message: "请选择使用状态", trigger: "change" }],
        usageStatus: [{ required: true, message: "请选择使用状态", trigger: "change" }],
  },
});
const { form, rules } = toRefs(data);
@@ -307,18 +361,20 @@
const currentUseRow = ref(null);
const useVehicleFormData = reactive({
  useForm: {
    vehicleId: "",
    carInfoId: "",
    destination: "",
    odometer: 0,
    travelDistance: 0,
    userId: "",
    carRentalDate: dayjs().format("YYYY-MM-DD"),
    odometerMileage: 0,
    thisTripMileage: 0,
    userName: "",
    remark: "",
  },
  useRules: {
    destination: [{ required: true, message: "请输入目的地", trigger: "blur" }],
    odometer: [{ required: true, message: "请输入表显里程", trigger: "blur" }],
    travelDistance: [{ required: true, message: "请输入本次行驶里程", trigger: "blur" }],
    userId: [{ required: true, message: "请选择使用人", trigger: "change" }],
    carRentalDate: [{ required: true, message: "请选择借用时间", trigger: "change" }],
    odometerMileage: [{ required: true, message: "请输入表显里程", trigger: "blur" }],
    thisTripMileage: [{ required: true, message: "请输入本次行驶里程", trigger: "blur" }],
    userName: [{ required: true, message: "请选择使用人", trigger: "change" }],
  },
});
const { useForm, useRules } = toRefs(useVehicleFormData);
@@ -328,40 +384,20 @@
const currentReturnRow = ref(null);
const returnFormData = reactive({
  returnForm: {
    vehicleId: "",
    returnTime: "",
    odometer: 0,
    userId: "",
    carInfoId: "",
    carReturnDate: "",
    odometerMileage: 0,
    remark: "",
  },
  returnRules: {
    returnTime: [{ required: true, message: "请选择还车时间", trigger: "change" }],
    odometer: [{ required: true, message: "请输入表显里程", trigger: "blur" }],
    userId: [{ required: true, message: "请选择使用人", trigger: "change" }],
    carReturnDate: [{ required: true, message: "请选择还车时间", trigger: "change" }],
    odometerMileage: [{ required: true, message: "请输入表显里程", trigger: "blur" }],
  },
});
const { returnForm, returnRules } = toRefs(returnFormData);
// 使用记录
const usageRecordsVisible = ref(false);
const usageRecordsData = ref([]);
const usageRecordsLoading = ref(false);
const usageRecordsPage = reactive({
  current: 1,
  size: 100,
});
const usageRecordsTotal = ref(0);
const usageRecordsColumns = ref([
  { label: "车牌号", prop: "plateNumber", width: "120" },
  { label: "使用人", prop: "userName", width: "120" },
  { label: "目的地", prop: "destination", width: "150" },
  { label: "使用时间", prop: "useTime", width: "180" },
  { label: "还车时间", prop: "returnTime", width: "180" },
  { label: "使用前里程(km)", prop: "odometerBefore", width: "130" },
  { label: "还车时里程(km)", prop: "odometerAfter", width: "130" },
  { label: "本次行驶里程(km)", prop: "travelDistance", width: "140" },
]);
const currentVehicleId = ref(null);
const expandChildData = reactive({});
const expandChildLoading = reactive({});
// 用户信息表单弹框数据
const operationType = ref("");
@@ -370,29 +406,22 @@
// 表格列配置
const tableColumns = ref([
  { label: "车牌号", prop: "plateNumber", width: "120" },
  { label: "车牌号", prop: "carNo", width: "120" },
  { label: "颜色", prop: "color", width: "100" },
  { label: "品牌", prop: "brand", width: "120" },
  {
    label: "使用状态",
    prop: "status",
    width: "100",
    prop: "usageStatus",
    dataType: "tag",
    formatData: (val) => {
      if (val === "idle") return "空闲";
      if (val === "in_use") return "使用中";
      if (val === "maintenance") return "维修中";
      return val || "-";
    },
    formatType: (val) => {
      if (val === "idle") return "success";
      if (val === "in_use") return "warning";
      if (val === "maintenance") return "danger";
      if (val === "空闲") return "success";
      if (val === "使用中") return "warning";
      if (val === "维修中") return "danger";
      return "info";
    },
  },
  { label: "当前使用人", prop: "currentUser", width: "120" },
  { label: "表显里程(km)", prop: "odometer", width: "120" },
  { label: "当前使用人", prop: "currentUserName", },
  { label: "表显里程(km)", prop: "odometerMileage",},
  { label: "创建时间", prop: "createTime", width: "180" },
  {
    label: "操作",
@@ -400,13 +429,14 @@
    slot: "operation",
    align: "center",
    fixed: "right",
    width: "250",
    width: "180",
  },
]);
// 查询列表
const handleQuery = () => {
  page.current = 1;
  expandRowKeys.value = [];
  getList();
};
@@ -421,8 +451,8 @@
  listVehicle(page, searchForm)
    .then((res) => {
      tableLoading.value = false;
      tableData.value = res.records || res.data || [];
      total.value = res.total || 0;
      tableData.value = res.data.records;
      total.value = res.data.total || 0;
    })
    .catch(() => {
      tableLoading.value = false;
@@ -434,15 +464,35 @@
  selectedRows.value = selection;
};
// 展开子表数据
const handleExpandChange = (row, expandedRows) => {
  expandRowKeys.value = expandedRows.map((item) => item.id);
  if (expandRowKeys.value.includes(row.id)) {
    loadChildRecords(row.id);
  }
};
const loadChildRecords = (carInfoId) => {
  if (expandChildLoading[carInfoId]) return;
  expandChildLoading[carInfoId] = true;
  getVehicleUsageRecords({ current: 1, size: 20 }, { carInfoId })
    .then((res) => {
      expandChildData[carInfoId] = res.records || res.data || [];
    })
    .finally(() => {
      expandChildLoading[carInfoId] = false;
    });
};
// 打开弹框
const openForm = async (type, row) => {
  operationType.value = type;
  form.value = {
    plateNumber: "",
    carNo: "",
    color: "",
    brand: "",
    status: "idle",
    odometer: 0,
        usageStatus: "空闲",
    odometerMileage: 0,
    remark: "",
  };
@@ -451,9 +501,8 @@
  if (type !== "add") {
    currentId.value = row.id;
    getVehicleById(row.id).then((res) => {
      form.value = { ...(res.data || res) };
    });
    // 直接使用表格行数据,不再调用API
    form.value = { ...row };
  }
  dialogFormVisible.value = true;
};
@@ -484,17 +533,19 @@
const closeDia = () => {
  proxy.resetForm("formRef");
  dialogFormVisible.value = false;
  currentId.value = "";
};
// 打开使用车辆弹框
const openUseForm = async (row) => {
  currentUseRow.value = row;
  useForm.value = {
    vehicleId: row.id,
    carInfoId: row.id,
    destination: "",
    odometer: row.odometer || 0,
    travelDistance: 0,
    userId: "",
    carRentalDate: dayjs().format("YYYY-MM-DD"),
    odometerMileage: row.odometerMileage || 0,
    thisTripMileage: 0,
    userName: "",
    remark: "",
  };
@@ -519,19 +570,54 @@
// 关闭使用车辆弹框
const closeUseDia = () => {
  try {
  proxy.resetForm("useFormRef");
  } catch (error) {
    console.error("Error resetting form:", error);
  }
  useFormVisible.value = false;
  currentUseRow.value = null;
};
// 打开使用记录弹窗
const openUsageRecordsDialog = async (row) => {
  usageRecordsVisible.value = true;
  usageRecordsPage.current = 1;
  loadUsageRecords(row.id);
};
// 加载使用记录
const loadUsageRecords = (carInfoId) => {
  usageRecordsLoading.value = true;
  getVehicleUsageRecords(usageRecordsPage, { carInfoId: carInfoId })
    .then((res) => {
      usageRecordsData.value = res.data.records;
      usageRecordsTotal.value = res.data.total || 0;
    })
    .finally(() => {
      usageRecordsLoading.value = false;
    });
};
// 使用记录分页
const usageRecordsPaginationChange = (obj) => {
  usageRecordsPage.current = obj.page;
  usageRecordsPage.size = obj.limit;
  loadUsageRecords(currentUseRow.value.id);
};
// 关闭使用记录弹窗
const closeUsageRecords = () => {
  usageRecordsVisible.value = false;
};
// 打开还车弹框
const openReturnForm = async (row) => {
  currentReturnRow.value = row;
  returnForm.value = {
    vehicleId: row.id,
    returnTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
    odometer: row.odometer || 0,
    userId: "",
    carInfoId: row.id,
    carReturnDate: dayjs().format("YYYY-MM-DD"),
    odometerMileage: row.odometerMileage || 0,
    remark: "",
  };
@@ -545,7 +631,13 @@
const submitReturnForm = () => {
  proxy.$refs["returnFormRef"].validate((valid) => {
    if (valid) {
      returnVehicle(returnForm.value).then(() => {
      // 自动设置使用状态为空闲并添加车辆记录ID
      const formData = {
        ...returnForm.value,
        usageStatus: "空闲",
        id: currentReturnRow.value.carInfoRecordId
      };
      returnVehicle(formData).then(() => {
        proxy.$modal.msgSuccess("还车成功");
        closeReturnDia();
        getList();
@@ -559,42 +651,6 @@
  proxy.resetForm("returnFormRef");
  returnFormVisible.value = false;
  currentReturnRow.value = null;
};
// 查看使用记录
const viewUsageRecords = (row) => {
  currentVehicleId.value = row.id;
  usageRecordsPage.current = 1;
  getUsageRecords();
  usageRecordsVisible.value = true;
};
// 获取使用记录
const getUsageRecords = () => {
  usageRecordsLoading.value = true;
  getVehicleUsageRecords(usageRecordsPage, { vehicleId: currentVehicleId.value })
    .then((res) => {
      usageRecordsLoading.value = false;
      usageRecordsData.value = res.records || res.data || [];
      usageRecordsTotal.value = res.total || 0;
    })
    .catch(() => {
      usageRecordsLoading.value = false;
    });
};
// 使用记录分页
const usageRecordsPaginationChange = (obj) => {
  usageRecordsPage.current = obj.page;
  usageRecordsPage.size = obj.limit;
  getUsageRecords();
};
// 关闭使用记录弹框
const closeUsageRecords = () => {
  usageRecordsVisible.value = false;
  usageRecordsData.value = [];
  currentVehicleId.value = null;
};
// 导出
src/views/inventoryManagement/dispatchLog/index.vue
@@ -128,67 +128,6 @@
                    />
                </div>
            </el-tab-pane>
      <el-tab-pane label="生产出库" name="semiProduct">
        <div class="search_form">
          <div>
            <span class="search_title ml10">出库日期:</span>
            <el-date-picker
                v-model="searchForm.timeStr"
                type="date"
                placeholder="请选择日期"
                value-format="YYYY-MM-DD"
                format="YYYY-MM-DD"
                clearable
                @change="handleQuery"
            />
            <span class="search_title ml10">产品大类:</span>
            <el-input
                v-model="searchForm.productCategory"
                style="width: 240px"
                placeholder="请输入"
                clearable
            />
            <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button>
          </div>
          <div>
            <el-button @click="handleOut">导出</el-button>
            <el-button type="danger" plain @click="handleDelete">删除</el-button>
            <el-button type="primary" plain @click="handlePrint">打印</el-button>
          </div>
        </div>
        <div class="table_list">
          <el-table
              :data="tableData"
              border
              v-loading="tableLoading"
              @selection-change="handleSelectionChange"
              :expand-row-keys="expandedRowKeys"
              :row-key="(row) => row.id"
              show-summary
              style="width: 100%"
              :summary-method="summarizeMainTable"
              height="calc(100vh - 18.5em)"
          >
            <el-table-column align="center" type="selection" width="55" />
            <el-table-column align="center" label="序号" type="index" width="60" />
            <el-table-column label="出库日期" prop="createTime" width="220" show-overflow-tooltip />
            <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip />
            <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip />
            <el-table-column label="单位" prop="unit" width="100" show-overflow-tooltip />
            <el-table-column label="出库数量" prop="inboundNum" width="220" show-overflow-tooltip />
            <el-table-column label="出库人" prop="createBy" width="220" show-overflow-tooltip />
          </el-table>
          <pagination
              v-show="total > 0"
              :total="total"
              layout="total, sizes, prev, pager, next, jumper"
              :page="page.current"
              :limit="page.size"
              @pagination="paginationSemiProductChange"
          />
        </div>
      </el-tab-pane>
        </el-tabs>
        <!-- 打印预览弹窗 -->
src/views/inventoryManagement/issueManagement/index.vue
@@ -152,76 +152,6 @@
                      @pagination="paginationChange" />
        </div>
      </el-tab-pane>
      <el-tab-pane label="生产出库"
                   name="product">
        <div class="search_form">
          <div>
            <span class="search_title ml10">产品大类:</span>
            <el-input v-model="searchForm.productCategory"
                      style="width: 240px"
                      placeholder="请输入"
                      clearable />
            <el-button type="primary"
                       @click="handleQuery"
                       style="margin-left: 10px">搜索</el-button>
          </div>
          <div>
            <el-button @click="handleOut">导出</el-button>
          </div>
        </div>
        <div class="table_list">
          <el-table :data="tableData"
                    border
                    v-loading="tableLoading"
                    @selection-change="handleSelectionChange"
                    :expand-row-keys="expandedRowKeys"
                    :row-key="row => row.id"
                    show-summary
                    style="width: 100%"
                    :summary-method="summarizeMainTable"
                    height="calc(100vh - 18.5em)">
            <el-table-column align="center"
                             type="selection"
                             width="55" />
            <el-table-column align="center"
                             label="序号"
                             type="index"
                             width="60" />
            <el-table-column label="产品大类"
                             prop="productCategory"
                             show-overflow-tooltip />
            <el-table-column label="规格型号"
                             prop="specificationModel"
                             show-overflow-tooltip />
            <el-table-column label="单位"
                             prop="unit"
                             width="70"
                             show-overflow-tooltip />
            <el-table-column label="剩余库存"
                             prop="inboundNum0"
                             width="90"
                             show-overflow-tooltip />
            <el-table-column fixed="right"
                             label="操作"
                             min-width="60"
                             align="center">
              <template #default="scope">
                <el-button link
                           :disabled="scope.row.inboundNum0 <= 0"
                           type="primary"
                           size="small"
                           @click="openForm(scope.row);">领用</el-button>
              </template>
            </el-table-column>
          </el-table>
          <pagination v-show="total > 0"
                      :total="total"
                      layout="total, sizes, prev, pager, next, jumper"
                      :page="page.current"
                      :limit="page.size"
                      @pagination="paginationChange" />
        </div>
      </el-tab-pane>
    </el-tabs>
    <el-dialog v-model="dialogFormVisible"
               :title="getDialogTitle()"
src/views/inventoryManagement/receiptManagement/index.vue
@@ -206,88 +206,6 @@
                      @pagination="paginationChange"/>
        </div>
      </el-tab-pane>
      <el-tab-pane label="生产入库"
                   name="product">
        <div class="search_form">
          <div>
            <span class="search_title ml10">入库日期:</span>
            <el-date-picker v-model="searchForm.timeStr"
                            type="date"
                            placeholder="请选择日期"
                            value-format="YYYY-MM-DD"
                            format="YYYY-MM-DD"
                            clearable
                            @change="handleQuery"/>
            <span class="search_title ml10">产品大类:</span>
            <el-input v-model="searchForm.productCategory"
                      style="width: 240px"
                      placeholder="请输入"
                      clearable/>
            <el-button type="primary"
                       @click="handleQuery"
                       style="margin-left: 10px">搜索
            </el-button>
          </div>
          <div>
            <el-button type="primary"
                       @click="openForm('add', 'purchase')">新增入库
            </el-button>
            <el-button @click="handleOut">导出</el-button>
            <el-button type="danger"
                       plain
                       @click="handleDelete">删除
            </el-button>
          </div>
        </div>
        <div class="table_list">
          <el-table :data="tableData"
                    border
                    v-loading="tableLoading"
                    @selection-change="handleSelectionChange"
                    :expand-row-keys="expandedRowKeys"
                    :row-key="row => row.id"
                    show-summary
                    style="width: 100%"
                    :summary-method="summarizeMainTable"
                    height="calc(100vh - 18.5em)">
            <el-table-column align="center"
                             type="selection"
                             width="55"/>
            <el-table-column align="center"
                             label="序号"
                             type="index"
                             width="60"/>
            <el-table-column label="入库时间"
                             prop="createTime"
                             width="100"
                             show-overflow-tooltip/>
            <el-table-column label="产品大类"
                             prop="productCategory"
                             show-overflow-tooltip/>
            <el-table-column label="规格型号"
                             prop="specificationModel"
                             show-overflow-tooltip/>
            <el-table-column label="单位"
                             prop="unit"
                             width="220"
                             show-overflow-tooltip/>
            <el-table-column label="入库数量"
                             prop="inboundNum"
                             width="220"
                             show-overflow-tooltip/>
            <el-table-column label="入库人"
                             prop="createBy"
                             width="220"
                             show-overflow-tooltip/>
          </el-table>
          <pagination v-show="total > 0"
                      :total="total"
                      layout="total, sizes, prev, pager, next, jumper"
                      :page="page.current"
                      :limit="page.size"
                      @pagination="pageProductChange"/>
        </div>
      </el-tab-pane>
    </el-tabs>
    <form-dia ref="formDia"
              @close="handleQuery"
src/views/salesManagement/salesLedger/index.vue
@@ -426,6 +426,21 @@
            <el-form :model="deliveryForm" label-width="120px" label-position="top" :rules="deliveryRules" ref="deliveryFormRef">
                <el-row :gutter="30">
                    <el-col :span="24">
                        <el-form-item label="发货类型:" prop="shippingType">
                            <el-select
                                v-model="deliveryForm.shippingType"
                                placeholder="请选择发货类型"
                                style="width: 100%"
                                @change="handleShippingTypeChange"
                            >
                                <el-option label="货车" value="truck" />
                                <el-option label="快递" value="express" />
                            </el-select>
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row :gutter="30">
                    <el-col :span="24">
                        <el-form-item label="发货日期:" prop="shippingDate">
                            <el-date-picker
                                style="width: 100%"
@@ -440,11 +455,20 @@
                    </el-col>
                </el-row>
                <el-row :gutter="30">
                    <el-col :span="24">
                    <el-col :span="24" v-if="deliveryForm.shippingType === 'truck'">
                        <el-form-item label="发货车牌号:" prop="shippingCarNumber">
                            <el-input
                                v-model="deliveryForm.shippingCarNumber"
                                placeholder="请输入发货车牌号"
                                clearable
                            />
                        </el-form-item>
                    </el-col>
                    <el-col :span="24" v-else>
                        <el-form-item label="快递公司:" prop="expressCompany">
                            <el-input
                                v-model="deliveryForm.expressCompany"
                                placeholder="请输入快递公司"
                                clearable
                            />
                        </el-form-item>
@@ -597,15 +621,23 @@
const currentDeliveryRow = ref(null);
const deliveryFormData = reactive({
  deliveryForm: {
    shippingType: "truck", // truck: 货车, express: 快递
    shippingDate: "",
    shippingCarNumber: "",
    expressCompany: "",
  },
  deliveryRules: {
    shippingType: [
      { required: true, message: "请选择发货类型", trigger: "change" }
    ],
    shippingDate: [
      { required: true, message: "请选择发货日期", trigger: "change" }
    ],
    shippingCarNumber: [
      { required: true, message: "请输入发货车牌号", trigger: "blur" }
      { validator: (_, value, callback) => validateShippingCarNumber(value, callback), trigger: "blur" }
    ],
    expressCompany: [
      { validator: (_, value, callback) => validateExpressCompany(value, callback), trigger: "blur" }
    ],
  },
});
@@ -1413,6 +1445,20 @@
  return total.toFixed(2);
};
// 发货类型校验:货车时要求车牌,快递时要求快递公司
const validateShippingCarNumber = (value, callback) => {
  if (deliveryForm.value.shippingType === "truck") {
    if (!value) return callback(new Error("请输入发货车牌号"));
  }
  callback();
};
const validateExpressCompany = (value, callback) => {
  if (deliveryForm.value.shippingType === "express") {
    if (!value) return callback(new Error("请输入快递公司"));
  }
  callback();
};
const mathNum = () => {
  console.log("productForm.value", productForm.value);
  if (!productForm.value.taxInclusiveUnitPrice) {
@@ -1612,6 +1658,12 @@
  //   ElMessage.error(err.msg);
  // });
    currentDeliveryRow.value = row;
  deliveryForm.value = {
    shippingType: "truck",
    shippingDate: getCurrentDate(),
    shippingCarNumber: "",
    expressCompany: "",
  };
    deliveryFormVisible.value = true;
};
@@ -1621,8 +1673,10 @@
    if (valid) {
      addShippingInfo({
        salesLedgerId: currentDeliveryRow.value.id,
        shippingType: deliveryForm.value.shippingType,
        shippingDate: deliveryForm.value.shippingDate,
        shippingCarNumber: deliveryForm.value.shippingCarNumber,
        shippingCarNumber: deliveryForm.value.shippingType === "truck" ? deliveryForm.value.shippingCarNumber : "",
        expressCompany: deliveryForm.value.shippingType === "express" ? deliveryForm.value.expressCompany : "",
      })
        .then(() => {
          proxy.$modal.msgSuccess("发货成功");
@@ -1643,6 +1697,15 @@
  currentDeliveryRow.value = null;
};
// 发货类型切换时清空对应字段
const handleShippingTypeChange = (val) => {
  if (val === "truck") {
    deliveryForm.value.expressCompany = "";
  } else {
    deliveryForm.value.shippingCarNumber = "";
  }
};
onMounted(() => {
    getList();
});