feat (production)报工页面直接取消审批人、报工页面添加成品名称finalProductModel
已修改2个文件
616 ■■■■ 文件已修改
src/pages/productionManagement/productionReport/index.vue 574 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/productionManagement/workOrder/index.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/productionManagement/productionReport/index.vue
@@ -2,7 +2,7 @@
  <view class="work-order">
    <!-- 通用页面头部 -->
    <PageHeader title="生产报工" @back="goBack" />
    <!-- 搜索区域 -->
    <view class="search-section">
      <view class="search-bar">
@@ -15,13 +15,13 @@
            clearable
          />
        </view>
        <view class="filter-button" @click="handleQuery">
          <up-icon name="search" size="24" color="#999"></up-icon>
        </view>
      </view>
    </view>
    <!-- 工单列表 -->
    <scroll-view
      scroll-y
@@ -30,7 +30,7 @@
      lower-threshold="80"
      @scrolltolower="loadMore"
    >
      <view v-for="(item, index) in tableData" :key="item.id || index" class="ledger-item" @click="showTransferCard(item)">
      <view v-for="(item, index) in tableData" :key="item.id || index" class="ledger-item">
        <view class="item-header">
          <view class="item-left">
            <view class="document-icon">
@@ -42,16 +42,20 @@
            <text class="item-tag tag-type">{{ item.workOrderType || '无' }}</text>
          </view>
        </view>
        <up-divider></up-divider>
        <view class="item-details">
          <view class="detail-row">
            <text class="detail-label">产品名称</text>
            <text class="detail-label">成品名称</text>
            <text class="detail-value">{{ item.finalProductModel || '无' }}</text>
          </view>
          <view class="detail-row">
            <text class="detail-label">加工品名称</text>
            <text class="detail-value">{{ item.productName || '无' }}</text>
          </view>
          <view class="detail-row">
            <text class="detail-label">规格型号</text>
            <text class="detail-label">加工品型号</text>
            <text class="detail-value">{{ item.model || '无' }}</text>
          </view>
          <view class="detail-row">
@@ -62,12 +66,12 @@
            <text class="detail-label">需求/完成数量</text>
            <text class="detail-value">{{ item.planQuantity || '无' }} / {{ item.completeQuantity || '无' }}</text>
          </view>
          <view class="progress-section">
            <text class="detail-label">完成进度</text>
            <view class="progress-bar">
              <up-line-progress
                :percentage="toProgressPercentage(item.completionStatus)"
              <up-line-progress
                :percentage="toProgressPercentage(item.completionStatus)"
                activeColor="#2979ff"
                :showText="true"
              ></up-line-progress>
@@ -87,13 +91,13 @@
      </view>
      <up-loadmore :status="loadStatus" />
    </scroll-view>
    <view v-else-if="!loading" class="no-data">
      <up-empty mode="data" text="暂无工单数据"></up-empty>
    </view>
    <!-- 流转卡弹窗 -->
    <up-popup :show="transferCardVisible" mode="center" @close="transferCardVisible = false" round="10">
    <!-- 流转卡弹窗(报工审核记录 - 已禁用) -->
    <!-- <up-popup :show="transferCardVisible" mode="center" @close="transferCardVisible = false" round="10">
      <view class="qr-popup">
        <text class="qr-info" v-if="transferCardRowData">{{ transferCardRowData.workOrderNo || '-' }}</text>
        <view class="transfer-records">
@@ -155,7 +159,7 @@
        </view>
        <up-button text="关闭" @click="transferCardVisible = false" style="margin-top: 20px;"></up-button>
      </view>
    </up-popup>
    </up-popup> -->
    <!-- 报工弹窗 -->
    <up-popup
@@ -178,7 +182,14 @@
          </view>
        </view>
        <scroll-view class="modal-content" scroll-y>
        <scroll-view
          class="modal-content"
          scroll-y
          :scroll-top="scrollTop"
          :enhanced="true"
          :bounces="false"
          :show-scrollbar="true"
        >
          <!-- <view class="report-summary" v-if="endReportRow">
            <view class="summary-left">
              <text class="summary-title">{{ endReportRow.productName || '-' }}</text>
@@ -204,6 +215,9 @@
              </up-form-item>
              <up-form-item label="报废数量">
                <up-input v-model="endReportForm.scrapQty" type="number" placeholder="请输入" />
              </up-form-item>
              <up-form-item label="加放数">
                <up-input v-model="endReportForm.addQty" type="number" placeholder="请输入" />
              </up-form-item>
              <up-form-item label="开始时间" required>
  <up-input
@@ -240,15 +254,6 @@
                  readonly
                  placeholder="请选择(可多选)"
                  @click="openTeamPicker"
                  suffixIcon="arrow-down"
                />
              </up-form-item>
              <up-form-item label="审核人" required>
                <up-input
                  v-model="endReportForm.auditUserName"
                  readonly
                  placeholder="请选择"
                  @click="openAuditPicker"
                  suffixIcon="arrow-down"
                />
              </up-form-item>
@@ -297,14 +302,7 @@
      </view>
    </up-popup>
    <!-- 审核人选择器 -->
    <up-action-sheet
      :show="auditPickerVisible"
      :actions="auditActions"
      title="选择审核人"
      @select="onAuditSelect"
      @close="auditPickerVisible = false"
    />
    <!-- 机台选择器 -->
    <up-action-sheet
      :show="devicePickerVisible"
      :actions="deviceActions"
@@ -349,30 +347,33 @@
const loading = ref(false);
const tableData = ref([]);
const loadStatus = ref('loadmore');
const transferCardVisible = ref(false);
const transferCardRowData = ref(null);
const transferCardLoading = ref(false);
const transferCardRecords = ref([]);
const auditStatusOptions = ref([
  { label: "未审核", value: 0 },
  { label: "通过", value: 1 },
  { label: "不通过", value: 2 },
]);
const transferRecordFields = [
  { label: "报工人员", prop: "teamNames", wide: true },
  { label: "审核人", prop: "auditUserName" },
  { label: "最终审核人", prop: "sureAuditUserName" },
  { label: "工单编号", prop: "workOrderNo" },
  { label: "订单编号", prop: "salesContractNo" },
  { label: "产品名称", prop: "productName" },
  { label: "产品规格型号", prop: "productModelName" },
  { label: "产出数量", prop: "quantity" },
  { label: "报废数量", prop: "scrapQty" },
  { label: "单位", prop: "unit" },
  { label: "审核状态", prop: "auditStatus" },
  { label: "备注信息", prop: "auditOpinion", wide: true },
  { label: "创建时间", prop: "createTime", wide: true },
];
// 报工审核记录相关 - 已禁用
// const transferCardVisible = ref(false);
// const transferCardRowData = ref(null);
// const transferCardLoading = ref(false);
// const transferCardRecords = ref([]);
// const auditStatusOptions = ref([
//   { label: "未审核", value: 0 },
//   { label: "通过", value: 1 },
//   { label: "不通过", value: 2 },
// ]);
// const transferRecordFields = [
//   { label: "报工人员", prop: "teamNames", wide: true },
//   { label: "审核人", prop: "auditUserName" },
//   { label: "最终审核人", prop: "sureAuditUserName" },
//   { label: "工单编号", prop: "workOrderNo" },
//   { label: "订单编号", prop: "salesContractNo" },
//   { label: "产品名称", prop: "productName" },
//   { label: "产品规格型号", prop: "productModelName" },
//   { label: "产出数量", prop: "quantity" },
//   { label: "报废数量", prop: "scrapQty" },
//   { label: "单位", prop: "unit" },
//   { label: "审核状态", prop: "auditStatus" },
//   { label: "备注信息", prop: "auditOpinion", wide: true },
//   { label: "创建时间", prop: "createTime", wide: true },
// ];
const workOrderFilesRef = ref(null);
const startSubmittingId = ref(null);
@@ -383,13 +384,12 @@
  quantity: "",
  replenishQty: "0",
  scrapQty: "0",
  addQty: "0",
  deviceLedgerId: "",
  deviceName: "",
  teamList: [],
  startTime: "",
  endTime: "",
  auditUserId: "",
  auditUserName: "",
  userId: "",
  userName: "",
  workOrderId: "",
@@ -399,8 +399,6 @@
});
const userOptions = ref([]);
const auditPickerVisible = ref(false);
const auditActions = computed(() => userOptions.value.map(u => ({ name: u.name, value: u.value })));
const deviceOptions = ref([]);
const devicePickerVisible = ref(false);
@@ -420,6 +418,7 @@
const endTimePickerVisible = ref(false);
const startTimeValue = ref(Date.now());
const endTimeValue = ref(Date.now());
const scrollTop = ref(0);
const routeOrderRow = ref(null);
@@ -490,15 +489,15 @@
const getList = () => {
  if (loading.value) return;
  loading.value = true;
  const params = { ...searchForm.value, ...page };
  productWorkOrderPage(params).then((res) => {
       loading.value = false;
    const records = res.data.records || [];
    tableData.value = page.current === 1 ? records : [...tableData.value, ...records];
    page.total = res.data.total;
    if (tableData.value.length >= page.total) {
      loadStatus.value = 'nomore';
    } else {
@@ -523,6 +522,14 @@
    tableData.value = data ? [data] : [];
    page.total = tableData.value.length;
    loadStatus.value = 'nomore';
    // 扫码进入后自动打开报工弹窗
    if (data && routeOrderRow.value) {
      // 等待数据渲染完成后打开报工弹窗
      setTimeout(() => {
        openEndReport(data);
      }, 300);
    }
  } catch {
    tableData.value = [];
    showToast("加载工单失败");
@@ -551,72 +558,73 @@
  return Math.round(n);
};
const getAuditStatusLabel = (val) => {
  const target = auditStatusOptions.value.find(item => Number(item.value) === Number(val));
  return target?.label || "未知";
};
// 报工审核记录相关函数 - 已禁用
// const getAuditStatusLabel = (val) => {
//   const target = auditStatusOptions.value.find(item => Number(item.value) === Number(val));
//   return target?.label || "未知";
// };
const getAuditStatusType = (val) => {
  const typeMap = { 0: "info", 1: "success", 2: "danger" };
  return typeMap[Number(val)] || "default";
};
// const getAuditStatusType = (val) => {
//   const typeMap = { 0: "info", 1: "success", 2: "danger" };
//   return typeMap[Number(val)] || "default";
// };
const getTeamNameList = (val) => {
  if (!val) return [];
  return String(val)
    .split(",")
    .map(item => item.trim())
    .filter(Boolean);
};
// const getTeamNameList = (val) => {
//   if (!val) return [];
//   return String(val)
//     .split(",")
//     .map(item => item.trim())
//     .filter(Boolean);
// };
const formatTransferRecordValue = (record, prop) => {
  if (prop === "auditStatus") {
    return getAuditStatusLabel(record?.[prop]);
  }
// const formatTransferRecordValue = (record, prop) => {
//   if (prop === "auditStatus") {
//     return getAuditStatusLabel(record?.[prop]);
//   }
  const value = record?.[prop];
  if (value === null || value === undefined || value === "") {
    return "-";
  }
//   const value = record?.[prop];
//   if (value === null || value === undefined || value === "") {
//     return "-";
//   }
  return String(value);
};
//   return String(value);
// };
const getTransferCardParams = (row) => {
  const params = {
    current: 1,
    size: 100,
  };
// const getTransferCardParams = (row) => {
//   const params = {
//     current: 1,
//     size: 100,
//   };
  if (row?.id != null) {
    params.workOrderId = row.id;
  }
  if (row?.workOrderNo) {
    params.workOrderNo = row.workOrderNo;
  }
  if (row?.productMainId != null) {
    params.productMainId = row.productMainId;
  }
//   if (row?.id != null) {
//     params.workOrderId = row.id;
//   }
//   if (row?.workOrderNo) {
//     params.workOrderNo = row.workOrderNo;
//   }
//   if (row?.productMainId != null) {
//     params.productMainId = row.productMainId;
//   }
  return params;
};
//   return params;
// };
const showTransferCard = async (row) => {
  transferCardRowData.value = row;
  transferCardVisible.value = true;
  transferCardRecords.value = [];
  transferCardLoading.value = true;
// const showTransferCard = async (row) => {
//   transferCardRowData.value = row;
//   transferCardVisible.value = true;
//   transferCardRecords.value = [];
//   transferCardLoading.value = true;
  try {
    const res = await getProductionProductMain(getTransferCardParams(row));
    transferCardRecords.value = res?.data?.records || res?.records || [];
  } catch {
    transferCardRecords.value = [];
    showToast("加载报工审核记录失败");
  } finally {
    transferCardLoading.value = false;
  }
};
//   try {
//     const res = await getProductionProductMain(getTransferCardParams(row));
//     transferCardRecords.value = res?.data?.records || res?.records || [];
//   } catch {
//     transferCardRecords.value = [];
//     showToast("加载报工审核记录失败");
//   } finally {
//     transferCardLoading.value = false;
//   }
// };
const getPendingQty = (row) => {
  const plan = Number(row?.planQuantity) || 0;
@@ -713,6 +721,7 @@
  endReportForm.quantity = String(getPendingQty(row));
  endReportForm.replenishQty = "0";
  endReportForm.scrapQty = "0";
  endReportForm.addQty = "0";
  endReportForm.deviceLedgerId = "";
  endReportForm.deviceName = "";
  endReportForm.teamList = [];
@@ -724,9 +733,6 @@
  endReportForm.reportWork = row.reportWork;
  endReportForm.productProcessRouteItemId = row.productProcessRouteItemId || "";
  endReportForm.productMainId = row.productMainId ?? null;
  endReportForm.auditUserId = "";
  endReportForm.auditUserName = "";
  endReportForm.startTime = row.startProductTime || "";
  endReportForm.endTime = "";
@@ -751,17 +757,6 @@
const closeEndReport = () => {
  endReportVisible.value = false;
  endReportRow.value = null;
};
const openAuditPicker = async () => {
  await ensureUserOptions();
  auditPickerVisible.value = true;
};
const onAuditSelect = (e) => {
  endReportForm.auditUserId = String(e?.value ?? "");
  endReportForm.auditUserName = String(e?.name ?? "");
  auditPickerVisible.value = false;
};
const openDevicePicker = async () => {
@@ -806,10 +801,10 @@
const onEndTimeConfirm = (e) => {
  const end = e.value;
  if (end <= startTimeValue.value) {
    showToast("结束时间必须大于开始时间");
    return;
  }
  // if (end <= startTimeValue.value) {
  //   showToast("结束时间必须大于开始时间");
  //   return;
  // }
  endReportForm.endTime = formatDateTime(end);
  endTimePickerVisible.value = false;
@@ -845,6 +840,13 @@
    showToast("报废数量必须为大于等于0的整数");
    return;
  }
  const addQty = endReportForm.addQty === "" ? 0 : Number(endReportForm.addQty);
  if (!Number.isFinite(addQty) || !Number.isInteger(addQty) || addQty < 0) {
    showToast("加放数必须为大于等于0的整数");
    return;
  }
  if (!endReportForm.startTime) {
  showToast("请选择开始时间");
  return;
@@ -858,15 +860,10 @@
const start = new Date(endReportForm.startTime).getTime();
const end = new Date(endReportForm.endTime).getTime();
if (end <= start) {
  showToast("结束时间必须大于开始时间");
  return;
}
  if (!endReportForm.auditUserId) {
    showToast("请选择审核人");
    return;
  }
// if (end <= start) {
//   showToast("结束时间必须大于开始时间");
//   return;
// }
  if (!endReportForm.deviceLedgerId) {
    showToast("请选择机台");
@@ -882,10 +879,9 @@
      quantity,
      replenishQty,
      scrapQty,
      addQty,
      userId: endReportForm.userId || userStore.id,
      userName: endReportForm.userName || userStore.nickName,
      auditUserId: endReportForm.auditUserId,
      auditUserName: endReportForm.auditUserName,
      deviceLedgerId: endReportForm.deviceLedgerId,
      deviceName: endReportForm.deviceName,
    };
@@ -959,7 +955,7 @@
  gap: 10px;
  padding: 12px 0;
  border-top: 1px solid #f5f5f5;
  :deep(.up-button) {
    margin: 0;
    width: auto;
@@ -995,134 +991,138 @@
  font-size: 26rpx;
  color: #666;
}
.transfer-records {
  width: 100%;
  margin-top: 28rpx;
}
.transfer-records-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 16rpx;
  margin-bottom: 16rpx;
}
.transfer-records-title {
  font-size: 26rpx;
  font-weight: 600;
  color: #222;
}
.transfer-records-count {
  font-size: 22rpx;
  color: #8a8a8a;
}
.transfer-records-loading,
.transfer-records-empty {
  padding: 28rpx 0;
  font-size: 24rpx;
  color: #8a8a8a;
  text-align: center;
}
.transfer-records-list {
  max-height: 500rpx;
  overflow: auto;
}
.transfer-record-item {
  padding: 20rpx 22rpx;
  border-radius: 16rpx;
  background: #f7f8fa;
}
.transfer-record-item + .transfer-record-item {
  margin-top: 16rpx;
}
.transfer-record-top {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 24rpx;
}
.transfer-record-top-main {
  display: flex;
  flex-direction: column;
  gap: 8rpx;
  min-width: 0;
}
.transfer-record-no {
  font-size: 28rpx;
  font-weight: 600;
  color: #222;
  word-break: break-all;
}
.transfer-record-sub {
  font-size: 22rpx;
  color: #8a8a8a;
  word-break: break-all;
}
.transfer-record-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 16rpx;
  margin-top: 18rpx;
}
.transfer-record-cell {
  width: 100%;   // 原来一行两个 → 改成一行一个
}
.transfer-record-cell.is-wide {
  width: 100%;
}
.transfer-record-label {
  display: block;
  margin-bottom: 8rpx;
  font-size: 22rpx;
  color: #8a8a8a;
}
.transfer-record-content {
  min-height: 36rpx;
}
.transfer-record-value {
  display: block;
  font-size: 24rpx;
  color: #222;
  word-break: break-all;
}
.transfer-tag-list {
  display: flex;
  flex-wrap: wrap;
  gap: 10rpx;
}
.transfer-name-tag {
  padding: 6rpx 14rpx;
  border-radius: 999rpx;
  background: #e9f2ff;
  color: #2f6bff;
  font-size: 22rpx;
}
.audit-status-tag {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 40rpx;
  padding: 0 16rpx;
  border-radius: 999rpx;
  font-size: 22rpx;
  box-sizing: border-box;
}
.audit-status-info {
  background: #edf1f5;
  color: #6b7280;
}
.audit-status-success {
  background: #e9f9ef;
  color: #16a34a;
}
.audit-status-danger {
  background: #feeeee;
  color: #dc2626;
}
.audit-status-default {
  background: #f4f4f5;
  color: #606266;
}
/* 报工审核记录相关样式 - 已禁用 */
// .transfer-records {
//   width: 100%;
//   margin-top: 28rpx;
// }
// .transfer-records-header {
//   display: flex;
//   justify-content: space-between;
//   align-items: center;
//   gap: 16rpx;
//   margin-bottom: 16rpx;
// }
// .transfer-records-title {
//   font-size: 26rpx;
//   font-weight: 600;
//   color: #222;
// }
/* 报工审核记录相关样式 - 已禁用 */
// .transfer-records-count {
//   font-size: 22rpx;
//   color: #8a8a8a;
// }
// .transfer-records-loading,
// .transfer-records-empty {
//   padding: 28rpx 0;
//   font-size: 24rpx;
//   color: #8a8a8a;
//   text-align: center;
// }
// .transfer-records-list {
//   max-height: 500rpx;
//   overflow: auto;
// }
// .transfer-record-item {
//   padding: 20rpx 22rpx;
//   border-radius: 16rpx;
//   background: #f7f8fa;
// }
// .transfer-record-item + .transfer-record-item {
//   margin-top: 16rpx;
// }
// .transfer-record-top {
//   display: flex;
//   justify-content: space-between;
//   align-items: flex-start;
//   gap: 24rpx;
// }
// .transfer-record-top-main {
//   display: flex;
//   flex-direction: column;
//   gap: 8rpx;
//   min-width: 0;
// }
// .transfer-record-no {
//   font-size: 28rpx;
//   font-weight: 600;
//   color: #222;
//   word-break: break-all;
// }
// .transfer-record-sub {
//   font-size: 22rpx;
//   color: #8a8a8a;
//   word-break: break-all;
// }
// .transfer-record-grid {
//   display: flex;
//   flex-wrap: wrap;
//   gap: 16rpx;
//   margin-top: 18rpx;
// }
// .transfer-record-cell {
//   width: 100%;
// }
// .transfer-record-cell.is-wide {
//   width: 100%;
// }
// .transfer-record-label {
//   display: block;
//   margin-bottom: 8rpx;
//   font-size: 22rpx;
//   color: #8a8a8a;
// }
// .transfer-record-content {
//   min-height: 36rpx;
// }
// .transfer-record-value {
//   display: block;
//   font-size: 24rpx;
//   color: #222;
//   word-break: break-all;
// }
// .transfer-tag-list {
//   display: flex;
//   flex-wrap: wrap;
//   gap: 10rpx;
// }
// .transfer-name-tag {
//   padding: 6rpx 14rpx;
//   border-radius: 999rpx;
//   background: #e9f2ff;
//   color: #2f6bff;
//   font-size: 22rpx;
// }
// .audit-status-tag {
//   display: inline-flex;
//   align-items: center;
//   justify-content: center;
//   min-height: 40rpx;
//   padding: 0 16rpx;
//   border-radius: 999rpx;
//   font-size: 22rpx;
//   box-sizing: border-box;
// }
// .audit-status-info {
//   background: #edf1f5;
//   color: #6b7280;
// }
// .audit-status-success {
//   background: #e9f9ef;
//   color: #16a34a;
// }
// .audit-status-danger {
//   background: #feeeee;
//   color: #dc2626;
// }
// .audit-status-default {
//   background: #f4f4f5;
//   color: #606266;
// }
.report-modal {
  background: #fff;
@@ -1131,6 +1131,12 @@
  flex-direction: column;
  overflow: hidden;
}
/* #ifdef H5 */
.report-modal {
  max-height: 85vh;
  min-height: 60vh;
}
/* #endif */
.modal-header {
  display: flex;
  justify-content: space-between;
@@ -1164,7 +1170,15 @@
  height: 0;
  padding: 12px 12px 0;
  background: #f7f8fa;
  max-height: 60vh;
  overflow-y: auto;
}
/* #ifdef H5 */
.modal-content {
  max-height: 60vh;
  -webkit-overflow-scrolling: touch;
}
/* #endif */
.modal-footer {
  display: flex;
  gap: 12px;
@@ -1252,13 +1266,13 @@
  display: flex;
  flex-direction: column;
  align-items: center;
  .qr-title {
    font-size: 18px;
    font-weight: bold;
    margin-bottom: 20px;
  }
  .qr-box {
    padding: 20px;
    background-color: #fff;
@@ -1266,7 +1280,7 @@
    border-radius: 8px;
    margin-bottom: 15px;
  }
  .qr-info {
    font-size: 14px;
    color: #666;
src/pages/productionManagement/workOrder/index.vue
@@ -2,7 +2,7 @@
  <view class="work-order">
    <!-- 通用页面头部 -->
    <PageHeader title="生产工单" @back="goBack" />
    <!-- 搜索区域 -->
    <view class="search-section">
      <view class="search-bar">
@@ -15,13 +15,13 @@
            clearable
          />
        </view>
        <view class="filter-button" @click="handleQuery">
          <up-icon name="search" size="24" color="#999"></up-icon>
        </view>
      </view>
    </view>
    <!-- 工单列表 -->
    <scroll-view scroll-y class="ledger-list" v-if="tableData.length > 0" @scrolltolower="loadMore">
      <view v-for="(item, index) in tableData" :key="item.id || index" class="ledger-item">
@@ -36,16 +36,20 @@
            <text class="item-tag tag-type">{{ item.workOrderType }}</text>
          </view>
        </view>
        <up-divider></up-divider>
        <view class="item-details">
          <view class="detail-row">
            <text class="detail-label">产品名称</text>
            <text class="detail-label">成品名称</text>
            <text class="detail-value">{{ item.finalProductModel }}</text>
          </view>
          <view class="detail-row">
            <text class="detail-label">加工品名称</text>
            <text class="detail-value">{{ item.productName }}</text>
          </view>
          <view class="detail-row">
            <text class="detail-label">规格型号</text>
            <text class="detail-label">加工品型号</text>
            <text class="detail-value">{{ item.model }}</text>
          </view>
          <view class="detail-row">
@@ -60,18 +64,18 @@
            <text class="detail-label">需求/完成数量</text>
            <text class="detail-value">{{ item.planQuantity }} / {{ item.completeQuantity }} {{ item.unit }}</text>
          </view>
          <view class="progress-section">
            <text class="detail-label">完成进度</text>
            <view class="progress-bar">
              <up-line-progress
                :percentage="toProgressPercentage(item.completionStatus)"
              <up-line-progress
                :percentage="toProgressPercentage(item.completionStatus)"
                activeColor="#2979ff"
                :showText="true"
              ></up-line-progress>
            </view>
          </view>
          <view class="detail-row">
            <text class="detail-label">计划开始</text>
            <text class="detail-value">{{ item.planStartTime }}</text>
@@ -84,7 +88,7 @@
      </view>
      <up-loadmore :status="loadStatus" />
    </scroll-view>
    <view v-else-if="!loading" class="no-data">
      <up-empty mode="data" text="暂无工单数据"></up-empty>
    </view>
@@ -152,15 +156,15 @@
const getList = () => {
  if (loading.value) return;
  loading.value = true;
  const params = { ...searchForm.value, ...page };
  productWorkOrderPage(params).then((res) => {
    loading.value = false;
    const records = res.data.records || [];
    tableData.value = page.current === 1 ? records : [...tableData.value, ...records];
    page.total = res.data.total;
    if (tableData.value.length >= page.total) {
      loadStatus.value = 'nomore';
    } else {
@@ -232,7 +236,7 @@
  gap: 10px;
  padding: 12px 0;
  border-top: 1px solid #f5f5f5;
  :deep(.up-button) {
    margin: 0;
    width: auto;
@@ -245,13 +249,13 @@
  display: flex;
  flex-direction: column;
  align-items: center;
  .qr-title {
    font-size: 18px;
    font-weight: bold;
    margin-bottom: 20px;
  }
  .qr-box {
    padding: 20px;
    background-color: #fff;
@@ -259,7 +263,7 @@
    border-radius: 8px;
    margin-bottom: 15px;
  }
  .qr-info {
    font-size: 14px;
    color: #666;