湟水峡
1.项目利润页面加上采购合同号字段。项目名称、增值税字段去掉
2.生产订单删掉404接口
已修改3个文件
250 ■■■■■ 文件已修改
src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrder/index.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/reportAnalysis/projectProfit/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
@@ -84,7 +84,6 @@
      v-model="materialProductDialogVisible"
      @confirm="handleMaterialProductConfirm"
      single
      request-url="/stockInventory/rawMaterials"
    />
  </div>
</template>
src/views/productionManagement/workOrder/index.vue
@@ -219,6 +219,47 @@
      </template>
    </el-dialog>
    <FilesDia ref="workOrderFilesRef" />
        <el-dialog v-model="allocationDialogVisible"
                 title="工单分配"
                 width="500px">
            <el-form :model="allocationForm"
                   :rules="allocationFormRules"
                   ref="allocationFormRef"
                   label-width="120px">
                <el-form-item label="工单编号">
                    <el-input v-model="allocationForm.workOrderNo"
                            readonly
                            disabled
                            style="width: 300px" />
                </el-form-item>
                <el-form-item label="产品名称">
                    <el-input v-model="allocationForm.productName"
                            readonly
                            disabled
                            style="width: 300px" />
                </el-form-item>
                <el-form-item label="分配人员" prop="userId">
                    <el-select v-model="allocationForm.userId"
                             style="width: 300px"
                             placeholder="请选择班组信息"
                             clearable
                             filterable
                             @change="handleAllocationUserChange">
                        <el-option v-for="user in userOptions"
                                 :key="user.userId"
                                 :label="user.nickName"
                                 :value="user.userId" />
                    </el-select>
                </el-form-item>
            </el-form>
            <template #footer>
        <span class="dialog-footer">
          <el-button type="primary"
                     @click="handleAllocationSubmit">确定</el-button>
          <el-button @click="allocationDialogVisible = false">取消</el-button>
        </span>
            </template>
        </el-dialog>
  </div>
</template>
@@ -237,6 +278,8 @@
  import { getCurrentInstance, reactive, toRefs } from "vue";
  import FilesDia from "./components/filesDia.vue";
  const { proxy } = getCurrentInstance();
  const allocationFormRef = ref(null);
  const tableColumn = ref([
    {
@@ -338,11 +381,25 @@
          clickFun: row => {
            showReportDialog(row);
          },
          disabled: row => row.planQuantity <= 0 || !canReportByUser(row),
        },
        {
          name: "分配",
          clickFun: row => {
            allocationDialog(row);
          },
          disabled: row => row.planQuantity <= 0,
        },
      ],
    },
  ]);
  // 计算属性:待生产数量 = 计划 - 已完成
  const waitProduceQuantity = computed(() => {
    const plan = Number(currentReportRowData.value?.planQuantity) || 0;
    const complete = Number(currentReportRowData.value?.completeQuantity) || 0;
    return plan - complete;
  });
  const tableData = ref([]);
  const tableLoading = ref(false);
  const qrCodeUrl = ref("");
@@ -353,13 +410,11 @@
  const transferCardQrUrl = ref("");
  const transferCardRowData = ref(null);
  const reportDialogVisible = ref(false);
  const workOrderFilesRef = ref(null);
  const reportFormRef = ref(null);
  const allocationDialogVisible = ref(false);
  const userOptions = ref([]);
  const reportForm = reactive({
    planQuantity: 0,
    quantity: null,
    scrapQty: null,
    quantity: 0,
    userName: "",
    workOrderId: "",
    reportWork: "",
@@ -367,97 +422,18 @@
    userId: "",
    productMainId: null,
  });
  // 本次生产数量验证规则
  const validateQuantity = (rule, value, callback) => {
    if (value === null || value === undefined || value === "") {
      callback(new Error("请输入本次生产数量"));
      return;
    }
    const num = Number(value);
    // 整数且大于等于1
    if (isNaN(num) || !Number.isInteger(num) || num < 1) {
      callback(new Error("本次生产数量必须大于等于1"));
      return;
    }
    callback();
  };
  // 报废数量验证规则
  const validateScrapQty = (rule, value, callback) => {
    if (value === null || value === undefined || value === "") {
      callback();
      return;
    }
    const num = Number(value);
    // 整数且大于等于0
    if (isNaN(num) || !Number.isInteger(num) || num < 0) {
      callback(new Error("报废数量必须大于等于0"));
      return;
    }
    callback();
  };
  // 验证规则
  const reportFormRules = {
    quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }],
    scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
  };
  // 处理本次生产数量输入,限制必须大于等于1
  const handleQuantityInput = value => {
    if (value === "" || value === null || value === undefined) {
      reportForm.quantity = null;
      return;
    }
    const num = Number(value);
    if (isNaN(num)) {
      return;
    }
    // 如果小于1,清除
    if (num < 1) {
      reportForm.quantity = null;
      return;
    }
    // 如果是小数取整数部分
    if (!Number.isInteger(num)) {
      const intValue = Math.floor(num);
      // 如果取整后小于1,清除
      if (intValue < 1) {
        reportForm.quantity = null;
        return;
      }
      reportForm.quantity = intValue;
      return;
    }
    reportForm.quantity = num;
  };
  // 处理报废数量
  const handleScrapQtyInput = value => {
    if (value === "" || value === null || value === undefined) {
      reportForm.scrapQty = null;
      return;
    }
    const num = Number(value);
    // 如果是NaN,保持原值
    if (isNaN(num)) {
      return;
    }
    // 如果是负数,清除输入
    if (num < 0) {
      reportForm.scrapQty = null;
      return;
    }
    // 如果是小数,取整数部分
    if (!Number.isInteger(num)) {
      reportForm.scrapQty = Math.floor(num);
      return;
    }
    // 有效的非负整数(包括0)
    reportForm.scrapQty = num;
  };
  const allocationForm = reactive({
    workOrderId: "",
    workOrderNo: "",
    productName: "",
    currentReportWork: "",
    nickName: "",
    userId: "",
  });
  const currentAllocationRowData = ref(null);
  const currentReportRowData = ref(null);
  const currentUserId = ref("");
  const currentUserName = ref("");
  const page = reactive({
    current: 1,
    size: 100,
@@ -485,6 +461,12 @@
    return "#67c23a";
  };
  let editrow = ref(null);
  const allocationFormRules = {
    userId: [
      { required: true, message: '请选择分配人员', trigger: 'change' }
    ]
  }
  // 查询列表
  /** 搜索按钮操作 */
@@ -594,7 +576,81 @@
      });
  };
  // 分配功能
  const allocationDialog = row => {
    currentAllocationRowData.value = row;
    allocationForm.workOrderId = row.id;
    allocationForm.workOrderNo = row.workOrderNo || "";
    allocationForm.productName = row.productName || "";
    allocationForm.currentReportWork = row.reportWork || "";
    allocationForm.nickName =row.nickName || "";
    allocationForm.userId =row.userId ||  "";
    allocationDialogVisible.value = true;
  };
  const canReportByUser = row => {
    if (!row || !row.userId) {
      return true;
    }
    if (!currentUserId.value) {
      return false;
    }
    return String(row.userId) === String(currentUserId.value);
  };
  const handleAllocationUserChange = userId => {
    if (!userId) {
      allocationForm.nickName = "";
      return;
    }
    const selectedUser = userOptions.value.find(user => user.userId === userId);
    allocationForm.nickName = selectedUser ? selectedUser.nickName : "";
  };
  const handleAllocationSubmit = async () => {
    if (!allocationFormRef.value) {
      return;
    }
    try {
      await allocationFormRef.value.validate();
    } catch {
      return;
    }
    if (!currentAllocationRowData.value) {
      return;
    }
    const payload = {
      ...currentAllocationRowData.value,
      id: allocationForm.workOrderId,
      userId: allocationForm.userId,
      nickName: allocationForm.nickName,
    };
    try {
      await updateProductWorkOrder(payload);
      proxy.$modal.msgSuccess("分配成功");
      allocationDialogVisible.value = false;
      getList();
    } catch (err) {
      const apiMsg =
        err?.response?.data?.msg ||
        err?.msg ||
        (err?.userId && Array.isArray(err.userId)
          ? (err.userId[0]?.message || err.userId[0] || "")
          : "");
      ElMessageBox.alert(apiMsg || "分配失败", "提示", {
        confirmButtonText: "确定",
      });
    }
  };
  const showReportDialog = row => {
    if (!canReportByUser(row)) {
      ElMessageBox.alert("该工单已分配给其他班组,当前用户无报工权限", "提示", {
        confirmButtonText: "确定",
      });
      return;
    }
    currentReportRowData.value = row;
        reportForm.planQuantity = row.planQuantity - row.completeQuantity;
    reportForm.quantity =
src/views/reportAnalysis/projectProfit/index.vue
@@ -62,6 +62,11 @@
            prop: "customerContractNo",
        },
        {
            label: "采购合同号",
            align: "center",
            prop: "purchaseContractNumber",
        },
        {
            label: "客户名称",
            align: "center",
            prop: "customerName",