1
yyb
13 小时以前 e1b1a29203de502457d8ede2508ba1fa2c55db47
src/views/productionManagement/workOrderManagement/index.vue
@@ -30,6 +30,15 @@
                       :color="progressColor(toProgressPercentage(row?.completionStatus))"
                       :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" />
        </template>
        <template #todayReportState="{ row }">
          <el-tag :type="todayReportStateTagType(row?.todayReportState)"
                  size="small">
            {{ formatTodayReportState(row?.todayReportState) }}
          </el-tag>
        </template>
        <template #totalReportDurationMinutes="{ row }">
          {{ formatDurationHours(row?.totalReportDurationMinutes) }}
        </template>
      </PIMTable>
    </div>
    
@@ -111,7 +120,7 @@
    
    <!-- 报工弹窗 -->
    <el-dialog v-model="reportDialogVisible"
               title="报工"
               :title="reportDialogTitle"
               width="500px">
      <el-form ref="reportFormRef"
               :model="reportForm"
@@ -122,7 +131,8 @@
                    readonly
                    style="width: 300px" />
        </el-form-item>
        <el-form-item label="本次生产数量"
        <el-form-item v-if="currentReportState !== 1"
                      label="本次生产数量"
                      prop="quantity">
          <el-input v-model.number="reportForm.quantity"
                    type="number"
@@ -132,7 +142,8 @@
                    placeholder="请输入本次生产数量"
                    @input="handleQuantityInput" />
        </el-form-item>
        <el-form-item label="报废数量"
        <el-form-item v-if="currentReportState !== 1"
                      label="报废数量"
                      prop="scrapQty">
          <el-input v-model.number="reportForm.scrapQty"
                    type="number"
@@ -177,6 +188,7 @@
    productWorkOrderPage,
    addProductMain,
    downProductWorkOrder,
    reportState,
  } from "@/api/productionManagement/workOrder.js";
  import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js";
  import QRCode from "qrcode";
@@ -189,6 +201,13 @@
      label: "工单类型",
      prop: "workOrderType",
      width: "80",
    },
    {
      label: "报工状态",
      prop: "todayReportState",
      dataType: "slot",
      slot: "todayReportState",
      width: "110",
    },
    {
      label: "工单编号",
@@ -236,8 +255,15 @@
    },
    {
      label: "计划工时(小时)",
      prop: "plannedWorkHours",
      prop: "salaryQuota",
      width: "140",
    },
    {
      label: "系统核算时间(小时)",
      prop: "totalReportDurationMinutes",
      dataType: "slot",
      slot: "totalReportDurationMinutes",
      width: "160",
    },
    {
      label: "计划开始时间",
@@ -296,6 +322,8 @@
  const transferCardQrUrl = ref("");
  const transferCardRowData = ref(null);
  const reportDialogVisible = ref(false);
  const currentReportState = ref(2);
  const reportDialogTitle = ref("报工");
  const workOrderFilesRef = ref(null);
  const reportFormRef = ref(null);
  const userOptions = ref([]);
@@ -428,6 +456,25 @@
    if (p < 80) return "#409eff";
    return "#67c23a";
  };
  const formatTodayReportState = val => {
    const state = Number(val);
    if (state === 1) return "未开始";
    if (state === 2) return "已开始";
    if (state === 3) return "已结束";
    return "-";
  };
  const formatDurationHours = val => {
    const minutes = Number(val);
    if (!Number.isFinite(minutes) || minutes < 0) return "-";
    return (minutes / 60).toFixed(2);
  };
  const todayReportStateTagType = val => {
    const state = Number(val);
    if (state === 1) return "info";
    if (state === 2) return "success";
    if (state === 3) return "warning";
    return "info";
  };
  // 查询列表
  /** 搜索按钮操作 */
@@ -444,7 +491,7 @@
  
  const getList = () => {
    tableLoading.value = true;
    const params = { ...searchForm.value, ...page };
    const params = { ...searchForm.value, ...page, type: 2 };
    productWorkOrderPage(params)
      .then(res => {
        tableLoading.value = false;
@@ -524,7 +571,7 @@
    workOrderFilesRef.value?.openDialog(row);
  };
  const showReportDialog = row => {
  const showReportDialog = async row => {
    currentReportRowData.value = row;
    reportForm.planQuantity = row.planQuantity;
    reportForm.quantity =
@@ -538,6 +585,23 @@
    nextTick(() => {
      reportFormRef.value?.clearValidate();
    });
    try {
      const reportStateRes = await reportState({
        workOrderId: row.id,
        productProcessRouteItemId: row.productProcessRouteItemId,
      });
      const state = reportStateRes?.data?.state;
      currentReportState.value = state === 1 ? 1 : 2;
      reportDialogTitle.value = currentReportState.value === 1 ? "开始报工" : "结束报工";
      if (currentReportState.value === 1) {
        reportForm.quantity = null;
        reportForm.scrapQty = null;
      }
    } catch (error) {
      currentReportState.value = 2;
      reportDialogTitle.value = "结束报工";
      console.error("获取报工状态失败", error);
    }
    // 获取当前登录用户信息,设置为默认选中
    getUserProfile()
      .then(res => {
@@ -566,48 +630,52 @@
        return;
      }
      // 验证本次生产数量
      if (
        reportForm.quantity === null ||
        reportForm.quantity === undefined ||
        reportForm.quantity === ""
      ) {
        ElMessageBox.alert("请输入本次生产数量", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
      let quantity = 0;
      let scrapQty = 0;
      if (currentReportState.value !== 1) {
        // 验证本次生产数量
        if (
          reportForm.quantity === null ||
          reportForm.quantity === undefined ||
          reportForm.quantity === ""
        ) {
          ElMessageBox.alert("请输入本次生产数量", "提示", {
            confirmButtonText: "确定",
          });
          return;
        }
      const quantity = Number(reportForm.quantity);
        quantity = Number(reportForm.quantity);
      if (isNaN(quantity) || quantity <= 0) {
        ElMessageBox.alert("本次生产数量必须大于0", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
        if (isNaN(quantity) || quantity <= 0) {
          ElMessageBox.alert("本次生产数量必须大于0", "提示", {
            confirmButtonText: "确定",
          });
          return;
        }
      if (quantity > reportForm.planQuantity) {
        ElMessageBox.alert("本次生产数量不能超过待生产数量", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
        if (quantity > reportForm.planQuantity) {
          ElMessageBox.alert("本次生产数量不能超过待生产数量", "提示", {
            confirmButtonText: "确定",
          });
          return;
        }
      // 验证报废数量
      const scrapQty = Number(reportForm.scrapQty);
      if (!isNaN(scrapQty) && scrapQty < 0) {
        ElMessageBox.alert("报废数量不能小于0", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
        // 验证报废数量
        scrapQty = Number(reportForm.scrapQty);
        if (!isNaN(scrapQty) && scrapQty < 0) {
          ElMessageBox.alert("报废数量不能小于0", "提示", {
            confirmButtonText: "确定",
          });
          return;
        }
      if (!isNaN(scrapQty) && scrapQty > quantity) {
        ElMessageBox.alert("报废数量不能大于本次生产数量", "提示", {
          confirmButtonText: "确定",
        });
        return;
        if (!isNaN(scrapQty) && scrapQty > quantity) {
          ElMessageBox.alert("报废数量不能大于本次生产数量", "提示", {
            confirmButtonText: "确定",
          });
          return;
        }
      }
      const params = {
@@ -623,14 +691,13 @@
      addProductMain(params)
        .then(res => {
          proxy.$modal.msgSuccess("报工成功");
          proxy.$modal.msgSuccess(
            currentReportState.value === 1 ? "开始报工成功" : "结束报工成功"
          );
          reportDialogVisible.value = false;
          getList();
        })
        .catch(() => {
          ElMessageBox.alert("报工失败", "提示", {
            confirmButtonText: "确定",
          });
        });
    });
  };
@@ -710,6 +777,7 @@
    text-align: center;
    margin-top: 20px;
  }
</style>
<style  lang="scss">