新疆-新聚
1.主生产计划不再限制本次下发数量不能超过需求数量剩余量。已下发数量达到需求数量后,仍可以继续下发。
2.每一次发货需要可以填写每一次的送货地址
已修改3个文件
155 ■■■■■ 文件已修改
src/views/productionPlan/productionPlan/index.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/deliveryLedger/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 93 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionPlan/productionPlan/index.vue
@@ -135,7 +135,6 @@
        <el-form-item label="生产数量">
          <el-input-number v-model="mergeForm.totalAssignedQuantity"
                           :min="0"
                           :max="sumAssignedQuantity"
                           @change="onBlur"
                           style="width: 100%" />
        </el-form-item>
@@ -435,19 +434,23 @@
          name: "下发",
          type: "text",
          showHide: row => {
            return row.status != 2;
            return true;
          },
          clickFun: row => {
            mergeForm.productName = row.productName || "";
            mergeForm.model = row.model || "";
            mergeForm.totalAssignedQuantity =
              Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
            mergeForm.totalAssignedQuantity = Math.max(
              0,
              Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0)
            );
            mergeForm.planCompleteTime = row.requiredDate || "";
            mergeForm.productId = row.productId || "";
            mergeForm.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
            mergeForm.ids = [row.id];
            sumAssignedQuantity.value =
              Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
            sumAssignedQuantity.value = Math.max(
              0,
              Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0)
            );
            isShowNewModal.value = true;
          },
        },
@@ -735,16 +738,6 @@
  // 判断行是否可选择
  const isSelectable = row => {
    // 如果是已下发状态,禁止勾选
    if (row.status == 2) {
      return false;
    }
    // 计算剩余数量
    const remainingQty = (row.qtyRequired || 0) - (row.quantityIssued || 0);
    // 如果剩余数量小于等于0,禁止选择
    if (remainingQty <= 0) {
      return false;
    }
    // 如果没有选中的行,所有行都可选择
    if (!selectedProductModelId.value) {
      return true;
@@ -766,9 +759,12 @@
    const firstRow = selectedRows.value[0];
    const productName = firstRow.productName || "";
    // 计算总制造数量 (默认qtyRequired的和)
    // 计算总制造数量 (默认qtyRequired剩余数量的和)
    const totalAssignedQuantity = selectedRows.value.reduce((sum, row) => {
      return sum + Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
      return (
        sum +
        Math.max(0, Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0))
      );
    }, 0);
    sumAssignedQuantity.value = totalAssignedQuantity;
    console.log(totalAssignedQuantity);
@@ -779,7 +775,7 @@
    mergeForm.planCompleteTime = firstRow.requiredDate || "";
    mergeForm.productId = firstRow.productId || "";
    mergeForm.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
    mergeForm.ids = selectedRows.value.map(row => row.id);
    mergeForm.ids = [...new Set(selectedRows.value.map(row => row.id))];
    // 打开弹窗
    isShowNewModal.value = true;
@@ -800,12 +796,6 @@
      return;
    }
    console.log(sumAssignedQuantity.value, "sumAssignedQuantity");
    // 验证totalAssignedQuantity不能大于总方数
    if (mergeForm.totalAssignedQuantity > sumAssignedQuantity.value) {
      ElMessage.error("生产数量不能大于当前计算的总值");
      return;
    }
    console.log(mergeForm, "mergeForm");
    const payload = {
src/views/salesManagement/deliveryLedger/index.vue
@@ -107,6 +107,11 @@
          show-overflow-tooltip
        />
        <el-table-column
          label="发货地址"
          prop="shippingAddress"
          show-overflow-tooltip
        />
        <el-table-column
          label="审核状态"
          prop="status"
          align="center"
@@ -202,6 +207,17 @@
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="发货地址:" prop="shippingAddress">
              <el-input
                v-model="form.shippingAddress"
                placeholder="请输入发货地址"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24" v-if="form.type === '货车'">
            <el-form-item label="发货车牌号:" prop="shippingCarNumber">
              <el-input
@@ -289,6 +305,9 @@
          }}</el-descriptions-item>
          <el-descriptions-item label="快递单号" :span="2">{{
            detailRow.expressNumber || "--"
          }}</el-descriptions-item>
          <el-descriptions-item label="发货地址" :span="2">{{
            detailRow.shippingAddress || "--"
          }}</el-descriptions-item>
          <el-descriptions-item label="出库单号" :span="2">{{
            detailRow.outboundBatches || "--"
@@ -388,6 +407,7 @@
    shippingCarNumber: "",
    expressCompany: "",
    expressNumber: "", // 快递单号
    shippingAddress: "",
  },
  rules: {
    salesContractNo: [
@@ -479,6 +499,7 @@
      shippingCarNumber: row.shippingCarNumber ?? "",
      expressCompany: row.expressCompany ?? "",
      expressNumber: row.expressNumber ?? "",
      shippingAddress: row.shippingAddress ?? "",
    };
    deliveryFileList.value = row.storageBlobVOs || [];
  }
@@ -590,6 +611,7 @@
          form.value.type === "快递" ? form.value.expressCompany : "",
        expressNumber:
          form.value.type === "快递" ? form.value.expressNumber : "",
        shippingAddress: form.value.shippingAddress,
        storageBlobDTOs: deliveryFileList.value || [],
      };
      deductStock(payload).then((res) => {
src/views/salesManagement/salesLedger/index.vue
@@ -1066,6 +1066,17 @@
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="发货地址:" prop="shippingAddress">
              <el-input
                v-model="deliveryForm.shippingAddress"
                placeholder="请输入发货地址"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24" v-if="deliveryForm.type === '货车'">
            <el-form-item label="发货车牌号:" prop="shippingCarNumber">
              <el-input
@@ -1337,47 +1348,17 @@
    item?.stockQuantity;
  return quantity ?? 0;
};
const getCurrentDeliveryRowQuantity = () => {
  return Number(currentDeliveryRow.value?.noQuantity || 0);
};
const getDeliveryBatchDeliveryMax = (row) => {
  const productQuantity = getCurrentDeliveryRowQuantity();
  const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0);
  const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce(
    (sum, item) => {
      if (item?.id === row?.id) return sum;
      return sum + Number(item?.deliveryQuantity || 0);
    },
    0
  );
  const remainingProductQuantity = Math.max(
    0,
    productQuantity - otherBatchTotal
  );
  return Math.max(0, Math.min(batchQuantity, remainingProductQuantity));
  return Math.max(0, batchQuantity);
};
const handleDeliveryBatchQuantityChange = (row) => {
  const productQuantity = getCurrentDeliveryRowQuantity();
  const batchQuantity = Number(getDeliveryBatchQuantity(row) || 0);
  const otherBatchTotal = (deliveryForm.value.batchNoList || []).reduce(
    (sum, item) => {
      if (item?.id === row?.id) return sum;
      return sum + Number(item?.deliveryQuantity || 0);
    },
    0
  );
  const remainingProductQuantity = Math.max(
    0,
    productQuantity - otherBatchTotal
  );
  const currentValue = Number(row?.deliveryQuantity || 0);
  if (currentValue > batchQuantity) {
    row.deliveryQuantity = batchQuantity;
    proxy.$modal.msgWarning("发货数量不能大于库存数量");
  } else if (currentValue > remainingProductQuantity) {
    row.deliveryQuantity = remainingProductQuantity;
    proxy.$modal.msgWarning("所有批次发货数量之和不能大于待发货数量");
  }
};
const getSelectedDeliveryBatchRows = () => {
@@ -1422,6 +1403,7 @@
    shippingCarNumber: "",
    expressCompany: "",
    expressNumber: "",
    shippingAddress: "",
    type: "货车", // 货车, 快递
  },
  deliveryRules: {
@@ -2822,27 +2804,8 @@
 * @param row 行数据
 */
const canShip = (row) => {
  // 产品状态必须是充足(approveStatus === 1)
  if (row.approveStatus !== 1) {
    return false;
  }
  // 获取发货状态
  const shippingStatus = row.shippingStatus;
  // 如果已发货,不能再次发货
  if (shippingStatus === "已发货") {
    return false;
  }
  // 发货状态必须是"待发货"、"审批中"、"审核拒绝"或"部分发货"
  const statusStr = shippingStatus ? String(shippingStatus).trim() : "";
  return (
    statusStr === "待发货" ||
    statusStr === "审批中" ||
    statusStr === "审核拒绝" ||
    statusStr === "部分发货"
  );
  // 不再根据销售产品状态或已发货状态限制发货,发货合法性由库存批次和后端校验控制
  return true;
};
// 打开附件弹窗
@@ -2857,14 +2820,6 @@
// 打开发货弹框
const openDeliveryForm = async (row) => {
  // 检查是否可以发货
  if (!canShip(row)) {
    proxy.$modal.msgWarning(
      "只有在产品状态是充足,发货状态是待发货、审批中、审核拒绝或部分发货的时候才可以发货"
    );
    return;
  }
  // 审批中时提示用户已有待审批的发货记录
  const statusStr = row.shippingStatus ? String(row.shippingStatus).trim() : "";
  if (statusStr === "审批中") {
@@ -2879,6 +2834,7 @@
    shippingCarNumber: "",
    expressCompany: "",
    expressNumber: "",
    shippingAddress: "",
    type: "货车",
    batchNo: [],
    batchNoList,
@@ -2894,20 +2850,6 @@
      const selectedBatchRows = getSelectedDeliveryBatchRows();
      if (selectedBatchRows.length === 0) {
        proxy.$modal.msgWarning("请至少填写一个批号的发货数量");
        return;
      }
      const totalDeliveryQuantity = selectedBatchRows.reduce(
        (sum, item) => sum + Number(item.deliveryQuantity || 0),
        0
      );
      const currentRowNoQuantity = Number(
        currentDeliveryRow.value?.noQuantity || 0
      );
      if (
        currentRowNoQuantity > 0 &&
        totalDeliveryQuantity > currentRowNoQuantity
      ) {
        proxy.$modal.msgWarning("批号发货总数不能超过待发货数量");
        return;
      }
      // 保存当前展开的行ID,以便发货后重新加载子表格数据
@@ -2933,6 +2875,7 @@
          deliveryForm.value.type === "快递"
            ? deliveryForm.value.expressNumber
            : "",
        shippingAddress: deliveryForm.value.shippingAddress,
        storageBlobDTOs: deliveryFileList.value || [],
        batchNo: deliveryForm.value.batchNo,
        batchNoDetailList: selectedBatchRows.map((item) => ({
@@ -2967,6 +2910,8 @@
            });
          }
        });
      }).catch(() => {
        // 后端库存不足等错误已由 request 拦截器统一提示
      });
    }
  });