张诺
7 小时以前 37a9da0f73da9b69e7d1c8488673520821e90b72
src/views/productionManagement/workOrder/index.vue
@@ -98,12 +98,12 @@
            </div>
            <!-- <div class="info-item">
              <span class="info-label">工单状态</span>
              <span class="info-value">{{
                transferCardRowData.status === 1 ? '待确认' :
                transferCardRowData.status === 2 ? '待生产' :
                transferCardRowData.status === 3 ? '生产中' :
                transferCardRowData.status === 4 ? '已生产' :
                transferCardRowData.status
              <span class="info-value">{{
                transferCardRowData.status === 1 ? '待确认' :
                transferCardRowData.status === 2 ? '待生产' :
                transferCardRowData.status === 3 ? '生产中' :
                transferCardRowData.status === 4 ? '已生产' :
                transferCardRowData.status
              }}</span>
            </div> -->
            <div class="info-item">
@@ -165,7 +165,7 @@
      </div>
    </el-dialog>
    <el-dialog v-model="reportDialogVisible"
               title="报工"
               :title="`报工(机台:${currentReportRowData?.deviceName || '-'})`"
               width="500px">
      <el-form ref="reportFormRef"
               :model="reportForm"
@@ -186,6 +186,15 @@
                    placeholder="请输入本次生产数量"
                    @input="handleQuantityInput" />
        </el-form-item>
        <el-form-item label="补产数量"
                      prop="replenishQty">
          <el-input v-model.number="reportForm.replenishQty"
                    type="number"
                    min="0"
                    step="1"
                    style="width: 300px"
                    placeholder="请输入补产数量" />
        </el-form-item>
        <el-form-item label="报废数量"
                      prop="scrapQty">
          <el-input v-model.number="reportForm.scrapQty"
@@ -197,12 +206,51 @@
                    @input="handleScrapQtyInput" />
        </el-form-item>
        <el-form-item label="班组信息">
          <el-select v-model="reportForm.userId"
          <el-select
              v-model="reportForm.teamList"
              multiple
              filterable
              clearable
              collapse-tags
              value-key="userId"
              placeholder="请选择班组成员"
              style="width: 300px"
          >
            <el-option
                v-for="user in userOptions"
                :key="user.userId"
                :label="user.nickName"
                :value="{ userId: user.userId, userName: user.nickName }"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="开始时间"
                      prop="startTime">
          <el-date-picker v-model="reportForm.startTime"
                          type="datetime"
                          value-format="YYYY-MM-DD HH:mm:ss"
                          format="YYYY-MM-DD HH:mm:ss"
                          style="width: 300px"
                          placeholder="请选择开始时间"
                          clearable />
        </el-form-item>
        <el-form-item label="结束时间"
                      prop="endTime">
          <el-date-picker v-model="reportForm.endTime"
                          type="datetime"
                          value-format="YYYY-MM-DD HH:mm:ss"
                          format="YYYY-MM-DD HH:mm:ss"
                          style="width: 300px"
                          placeholder="请选择结束时间"
                          clearable />
        </el-form-item>
        <el-form-item label="审核人" prop="auditUserId">
          <el-select v-model="reportForm.auditUserId"
                     style="width: 300px"
                     placeholder="请选择班组信息"
                     placeholder="请选择审核人"
                     clearable
                     filterable
                     @change="handleUserChange">
                     @change="handleReviewerIdChange">
            <el-option v-for="user in userOptions"
                       :key="user.userId"
                       :label="user.nickName"
@@ -256,7 +304,7 @@
</template>
<script setup>
  import { onMounted, ref, nextTick } from "vue";
  import { onMounted, ref, nextTick, computed } from "vue";
  import { ElMessageBox, ElMessage } from "element-plus";
  import dayjs from "dayjs";
  import {
@@ -270,6 +318,85 @@
  import { getCurrentInstance, reactive, toRefs } from "vue";
  import FilesDia from "./components/filesDia.vue";
  const { proxy } = getCurrentInstance();
  const currentUserId = ref("");
  const currentUserName = ref("");
  const ensureCurrentUser = async () => {
    if (currentUserId.value) return;
    try {
      const res = await getUserProfile();
      if (res?.code === 200) {
        currentUserId.value = String(res?.data?.userId ?? "");
        currentUserName.value = String(res?.data?.nickName ?? "");
      }
    } catch (err) {
      console.error("获取用户信息失败", err);
    }
  };
  const normalizeArray = (val) => {
    if (val === null || val === undefined) return [];
    if (Array.isArray(val)) return val;
    if (typeof val === "string") {
      return val
        .split(/[,,;;\s]+/g)
        .map((s) => s.trim())
        .filter(Boolean);
    }
    return [val];
  };
  const isCurrentUserReportWorker = (row) => {
    const uid = String(currentUserId.value || "");
    if (!uid) return false;
    if (!row) return false;
    const candidateIds = [
      row.reportUserIds,
      row.reportWorkerIds,
      row.userIds,
      row.userIdList,
      row.reportUserId,
      row.userId,
    ]
      .flatMap((v) => normalizeArray(v))
      .map((v) => String(v))
      .filter(Boolean);
    if (candidateIds.includes(uid)) return true;
    const candidateNames = [
      row.userNames,
      row.reportUserNames,
      row.reportWorkerNames,
      row.userName,
    ]
      .flatMap((v) => normalizeArray(v))
      .map((v) => String(v))
      .filter(Boolean);
    if (currentUserName.value && candidateNames.includes(currentUserName.value)) {
      return true;
    }
    if (Array.isArray(row.reportWorkerList)) {
      const list = row.reportWorkerList
        .map((item) => String(item?.userId ?? item?.id ?? ""))
        .filter(Boolean);
      if (list.includes(uid)) return true;
      const nameList = row.reportWorkerList
        .map((item) => String(item?.userName ?? item?.nickName ?? ""))
        .filter(Boolean);
      if (currentUserName.value && nameList.includes(currentUserName.value)) return true;
    }
    return false;
  };
  const canOperateByReportWorker = computed(() => {
    return (row) => isCurrentUserReportWorker(row);
  });
  const tableColumn = ref([
    {
@@ -305,6 +432,10 @@
      prop: "processName",
    },
    {
      label: "机台名称",
      prop: "deviceName",
    },
    {
      label: "需求数量",
      prop: "planQuantity",
      width: "140",
@@ -319,6 +450,11 @@
      prop: "completionStatus",
      dataType: "slot",
      slot: "completionStatus",
      width: "140",
    },
    {
      label: "报工人",
      prop: "userNames",
      width: "140",
    },
    {
@@ -353,6 +489,10 @@
          clickFun: row => {
            handleEdit(row);
          },
          // 当需求数量等于完成数量的时候,按钮不可点击
          disabled: row =>
            Number(row?.planQuantity) === Number(row?.completeQuantity) ||
            !canOperateByReportWorker.value(row),
        },
        {
          name: "流转卡",
@@ -371,16 +511,19 @@
          clickFun: row => {
            showReportDialog(row);
          },
          disabled: row => row.planQuantity <= 0,
          disabled: row =>
            Number(row?.planQuantity) <= Number(row?.completeQuantity) ||
            row.planQuantity <= 0 ||
            !canOperateByReportWorker.value(row),
        },
        {
          name:"审核",
          color: "#f56c6c",
          clickFun: row => {
            handleAudit(row);
          },
          disabled: row => Number(row?.auditStatus) === 1,
        }
        // {
        //   name:"审核",
        //   color: "#f56c6c",
        //   clickFun: row => {
        //     handleAudit(row);
        //   },
        //   disabled: row => Number(row?.auditStatus) === 1,
        // }
      ],
    },
  ]);
@@ -405,12 +548,15 @@
    planQuantity: 0,
    quantity: null,
    scrapQty: null,
    startTime: "",
    endTime: "",
    userName: "",
    workOrderId: "",
    reportWork: "",
    productProcessRouteItemId: "",
    userId: "",
    productMainId: null,
    teamList:[]
  });
  // 本次生产数量验证规则
@@ -503,6 +649,9 @@
  const reportFormRules = {
    quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }],
    scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
    startTime: [{ required: true, message: "请选择开始时间", trigger: "change" }],
    endTime: [{ required: true, message: "请选择结束时间", trigger: "change" }],
    auditUserId: [{ required: true, message: "请选择审核人", trigger: "change" }],
  };
  // 处理本次生产数量输入,限制必须大于等于1
@@ -677,6 +826,10 @@
  };
  const handleEdit = row => {
    if (!isCurrentUserReportWorker(row)) {
      ElMessage.warning("当前用户不是该工单的报工人,无法编辑");
      return;
    }
    editrow.value = JSON.parse(JSON.stringify(row));
    editDialogVisible.value = true;
  };
@@ -696,30 +849,31 @@
  };
  const showReportDialog = row => {
    if (!isCurrentUserReportWorker(row)) {
      ElMessage.warning("当前用户不是该工单的报工人,无法报工");
      return;
    }
    currentReportRowData.value = row;
    reportForm.planQuantity = row.planQuantity;
    reportForm.planQuantity = row.planQuantity - row.completeQuantity;
    reportForm.quantity =
      row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
    reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
    reportForm.workOrderId = row.id;
    reportForm.reportWork = row.reportWork;
    reportForm.productMainId = row.productMainId;
    reportForm.scrapQty =
      row.scrapQty !== undefined && row.scrapQty !== null ? row.scrapQty : null;
    reportForm.startTime = "";
    reportForm.endTime = "";
    reportForm.replenishQty = 0;
    reportForm.teamList = [];
    reportForm.scrapQty = 0;
    nextTick(() => {
      reportFormRef.value?.clearValidate();
    });
    // 获取当前登录用户信息,设置为默认选中
    getUserProfile()
      .then(res => {
        if (res.code === 200) {
          reportForm.userId = res.data.userId;
          reportForm.userName = res.data.nickName;
        }
      })
      .catch(err => {
        console.error("获取用户信息失败", err);
      });
    ensureCurrentUser().then(() => {
      reportForm.userId = currentUserId.value;
      reportForm.userName = currentUserName.value;
    });
    reportDialogVisible.value = true;
  };
@@ -784,6 +938,20 @@
        return;
      }
      if (!reportForm.startTime || !reportForm.endTime) {
        ElMessageBox.alert("开始时间和结束时间不能为空", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
      if (dayjs(reportForm.startTime).isSame(dayjs(reportForm.endTime)) || dayjs(reportForm.startTime).isAfter(dayjs(reportForm.endTime))) {
        ElMessageBox.alert("开始时间必须小于结束时间", "提示", {
          confirmButtonText: "确定",
        });
        return;
      }
      const submitData = {
        ...reportForm,
        quantity: quantity,
@@ -811,6 +979,11 @@
      .then(res => {
        if (res.code === 200) {
          userOptions.value = res.data || [];
          console.log(userOptions.value)
          userOptions.value.unshift({
            nickName:"任意用户",
            userId:"-1",
          })
        }
      })
      .catch(err => {
@@ -829,8 +1002,20 @@
      reportForm.userName = "";
    }
  };
  // 审核人
  const handleReviewerIdChange = userId => {
    if (userId) {
      const selectedUser = userOptions.value.find(user => user.userId === userId);
      if (selectedUser) {
        reportForm.auditUserName = selectedUser.nickName;
      }
    } else {
      reportForm.auditUserName = "";
    }
  }
  onMounted(() => {
    ensureCurrentUser();
    getList();
    getUserList();
  });