1
647556386
3 天以前 3c506974e141024ed26a0c348d896c70ea42891b
ÏîÄ¿´úÂë/WIDESEA_WMSClient/src/extension/outbound/extend/outOrderDetail.vue
@@ -60,7 +60,7 @@
      <div class="box-table" style="margin-top: 1%">
        <el-table
          ref="singleTable"
          :data="tableData"
          :data="groupedTableData"
          style="width: 100%; height: 100%"
          highlight-current-row
          @current-change="handleCurrentChange"
@@ -77,38 +77,127 @@
            align="center"
          ></el-table-column>
          <el-table-column
            v-for="(item, index) in tableColumns.filter((x) => !x.hidden)"
            :key="index"
            :prop="item.prop"
            :label="item.title"
            :width="item.width"
            prop="materielCode"
            label="物料编号"
            width="120"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="materielName"
            label="物料名称"
            width="150"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="batchNo"
            label="批次号"
            width="90"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="supplyCode"
            label="供应商编号"
            width="90"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="orderQuantity"
            label="单据数量"
            width="90"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="lockQuantity"
            label="锁定数量"
            width="90"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="overOutQuantity"
            label="已出数量"
            width="90"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="moveQty"
            label="挪料数量"
            width="90"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="unit"
            label="单位"
            width="80"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="orderDetailStatus"
            label="订单明细状态"
            width="90"
            align="center"
          >
            <template #default="scoped">
              <div v-if="item.type == 'icon'">
                <el-tooltip
                  class="item"
                  effect="dark"
                  :content="item.title"
                  placement="bottom"
              <el-tag size="small">
                {{ getDictionaryForGroup(scoped.row) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column
            prop="assignStock"
            label="指定库存"
            width="90"
            align="center"
            :hidden="mainBusinessType !== '22'"
          >
            <template #default="scoped">
              <el-tooltip
                class="item"
                effect="dark"
                content="指定库存"
                placement="bottom"
              >
                <el-link
                  type="primary"
                  :disabled="getButtonEnable('assignStock', scoped.row)"
                  @click="handleAssignStock(scoped.row)"
                >
                  <el-link
                    type="primary"
                    :disabled="getButtonEnable(item.prop, scoped.row)"
                    @click="tableButtonClick(scoped.row, item)"
                  >
                    <i :class="item.icon" style="font-size: 22px"></i>
                  </el-link>
                </el-tooltip>
              </div>
              <div v-else-if="item.type == 'tag'">
                <el-tag size="small">
                  {{ getDictionary(scoped.row, item) }}
                </el-tag>
              </div>
              <div v-else>
                {{ scoped.row[item.prop] }}
              </div>
                  <i class="el-icon-s-grid" style="font-size: 22px"></i>
                </el-link>
              </el-tooltip>
            </template>
          </el-table-column>
          <el-table-column
            prop="viewDetail"
            label="出库详细"
            width="90"
            align="center"
          >
            <template #default="scoped">
              <el-tooltip
                class="item"
                effect="dark"
                content="查看出库详细"
                placement="bottom"
              >
                <el-link
                  type="primary"
                  @click="handleViewDetail(scoped.row)"
                >
                  <i class="el-icon-s-operation" style="font-size: 22px"></i>
                </el-link>
              </el-tooltip>
            </template>
          </el-table-column>
          <el-table-column
            prop="detailCount"
            label="明细数量"
            width="80"
            align="center"
          >
            <template #default="scoped">
              <el-tag type="info" size="small">
                {{ scoped.row.detailCount }}
              </el-tag>
            </template>
          </el-table-column>
        </el-table>
@@ -151,129 +240,9 @@
      flag: false,
      currentRow: null,
      selection: [],
      tableData: [],
      mainBusinessType: null, // æ–°å¢žï¼šå­˜å‚¨ä¸»å•据的businessType
      tableColumns: [
        {
          prop: "id",
          title: "Id",
          type: "int",
          width: 90,
          hidden: true,
        },
        {
          prop: "orderId",
          title: "出库单主键",
          type: "string",
          width: 90,
          hidden: true,
        },
        {
          prop: "materielCode",
          title: "物料编号",
          type: "string",
          width: 120,
        },
        {
          prop: "materielName",
          title: "物料名称",
          type: "string",
          width: 150,
        },
        {
          prop: "batchNo",
          title: "批次号",
          type: "string",
          width: 90,
        },
        {
          prop: "supplyCode",
          title: "供应商编号",
          type: "string",
          width: 90,
        },
        {
          prop: "orderQuantity",
          title: "单据数量",
          type: "string",
          width: 90,
        },
        {
          prop: "lockQuantity",
          title: "锁定数量",
          type: "int",
          width: 90,
        },
        {
          prop: "overOutQuantity",
          title: "已出数量",
          type: "string",
          width: 90,
        },
        {
          prop: "overOutQuantity",
          title: "挪料数量",
          type: "string",
          width: 90,
        },
        {
          prop: "unit",
          title: "单位",
          type: "string",
          width: 80,
        },
        {
          prop: "orderDetailStatus",
          title: "订单明细状态",
          type: "tag",
          width: 90,
          bindKey: "orderDetailStatusEnum",
        },
        {
          prop: "assignStock",
          title: "指定库存",
          type: "icon",
          width: 90,
          hidden: true, // é»˜è®¤éšè—
          icon: "el-icon-s-grid",
        },
        {
          prop: "viewDetail",
          title: "出库详细",
          type: "icon",
          width: 90,
          icon: "el-icon-s-operation",
        },
        {
          prop: "creater",
          title: "创建人",
          type: "string",
          width: 90,
        },
        {
          prop: "createDate",
          title: "创建时间",
          type: "datetime",
          width: 160,
        },
        {
          prop: "modifier",
          title: "修改人",
          type: "string",
          width: 100,
        },
        {
          prop: "modifyDate",
          title: "修改时间",
          type: "datetime",
          width: 160,
        },
        {
          prop: "remark",
          title: "备注",
          type: "string",
        },
      ],
      tableData: [], // åŽŸå§‹æ•°æ®
      groupedTableData: [], // åˆ†ç»„后的数据
      mainBusinessType: null, // å­˜å‚¨ä¸»å•据的businessType
      paginations: {
        sort: "id",
        order: "desc",
@@ -317,15 +286,50 @@
    };
  },
  methods: {
    toggleAssignStockColumn() {
      const assignStockColumn = this.tableColumns.find(
        (item) => item.prop === "assignStock"
      );
      if (assignStockColumn) {
        // businessType为22时显示,否则隐藏
        assignStockColumn.hidden = this.mainBusinessType !=='22';
      }
    // æ ¹æ®ç‰©æ–™ç¼–号、批次、供应商分组数据
    groupDataByMaterial() {
      const groups = {};
      this.tableData.forEach(item => {
        // æž„建分组键,批次和供应商可以为空
        const groupKey = `${item.materielCode}_${item.batchNo || ''}_${item.supplyCode || ''}`;
        if (!groups[groupKey]) {
          // åˆ›å»ºæ–°åˆ†ç»„
          groups[groupKey] = {
            materielCode: item.materielCode,
            materielName: item.materielName,
            batchNo: item.batchNo || '-',
            supplyCode: item.supplyCode || '-',
            orderQuantity: 0,
            lockQuantity: 0,
            overOutQuantity: 0,
            moveQty: 0,
            unit: item.unit,
            orderDetailStatus: item.orderDetailStatus,
            detailCount: 0,
            originalDetails: [] // ä¿å­˜åŽŸå§‹æ˜Žç»†æ•°æ®
          };
        }
        // ç´¯åŠ æ•°é‡
        groups[groupKey].orderQuantity += item.orderQuantity || 0;
        groups[groupKey].lockQuantity += item.lockQuantity || 0;
        groups[groupKey].overOutQuantity += item.overOutQuantity || 0;
        groups[groupKey].moveQty += item.moveQty || 0;
        groups[groupKey].detailCount += 1;
        groups[groupKey].originalDetails.push(item);
        // å¦‚果状态不同,可以用第一个状态或特殊处理
        // è¿™é‡Œä½¿ç”¨ç¬¬ä¸€ä¸ªæ˜Žç»†çš„状态
      });
      // è½¬æ¢ä¸ºæ•°ç»„
      this.groupedTableData = Object.values(groups);
      console.log('分组后的数据:', this.groupedTableData);
    },
    open(row) {
      this.row = row;
      this.showDetialBox = true;
@@ -334,8 +338,8 @@
      this.mainBusinessType = row.businessType;
      this.getDictionaryData();
      this.getData();
      this.toggleAssignStockColumn();
    },
    getData() {
      var wheres = [{ name: "orderId", value: this.row.id }];
      var param = {
@@ -349,25 +353,66 @@
        .post("api/OutboundOrderDetail/GetPageData", param, "查询中")
        .then((x) => {
          this.tableData = x.rows;
          this.toggleAssignStockColumn(); // æ•°æ®åŠ è½½åŽé‡æ–°ç¡®è®¤åˆ—æ˜¾éš
          // åˆ†ç»„数据
          this.groupDataByMaterial();
        });
    },
    tableButtonClick(row, column) {
      if (column.prop == "assignStock") {
        this.$refs.child.open(row);
      } else if (column.prop == "NoStockOut") {
        this.$refs.NoStockOut.open(row);
    // é‡ç‚¹ä¿®æ”¹ï¼šå¤„理指定库存点击事件 - ä¼ é€’完整的分组明细信息
    handleAssignStock(row) {
      // ä¼ é€’完整的分组明细数据(包含所有原始明细ID和物料信息)
      if (row.originalDetails && row.originalDetails.length > 0) {
        this.$refs.child.open({
          // ç‰©æ–™åŸºæœ¬ä¿¡æ¯ï¼ˆå–第一个明细的信息)
          materielCode: row.originalDetails[0].materielCode,
          materielName: row.originalDetails[0].materielName,
          // åˆ†ç»„后的总需求数量
          qty: row.orderQuantity,
          // ä¸»å•据编号
          upperOrderNo: this.row.upperOrderNo,
          // å…³é”®ï¼šå½“前分组的所有明细ID集合
          detailIds: row.originalDetails.map(detail => detail.id),
          // ä¸»å•据ID
          mainOrderId: this.row.id,
          // å®Œæ•´åˆ†ç»„行信息(备用)
          groupRow: row
        });
      } else {
        this.$refs.selectedStock.open(row);
        ElMessage.warning("该分组没有明细数据,无法指定库存");
      }
    },
    handleViewDetail(row) {
      // æŸ¥çœ‹åˆ†ç»„明细的详细信息
      if (row.originalDetails && row.originalDetails.length > 0) {
        // è¿™é‡Œå¯ä»¥æ‰“开一个新的弹窗显示所有明细,或者使用第一个明细
        this.$refs.selectedStock.open(row.originalDetails[0]);
      }
    },
    lockstocks() {
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
      }
      var keys = this.selection.map((item) => item.id);
      // èŽ·å–æ‰€æœ‰é€‰ä¸­åˆ†ç»„çš„åŽŸå§‹æ˜Žç»†ID
      const detailIds = [];
      this.selection.forEach(group => {
        if (group.originalDetails && group.originalDetails.length > 0) {
          group.originalDetails.forEach(detail => {
            if (detail.id) {
              detailIds.push(detail.id);
            }
          });
        }
      });
      if (detailIds.length === 0) {
        return this.$message.error("没有找到可锁定的明细");
      }
      this.http
        .post("api/OutboundOrderDetail/LockOutboundStocks", keys, "数据处理中")
        .post("api/OutboundOrderDetail/LockOutboundStocks", detailIds, "数据处理中")
        .then((x) => {
          if (!x.status) return this.$message.error(x.message);
          this.$message.success("操作成功");
@@ -377,22 +422,42 @@
          });
        });
    },
    handleOpenPicking() {
      this.$router.push({
        path: "/outbound/picking",
        query: { orderId: this.row.id, orderNo: this.row.orderNo },
      });
    },
    handleOpenBatchPicking() {
      this.$router.push({
        path: "/outbound/batchpicking",
        query: { orderId: this.row.id, orderNo: this.row.orderNo },
      });
    },
    outbound() {
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
      }
      // èŽ·å–æ‰€æœ‰é€‰ä¸­åˆ†ç»„çš„åŽŸå§‹æ˜Žç»†ID
      const detailIds = [];
      this.selection.forEach(group => {
        if (group.originalDetails && group.originalDetails.length > 0) {
          group.originalDetails.forEach(detail => {
            if (detail.id) {
              detailIds.push(detail.id);
            }
          });
        }
      });
      if (detailIds.length === 0) {
        return this.$message.error("没有找到可出库的明细");
      }
      const platformOptions = [
        { label: "站台2", value: "2-1" },
        { label: "站台3", value: "3-1" },
@@ -448,7 +513,7 @@
                  },
                }, [
                  h(ElSelect, {
                    placeholder: "请选择出库站台(3-12)",
                    placeholder: "请选择出库站台",
                    modelValue: formData.selectedPlatform,
                    "onUpdate:modelValue": (val) => {
                      formData.selectedPlatform = val;
@@ -492,9 +557,8 @@
                        return;
                      }
                      const keys = this.selection.map((item) => item.id);
                      const requestParams = {
                        taskIds: keys,
                        taskIds: detailIds,
                        outboundPlatform: formData.selectedPlatform,
                      };
@@ -531,6 +595,7 @@
      vnode.appContext = this.$.appContext;
      render(vnode, mountNode);
    },
    outboundbatch() {
      if (this.selection.length === 0) {
        return this.$message.error("请选择单据明细");
@@ -538,6 +603,16 @@
      if (this.selection.length > 1) {
        return this.$message.error("只能选择一条单据明细进行分批出库");
      }
      const selectedGroup = this.selection[0];
      if (!selectedGroup.originalDetails || selectedGroup.originalDetails.length === 0) {
        return this.$message.error("没有找到明细数据");
      }
      // åˆ†æ‰¹å‡ºåº“通常针对单个明细
      // è¿™é‡Œä½¿ç”¨ç¬¬ä¸€ä¸ªæ˜Žç»†
      const selectedDetail = selectedGroup.originalDetails[0];
      const platformOptions = [
        { label: "站台2", value: "2-1" },
        { label: "站台3", value: "3-1" },
@@ -608,7 +683,7 @@
                  },
                }, [
                  h(ElSelect, {
                    placeholder: "请选择出库站台(3-12)",
                    placeholder: "请选择出库站台",
                    modelValue: formData.selectedPlatform,
                    "onUpdate:modelValue": (val) => {
                      formData.selectedPlatform = val;
@@ -646,6 +721,7 @@
                    step: "0.01",
                    precision: 2,
                    min: 0.01,
                    max: selectedDetail.orderQuantity - selectedDetail.overOutQuantity - selectedDetail.lockQuantity - selectedDetail.moveQty,
                  }),
                ]),
                h("div", {
@@ -677,9 +753,8 @@
                        return;
                      }
                      const keys = this.selection.map((item) => item.id);
                      const requestParams = {
                        orderDetailId: keys[0],
                        orderDetailId: selectedDetail.id,
                        outboundPlatform: formData.selectedPlatform,
                        batchQuantity: formData.outboundDecimal,
                      };
@@ -714,52 +789,52 @@
        }
      );
      vnode.appContext = this.$.appContext;
      vnode.appContext = this.$appContext;
      render(vnode, mountNode);
    },
    setCurrent(row) {
      this.$refs.singleTable.setCurrentRow(row);
    },
    handleCurrentChange(val) {
      this.currentRow = val;
    },
    getButtonEnable(propName, row) {
      if (propName == "assignStock") {
        if (
          row.orderDetailStatus !== 0 &&
          row.orderDetailStatus !== 60 &&
          row.orderDetailStatus !== 70 &&
          row.orderDetailStatus !== 80
          row.orderDetailStatus !== 70
        ) {
          return true;
        } else {
          return false;
        } else {
          return true;
        }
      }
      return false;
    },
    parentCall(fun) {
      if (typeof fun != "function") {
        return console.log("扩展组件需要传入一个回调方法才能获取父级Vue对象");
      }
      fun(this);
    },
    handleRowClick(row) {
      this.$refs.singleTable.toggleRowSelection(row);
    },
    handleSelectionChange(val) {
      this.selection = val;
    },
    getDictionaryData() {
      if (this.dictionaryList) {
        return;
      }
      var param = [];
      this.tableColumns.forEach((x) => {
        if (x.type == "tag" && x.bindKey != "") {
          param.push(x.bindKey);
        }
      });
      var param = ["orderDetailStatusEnum"];
      this.http
        .post("api/Sys_Dictionary/GetVueDictionary", param, "查询中")
        .then((x) => {
@@ -768,21 +843,22 @@
          }
        });
    },
    getDictionary(row, column) {
    getDictionaryForGroup(row) {
      if (this.dictionaryList) {
        var item = this.dictionaryList.find((x) => x.dicNo == column.bindKey);
        var item = this.dictionaryList.find((x) => x.dicNo == "orderDetailStatusEnum");
        if (item) {
          var dicItem = item.data.find((x) => x.key == row[column.prop]);
          var dicItem = item.data.find((x) => x.key == row.orderDetailStatus);
          if (dicItem) {
            return dicItem.value;
          } else {
            return row[column.prop];
            return row.orderDetailStatus;
          }
        } else {
          return row[column.prop];
          return row.orderDetailStatus;
        }
      }
      return row[column.prop];
      return row.orderDetailStatus;
    },
  },
};