@gct-paas/word 0.1.74-beta.44 → 0.1.74-beta.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @gct-paas/word v0.1.74-beta.44 */
1
+ /*! @gct-paas/word v0.1.74-beta.46 */
2
2
  import { Fragment, Suspense, Teleport, Transition, TransitionGroup, cloneVNode, computed, createApp, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, effectScope, getCurrentInstance, getCurrentScope, guardReactiveProps, h, inject, isRef, isVNode, markRaw, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeMount, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, provide, reactive, readonly, ref, render, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toHandlers, toRaw, toRef, toValue, unref, useAttrs, useCssVars, useModel, useSlots, vModelRadio, vModelText, vShow, watch, watchEffect, withCtx, withDirectives, withKeys, withModifiers } from "vue";
3
3
  import St, { PopperWrapper } from "floating-vue";
4
4
  import VueKonva from "vue-konva";
@@ -99109,10 +99109,10 @@ var init_selectStrategy = __esmMin((() => {
99109
99109
  [FIELD_TYPE.ROUTING_OPERATION]: {
99110
99110
  columnsKey: "route-operation",
99111
99111
  fetcher: "ref",
99112
- buildQuery({ keyword, isMockReport }) {
99112
+ buildQuery({ keyword, isMockReport, routingOperationId }) {
99113
99113
  return buildLikeQuery(["name_", "code_"], keyword, {
99114
- type_: "NODE_SPEC",
99115
- ...isMockReport ? {} : { operating_state_: true }
99114
+ ref_master_id_: routingOperationId,
99115
+ type_: "NODE_SPEC"
99116
99116
  });
99117
99117
  },
99118
99118
  transform: transformLotData
@@ -125184,6 +125184,52 @@ async function getReinspectionDate(params) {
125184
125184
  if (!parsed.isValid()) return;
125185
125185
  return parsed.format("YYYY-MM-DD");
125186
125186
  }
125187
+ /** 物料+批次查复检日期;缺任一参数不查;无日期放过;小于当天则 throw */
125188
+ async function assertReinspectionDate(opts) {
125189
+ if (!opts.product_id_ || !opts.material_no_ && !opts.material_no_id_) return;
125190
+ const date = await getReinspectionDate({
125191
+ product_id_: opts.product_id_,
125192
+ material_no_: opts.material_no_,
125193
+ material_no_id_: opts.material_no_id_
125194
+ });
125195
+ if (!date) return;
125196
+ if (dayjs(date).isBefore(dayjs(), "day")) throw new Error("已超物料复检日期,该物料不可用");
125197
+ }
125198
+ function pickProductBaseId(option) {
125199
+ var _option$_OPCT;
125200
+ if (!option) return void 0;
125201
+ const nested = (_option$_OPCT = option._OPCT) === null || _option$_OPCT === void 0 || (_option$_OPCT = _option$_OPCT.product_id_) === null || _option$_OPCT === void 0 ? void 0 : _option$_OPCT.base_id_;
125202
+ const raw = option.product_id_base_id_ ?? nested;
125203
+ if (isBlank$1(raw)) return void 0;
125204
+ return String(raw);
125205
+ }
125206
+ async function fetchProductBaseId(versionId) {
125207
+ try {
125208
+ var _res$data2;
125209
+ const res = await postApi({
125210
+ modelCategory: "entity",
125211
+ modelKey: "em_product",
125212
+ bsKey: "getOne"
125213
+ }, {}, { query: { id_: versionId } });
125214
+ const record = (res === null || res === void 0 || (_res$data2 = res.data) === null || _res$data2 === void 0 ? void 0 : _res$data2[0]) ?? (res === null || res === void 0 ? void 0 : res.data);
125215
+ const baseId = record === null || record === void 0 ? void 0 : record.base_id_;
125216
+ return isBlank$1(baseId) ? void 0 : String(baseId);
125217
+ } catch {
125218
+ return;
125219
+ }
125220
+ }
125221
+ /** 主表物料 RDO 引用:`baseId:versionId`。无法拼出则返回 undefined,禁止写裸版本 id。 */
125222
+ async function resolveProductRdoRef(raw, option) {
125223
+ if (isBlank$1(raw)) return void 0;
125224
+ const parsed = parseFormTmplRefId(String(raw));
125225
+ if (parsed.baseId && parsed.id) return `${parsed.baseId}:${parsed.id}`;
125226
+ const versionId = parsed.id;
125227
+ if (!versionId) return void 0;
125228
+ const baseFromOption = pickProductBaseId(option);
125229
+ if (baseFromOption) return `${baseFromOption}:${versionId}`;
125230
+ const baseId = await fetchProductBaseId(versionId);
125231
+ return baseId ? `${baseId}:${versionId}` : void 0;
125232
+ }
125187
125233
  /** 查批次锁定记录(最新一条) */
125188
125234
  async function getLotLockedReason(production_identification_id_) {
125189
125235
  const { data = {}, dict = {} } = await postApi({
@@ -125196,6 +125242,7 @@ async function getLotLockedReason(production_identification_id_) {
125196
125242
  var postApi;
125197
125243
  var init_service$5 = __esmMin((() => {
125198
125244
  init_api$1();
125245
+ init_core$1();
125199
125246
  postApi = getApi().apaas.modelComprehensive.postBizServiceModelCategoryModelKeyBsKey;
125200
125247
  }));
125201
125248
  //#endregion
@@ -126495,14 +126542,44 @@ var init_material_consume_table_controller = __esmMin((() => {
126495
126542
  * @param rowPath $.f_sub[n] n 必须为数字
126496
126543
  */
126497
126544
  static updateViewFieldsDisablement(option) {
126498
- const fields = [
126545
+ const fields = ["material_no_", "qty_"];
126546
+ this._updateDisablement({
126547
+ ...option,
126548
+ fields
126549
+ });
126550
+ }
126551
+ /**
126552
+ * 编辑态行:按 Excel calcDisabledFields 禁用字段,其余受控字段可填
126553
+ */
126554
+ static applyEditingRowDisablement(option) {
126555
+ const allFields = [
126556
+ "product_id_",
126499
126557
  "material_no_",
126558
+ "qty_consumed_",
126500
126559
  "qty_",
126501
- "routing_operation_id_"
126560
+ "qty_required_",
126561
+ "routing_operation_id_",
126562
+ "expiration_date_",
126563
+ "qty_required_uom_id_",
126564
+ "qty_uom_id_",
126565
+ "qty_transfer_",
126566
+ "qty_consumed_total_",
126567
+ "qty_transfer_uom_id_",
126568
+ "transfer_formula_",
126569
+ "sort_num_"
126502
126570
  ];
126571
+ const disabledSet = new Set(option.disabledFields);
126503
126572
  this._updateDisablement({
126504
- ...option,
126505
- fields
126573
+ dataManager: option.dataManager,
126574
+ rowPath: option.rowPath,
126575
+ fields: allFields.filter((field) => disabledSet.has(field)),
126576
+ disabled: true
126577
+ });
126578
+ this._updateDisablement({
126579
+ dataManager: option.dataManager,
126580
+ rowPath: option.rowPath,
126581
+ fields: allFields.filter((field) => !disabledSet.has(field)),
126582
+ disabled: false
126506
126583
  });
126507
126584
  }
126508
126585
  /**
@@ -126725,11 +126802,11 @@ var init_material_consume_table_controller = __esmMin((() => {
126725
126802
  * @param defaultData 子表行默认值(含工序等)
126726
126803
  */
126727
126804
  initTableData(dataManager, subFieldKey, defaultData) {
126728
- if (this.isDataProcessed) return;
126805
+ if (this.isDataProcessed) return [];
126729
126806
  const existingRows = dataManager.getRawData()[subFieldKey];
126730
- if (Array.isArray(existingRows) && existingRows.some((row) => row && !row.deleted_ && !row.__gw_default)) return;
126807
+ if (Array.isArray(existingRows) && existingRows.some((row) => row && !row.deleted_ && !row.__gw_default)) return [];
126731
126808
  const rows = this.calcFormState();
126732
- if (!(rows === null || rows === void 0 ? void 0 : rows.length)) return;
126809
+ if (!(rows === null || rows === void 0 ? void 0 : rows.length)) return [];
126733
126810
  const tableRows = transformUtils.transformSourceData2SubTable(rows, {}, defaultData);
126734
126811
  tableRows.forEach((row, i) => {
126735
126812
  ensureFrontRowKey(row);
@@ -126737,12 +126814,15 @@ var init_material_consume_table_controller = __esmMin((() => {
126737
126814
  });
126738
126815
  this.actualTableData = tableRows;
126739
126816
  tableRows.forEach((row, i) => {
126740
- MCDataUtil.updateConfirmableFieldsDisablement({
126817
+ const rowPath = `$.${subFieldKey}[${i}]`;
126818
+ if (row.is_confirmed_) MCDataUtil.updateConfirmableFieldsDisablement({
126741
126819
  dataManager,
126742
- rowPath: `$.${subFieldKey}[${i}]`,
126743
- disabled: !!row.is_confirmed_
126820
+ rowPath,
126821
+ disabled: true
126744
126822
  });
126823
+ else this.syncEditingRowDisablement(dataManager, rowPath, row);
126745
126824
  });
126825
+ return tableRows.map((_, index) => index);
126746
126826
  }
126747
126827
  /**
126748
126828
  * 根据数据计算需要禁用的字段
@@ -126762,6 +126842,14 @@ var init_material_consume_table_controller = __esmMin((() => {
126762
126842
  }
126763
126843
  return disabledKeys;
126764
126844
  }
126845
+ /** 可编辑行:对齐 Excel getNewTdInfo + calcDisabledFields */
126846
+ syncEditingRowDisablement(dataManager, rowPath, row) {
126847
+ MCDataUtil.applyEditingRowDisablement({
126848
+ dataManager,
126849
+ rowPath,
126850
+ disabledFields: this.calcDisabledFields(row)
126851
+ });
126852
+ }
126765
126853
  /**
126766
126854
  * 获取是否是 物料查看
126767
126855
  * @param product_id_
@@ -126932,7 +127020,8 @@ var init_material_consume_table_controller = __esmMin((() => {
126932
127020
  (_this$setupScope = this.setupScope) === null || _this$setupScope === void 0 || _this$setupScope.stop();
126933
127021
  this.setupScope = effectScope(true);
126934
127022
  this.setupDoc = opts.doc;
126935
- this.initTableData(opts.doc.dataManager, opts.subTableInfo.subFieldKey, opts.defaultRowData);
127023
+ const initializedRowIndexes = this.initTableData(opts.doc.dataManager, opts.subTableInfo.subFieldKey, opts.defaultRowData);
127024
+ await hydrateSubtableRowLabels(opts.doc, opts.subTableInfo.subFieldKey, initializedRowIndexes);
126936
127025
  this.setupScope.run(() => {
126937
127026
  watch(() => this.materialNoNum, () => this.syncQtyRequiredFromBom(opts.doc), { immediate: true });
126938
127027
  watch(() => this.tableDataRef.value.map((row) => [
@@ -126964,14 +127053,7 @@ var init_material_consume_table_controller = __esmMin((() => {
126964
127053
  * 物料+批次查复检日期;缺任一参数不查;无日期放过;小于当天则 throw
126965
127054
  */
126966
127055
  async validateReinspectionDate(opts) {
126967
- if (!opts.product_id_ || !opts.material_no_ && !opts.material_no_id_) return;
126968
- const date = await getReinspectionDate({
126969
- product_id_: opts.product_id_,
126970
- material_no_: opts.material_no_,
126971
- material_no_id_: opts.material_no_id_
126972
- });
126973
- if (!date) return;
126974
- if (dayjs(date).isBefore(dayjs(), "day")) throw new Error("已超物料复检日期,该物料不可用");
127056
+ await assertReinspectionDate(opts);
126975
127057
  }
126976
127058
  /**
126977
127059
  * 校验数据,并退出编辑
@@ -127078,7 +127160,10 @@ var init_material_consume_table_controller = __esmMin((() => {
127078
127160
  const entryIdx = this.bomEntriesValidator.resolveEntryIndex(row);
127079
127161
  const targetUtil = entryIdx >= 0 ? this.bomEntriesValidator.bomEntryValidators[entryIdx] : void 0;
127080
127162
  if (!targetUtil) {
127163
+ var _dataManager$getRawDa2;
127081
127164
  MCDataUtil.updateRow(option, false);
127165
+ const unlocked = (_dataManager$getRawDa2 = dataManager.getRawData()[subFieldKey]) === null || _dataManager$getRawDa2 === void 0 ? void 0 : _dataManager$getRawDa2[rowIndex];
127166
+ if (unlocked) this.syncEditingRowDisablement(dataManager, `$.${subFieldKey}[${rowIndex}]`, unlocked);
127082
127167
  return;
127083
127168
  }
127084
127169
  const targetRows = this.actualTableData.filter((r) => isRowInBomGroup(r, targetUtil));
@@ -127094,6 +127179,18 @@ var init_material_consume_table_controller = __esmMin((() => {
127094
127179
  setGroupEditState(this.actualTableData, current, false);
127095
127180
  }
127096
127181
  setGroupEditState(this.actualTableData, targetUtil, true);
127182
+ const rawRows = dataManager.getRawData()[subFieldKey] ?? [];
127183
+ rawRows.forEach((item, index) => {
127184
+ if (item.deleted_) return;
127185
+ const rowPath = `$.${subFieldKey}[${index}]`;
127186
+ if (current && isRowInBomGroup(item, current)) MCDataUtil.updateConfirmableFieldsDisablement({
127187
+ dataManager,
127188
+ rowPath,
127189
+ disabled: true
127190
+ });
127191
+ if (isRowInBomGroup(item, targetUtil)) this.syncEditingRowDisablement(dataManager, rowPath, item);
127192
+ });
127193
+ dataManager.set(subFieldKey, rawRows, "user");
127097
127194
  }
127098
127195
  /**
127099
127196
  * 在当前 BOM 组下方新增一个空组。
@@ -127102,7 +127199,7 @@ var init_material_consume_table_controller = __esmMin((() => {
127102
127199
  * 返回新行在活跃数据中的下标,调用方据此执行 Word 子表行初始化。
127103
127200
  */
127104
127201
  async addGroup(option, doc) {
127105
- var _dataManager$getRawDa2;
127202
+ var _dataManager$getRawDa3;
127106
127203
  const { dataManager, subFieldKey, rowIndex } = option;
127107
127204
  const rawRows = dataManager.getRawData()[subFieldKey] ?? [];
127108
127205
  const activeRows = rawRows.filter((row) => !row.deleted_);
@@ -127141,7 +127238,7 @@ var init_material_consume_table_controller = __esmMin((() => {
127141
127238
  };
127142
127239
  ensureFrontRowKey(newRow);
127143
127240
  if (!dataManager.insertAt(`$.${subFieldKey}`, insertIndex, newRow)) return;
127144
- const insertedRow = (_dataManager$getRawDa2 = dataManager.getRawData()[subFieldKey]) === null || _dataManager$getRawDa2 === void 0 ? void 0 : _dataManager$getRawDa2[insertIndex];
127241
+ const insertedRow = (_dataManager$getRawDa3 = dataManager.getRawData()[subFieldKey]) === null || _dataManager$getRawDa3 === void 0 ? void 0 : _dataManager$getRawDa3[insertIndex];
127145
127242
  if (insertedRow) {
127146
127243
  this.setDefaultValue(insertedRow, doc);
127147
127244
  dataManager.set(`$.${subFieldKey}[${insertIndex}]`, insertedRow, "user");
@@ -127150,6 +127247,57 @@ var init_material_consume_table_controller = __esmMin((() => {
127150
127247
  return insertIndex;
127151
127248
  }
127152
127249
  /**
127250
+ * 组内加一行:当前行下方插入,继承 bom_entry_id_。
127251
+ */
127252
+ addRowForGroup(option, doc) {
127253
+ var _dataManager$getRawDa4;
127254
+ const { dataManager, subFieldKey, rowIndex } = option;
127255
+ const currentRow = (dataManager.getRawData()[subFieldKey] ?? []).filter((row) => !row.deleted_)[rowIndex];
127256
+ if (!currentRow) return;
127257
+ const newRow = {
127258
+ is_confirmed_: false,
127259
+ expiration_date_: "",
127260
+ ...currentRow.bom_entry_id_ ? { bom_entry_id_: currentRow.bom_entry_id_ } : {}
127261
+ };
127262
+ ensureFrontRowKey(newRow);
127263
+ const insertIndex = rowIndex + 1;
127264
+ if (!dataManager.insertAt(`$.${subFieldKey}`, insertIndex, newRow)) return;
127265
+ const insertedRow = (_dataManager$getRawDa4 = dataManager.getRawData()[subFieldKey]) === null || _dataManager$getRawDa4 === void 0 ? void 0 : _dataManager$getRawDa4[insertIndex];
127266
+ if (insertedRow) {
127267
+ this.setDefaultValue(insertedRow, doc);
127268
+ dataManager.set(`$.${subFieldKey}[${insertIndex}]`, insertedRow, "user");
127269
+ }
127270
+ this.updateDerivedQtyFields(doc);
127271
+ return insertIndex;
127272
+ }
127273
+ /**
127274
+ * 仅剩一行时清空内容:保留行身份和默认值,并断开 BOM 组。
127275
+ */
127276
+ clearRow(option, doc) {
127277
+ const { dataManager, subFieldKey, rowIndex } = option;
127278
+ const row = (dataManager.getRawData()[subFieldKey] ?? [])[rowIndex];
127279
+ if (!row) return;
127280
+ const preserved = pick(row, ["id_", FRONT_ROW_KEY]);
127281
+ Object.keys(row).forEach((key) => {
127282
+ if (!(key in preserved)) delete row[key];
127283
+ });
127284
+ Object.assign(row, {
127285
+ is_confirmed_: false,
127286
+ expiration_date_: ""
127287
+ }, preserved);
127288
+ ensureFrontRowKey(row);
127289
+ this.setDefaultValue(row, doc);
127290
+ row.bom_entry_id_ = void 0;
127291
+ row.qty_consumed_total_ = void 0;
127292
+ dataManager.set(`$.${subFieldKey}[${rowIndex}]`, row, "user");
127293
+ MCDataUtil.updateConfirmableFieldsDisablement({
127294
+ dataManager,
127295
+ rowPath: `$.${subFieldKey}[${rowIndex}]`,
127296
+ disabled: false
127297
+ });
127298
+ this.updateDerivedQtyFields(doc);
127299
+ }
127300
+ /**
127153
127301
  * 更新整个数组的所有行的已消耗数量
127154
127302
  *
127155
127303
  * 调用时机:[物料消耗表]任意一行
@@ -127233,6 +127381,7 @@ var init_material_consume_table_controller = __esmMin((() => {
127233
127381
  if (["product_id_", "material_no_"].includes(fieldKey)) {
127234
127382
  const rowPath = `${parentFieldPath}[${dataIndex}]`;
127235
127383
  if (fieldKey === "product_id_") {
127384
+ var _doc$dataManager$getR;
127236
127385
  const row = doc.dataManager.get(rowPath);
127237
127386
  if (row._scanFallback) {
127238
127387
  try {
@@ -127260,12 +127409,8 @@ var init_material_consume_table_controller = __esmMin((() => {
127260
127409
  [`${rowPath}.qty_`]: void 0,
127261
127410
  [`${rowPath}.expiration_date_`]: void 0
127262
127411
  }, "user");
127263
- const disabled = this.getMaterialTypeIsView(product_id_);
127264
- MCDataUtil.updateViewFieldsDisablement({
127265
- dataManager: doc.dataManager,
127266
- rowPath,
127267
- disabled
127268
- });
127412
+ const nextRow = (_doc$dataManager$getR = doc.dataManager.getRawData()[parentFieldKey]) === null || _doc$dataManager$getR === void 0 ? void 0 : _doc$dataManager$getR[dataIndex];
127413
+ if (nextRow) this.syncEditingRowDisablement(doc.dataManager, rowPath, nextRow);
127269
127414
  } else if (fieldKey === "material_no_") {
127270
127415
  if (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.is_locked_) {
127271
127416
  doc.dataManager.setMultiple({
@@ -127529,7 +127674,9 @@ var init_material_consume_util = __esmMin((() => {
127529
127674
  rowPath,
127530
127675
  disabled: true
127531
127676
  });
127677
+ else tableController === null || tableController === void 0 || tableController.syncEditingRowDisablement(doc.dataManager, rowPath, row);
127532
127678
  });
127679
+ if (isBomPattern && !activeCount) tableController === null || tableController === void 0 || tableController.syncEditingRowDisablement(doc.dataManager, `${table_key_}[0]`, { is_confirmed_: false });
127533
127680
  });
127534
127681
  };
127535
127682
  handleAllMCTablesMounted = (doc, tmplBomC) => {
@@ -127572,9 +127719,11 @@ function getGroupProductIds(entry) {
127572
127719
  * 找不到说明物料不在当前 BOM 中。
127573
127720
  */
127574
127721
  function findEntryByProductId(entries, productId) {
127575
- return entries.find((entry) => getGroupProductIds(entry).includes(productId));
127722
+ const versionId = parseFormTmplRefId(productId).id || productId;
127723
+ return entries.find((entry) => getGroupProductIds(entry).includes(versionId));
127576
127724
  }
127577
127725
  var init_scan_validator = __esmMin((() => {
127726
+ init_core$1();
127578
127727
  window.$t;
127579
127728
  }));
127580
127729
  //#endregion
@@ -127682,23 +127831,51 @@ function validateObjectBomForScan(opts) {
127682
127831
  if (!findEntryByProductId(formInstBom.bomEntries ?? [], productId)) throw new Error(ERR_MATERIAL_NOT_MATCH);
127683
127832
  }
127684
127833
  /**
127685
- * 物料消耗对象物料批下拉:未开人为指定时,限制为 BOM 主料 + 已开替代料的替代料
127686
- * - 无需过滤时返回 null(无 belongingObject / 无配置 / 人为指定)
127687
- * - 无候选时用占位 id,避免空数组被后端当成不筛选
127834
+ * 收集实例 BOM 主料 + 已开替代料的版本 id。
127835
+ * - 无需过滤返回 null(无配置 / 记录模式 / 人为指定)
127688
127836
  */
127689
- function getObjectBomMaterialLotQuery(opts) {
127837
+ function collectObjectBomVersionIds(opts) {
127690
127838
  const { formInstBom, belongingObject } = opts;
127691
127839
  const objectBom = findObjectBom(formInstBom, belongingObject);
127692
- if (!objectBom || objectBom.personal_bom_enabled_) return null;
127693
- const bomEntries = formInstBom.bomEntries ?? [];
127840
+ if (!objectBom) return null;
127841
+ if (objectBom.material_consumption_pattern_ === MaterialConsumptionPatternEnum.RECORD) return null;
127842
+ if (objectBom.personal_bom_enabled_) return null;
127694
127843
  const versionIds = /* @__PURE__ */ new Set();
127695
- bomEntries.forEach((entry) => {
127844
+ (formInstBom.bomEntries ?? []).forEach((entry) => {
127696
127845
  getGroupProductIds(entry).forEach((id) => {
127697
127846
  const versionId = id === null || id === void 0 ? void 0 : id.split(":").pop();
127698
127847
  if (versionId) versionIds.add(versionId);
127699
127848
  });
127700
127849
  });
127701
- return { "product_id_.versionIn": versionIds.size ? Array.from(versionIds) : [EMPTY_PRODUCT_VERSION_ID] };
127850
+ return Array.from(versionIds);
127851
+ }
127852
+ function toObjectBomFilterIds(versionIds) {
127853
+ if (!versionIds) return null;
127854
+ return versionIds.length ? versionIds : [EMPTY_PRODUCT_VERSION_ID];
127855
+ }
127856
+ /**
127857
+ * 物料消耗对象物料批下拉:限制为 BOM 主料 + 已开替代料的替代料
127858
+ * - 无需过滤时返回 null(无配置 / 记录模式 / 人为指定)
127859
+ * - 无候选时用占位 id,避免空数组被后端当成不筛选
127860
+ */
127861
+ function getObjectBomMaterialLotQuery(opts) {
127862
+ const ids = toObjectBomFilterIds(collectObjectBomVersionIds(opts));
127863
+ return ids ? { "product_id_.versionIn": ids } : null;
127864
+ }
127865
+ /**
127866
+ * 物料消耗对象物料下拉:限制为 BOM 主料 + 已开替代料的替代料
127867
+ * - 无需过滤时返回 null(无配置 / 记录模式 / 人为指定)
127868
+ * - 无候选时用占位 id,避免空数组被后端当成不筛选
127869
+ */
127870
+ function getObjectBomProductQuery(opts) {
127871
+ const ids = toObjectBomFilterIds(collectObjectBomVersionIds(opts));
127872
+ return ids ? { "id_.in": ids } : null;
127873
+ }
127874
+ /** 对象下拉按字段类型取 BOM 过滤;非物料/批次返回 null */
127875
+ function getObjectBomDropdownQuery(fieldType, opts) {
127876
+ if (fieldType === FIELD_TYPE.MATERIAL_NO) return getObjectBomMaterialLotQuery(opts);
127877
+ if (fieldType === FIELD_TYPE.PRODUCT) return getObjectBomProductQuery(opts);
127878
+ return null;
127702
127879
  }
127703
127880
  /**
127704
127881
  * 表单提交:校验所有物料消耗对象的数量 vs 需求数量
@@ -127751,15 +127928,156 @@ var $t$1, ERR_MATERIAL_NOT_MATCH;
127751
127928
  var init_bom_validator = __esmMin((() => {
127752
127929
  init_product_id_query();
127753
127930
  init_scan_validator();
127931
+ init_types$4();
127754
127932
  init_field_type();
127755
127933
  $t$1 = (...args) => window.$t(...args);
127756
127934
  ERR_MATERIAL_NOT_MATCH = "当前物料不在 bom 中";
127757
127935
  }));
127758
127936
  //#endregion
127937
+ //#region src/suites/edhr/panel-schema/data-init/material-consume-object/linkage.ts
127938
+ function widgetFieldKey$1(field) {
127939
+ return (field.fieldLink ? getLastSegment$1(field.fieldLink) : field.key) || void 0;
127940
+ }
127941
+ function isMaterialConsumeObject(doc, belongingObject) {
127942
+ var _doc$fieldModelQuery$;
127943
+ const objectField = (_doc$fieldModelQuery$ = doc.fieldModelQuery.getFieldList(doc.mainModelKey)) === null || _doc$fieldModelQuery$ === void 0 ? void 0 : _doc$fieldModelQuery$.find((field) => field.key === belongingObject);
127944
+ if (!objectField) return false;
127945
+ return resolveFieldManifestType(objectField) === FIELD_TYPE.MATERIAL_CONSUME;
127946
+ }
127947
+ function collectConsumeObjectPaths(doc, belongingObject) {
127948
+ var _doc$model, _doc$model$getWidgetI;
127949
+ const paths = {};
127950
+ const widgets = ((_doc$model = doc.model) === null || _doc$model === void 0 || (_doc$model$getWidgetI = _doc$model.getWidgetInstances) === null || _doc$model$getWidgetI === void 0 ? void 0 : _doc$model$getWidgetI.call(_doc$model)) ?? [];
127951
+ for (const widget of widgets) {
127952
+ var _widget$widgetMeta;
127953
+ const field = (_widget$widgetMeta = widget.widgetMeta) === null || _widget$widgetMeta === void 0 ? void 0 : _widget$widgetMeta.field;
127954
+ if (!field || field.belongingObject !== belongingObject) continue;
127955
+ const key = widgetFieldKey$1(field);
127956
+ const path = key ? generateValuePath(key, "") : void 0;
127957
+ if (!path) continue;
127958
+ if (field.fieldType === FIELD_TYPE.PRODUCT) paths.productPath = path;
127959
+ if (field.fieldType === FIELD_TYPE.MATERIAL_NO) paths.materialNoPath = path;
127960
+ }
127961
+ return paths;
127962
+ }
127963
+ function pickLotProductRaw(option) {
127964
+ if (!option) return void 0;
127965
+ return option.product_id_ ?? option.materialId;
127966
+ }
127967
+ function isUnchangedProduct(doc, productPath, pending) {
127968
+ const oldValue = doc.dataManager.get(productPath);
127969
+ const nextValue = productPath in pending ? pending[productPath] : oldValue;
127970
+ return !isBlank$1(nextValue) && isSameFieldValue(oldValue, nextValue);
127971
+ }
127972
+ function buildLotClearUpdates(materialNoPath) {
127973
+ if (!materialNoPath) return {};
127974
+ return {
127975
+ [materialNoPath]: null,
127976
+ [getIdPath(materialNoPath)]: null
127977
+ };
127978
+ }
127979
+ /**
127980
+ * 消耗对象批次下拉:同组物料有值时按该物料版本过滤,替换 BOM versionIn。
127981
+ */
127982
+ function getConsumeObjectLotProductQuery(opts) {
127983
+ var _doc$isInEditMode;
127984
+ const { doc, belongingObject, fieldType } = opts;
127985
+ if ((_doc$isInEditMode = doc.isInEditMode) === null || _doc$isInEditMode === void 0 ? void 0 : _doc$isInEditMode.call(doc)) return null;
127986
+ if (!belongingObject || fieldType !== FIELD_TYPE.MATERIAL_NO) return null;
127987
+ if (!isMaterialConsumeObject(doc, belongingObject)) return null;
127988
+ const { productPath } = collectConsumeObjectPaths(doc, belongingObject);
127989
+ if (!productPath) return null;
127990
+ const productValue = doc.dataManager.get(productPath);
127991
+ if (isBlank$1(productValue)) return null;
127992
+ const productId = parseFormTmplRefId(String(productValue)).id;
127993
+ return productId ? { "product_id_.versionEq": productId } : null;
127994
+ }
127995
+ /**
127996
+ * 物料消耗对象下拉联动:
127997
+ * - 改/清物料:清空同组批次
127998
+ * - 选批次且 option 有物料 id:写入同组物料(RDO `base:version`)
127999
+ * - 清批次 / 手输批次:不动物料
128000
+ * - 选批次但解析不出 RDO 引用:throw,调用方不得写入批次
128001
+ */
128002
+ async function buildConsumeObjectSelectUpdates(opts) {
128003
+ var _doc$isInEditMode2;
128004
+ const { doc, belongingObject, fieldType, selectedOption, pending = {} } = opts;
128005
+ if ((_doc$isInEditMode2 = doc.isInEditMode) === null || _doc$isInEditMode2 === void 0 ? void 0 : _doc$isInEditMode2.call(doc)) return {};
128006
+ if (!belongingObject || !fieldType) return {};
128007
+ if (!isMaterialConsumeObject(doc, belongingObject)) return {};
128008
+ const { productPath, materialNoPath } = collectConsumeObjectPaths(doc, belongingObject);
128009
+ if (fieldType === FIELD_TYPE.PRODUCT) {
128010
+ if (productPath && isUnchangedProduct(doc, productPath, pending)) return {};
128011
+ return buildLotClearUpdates(materialNoPath);
128012
+ }
128013
+ if (fieldType === FIELD_TYPE.MATERIAL_NO) {
128014
+ const raw = pickLotProductRaw(selectedOption);
128015
+ if (isBlank$1(raw) || !productPath) return {};
128016
+ const ref = await resolveProductRdoRef(raw, selectedOption);
128017
+ if (!ref) throw new Error(ERR_RESOLVE_PRODUCT);
128018
+ return { [productPath]: ref };
128019
+ }
128020
+ return {};
128021
+ }
128022
+ /** 扫码写入同组物料:路径与下拉一致;解析失败 throw。 */
128023
+ async function buildConsumeObjectScanProductUpdate(opts) {
128024
+ var _doc$isInEditMode3;
128025
+ const { doc, belongingObject, material } = opts;
128026
+ if ((_doc$isInEditMode3 = doc.isInEditMode) === null || _doc$isInEditMode3 === void 0 ? void 0 : _doc$isInEditMode3.call(doc)) return {};
128027
+ if (!belongingObject || !material) return {};
128028
+ if (!isMaterialConsumeObject(doc, belongingObject)) return {};
128029
+ const { productPath } = collectConsumeObjectPaths(doc, belongingObject);
128030
+ if (!productPath) return {};
128031
+ const ref = await resolveProductRdoRef(material.product_id_ ?? material.materialId, material);
128032
+ if (!ref) throw new Error(ERR_RESOLVE_PRODUCT_SCAN);
128033
+ return { [productPath]: ref };
128034
+ }
128035
+ function pickMergedValue(doc, path, nextValues) {
128036
+ if (path in nextValues) return nextValues[path];
128037
+ return doc.dataManager.get(path);
128038
+ }
128039
+ /**
128040
+ * 消耗对象写入前的复检入参:用即将写入的物料+批次。
128041
+ * 缺对象、缺物料或批次时返回 null(与消耗表缺参不查一致)。
128042
+ * product_id_ 为版本 id,供 versionEq 使用。
128043
+ */
128044
+ function getConsumeObjectReinspectionParams(opts) {
128045
+ var _doc$isInEditMode4;
128046
+ const { doc, belongingObject, fieldType, nextValues = {} } = opts;
128047
+ if ((_doc$isInEditMode4 = doc.isInEditMode) === null || _doc$isInEditMode4 === void 0 ? void 0 : _doc$isInEditMode4.call(doc)) return null;
128048
+ if (!belongingObject || !fieldType) return null;
128049
+ if (fieldType !== FIELD_TYPE.PRODUCT && fieldType !== FIELD_TYPE.MATERIAL_NO) return null;
128050
+ if (!isMaterialConsumeObject(doc, belongingObject)) return null;
128051
+ const { productPath, materialNoPath } = collectConsumeObjectPaths(doc, belongingObject);
128052
+ if (!productPath || !materialNoPath) return null;
128053
+ const productId = pickMergedValue(doc, productPath, nextValues);
128054
+ const materialNo = pickMergedValue(doc, materialNoPath, nextValues);
128055
+ const materialNoId = pickMergedValue(doc, getIdPath(materialNoPath), nextValues);
128056
+ if (isBlank$1(productId) || isBlank$1(materialNo) && isBlank$1(materialNoId)) return null;
128057
+ const versionId = parseFormTmplRefId(String(productId)).id;
128058
+ if (!versionId) return null;
128059
+ return {
128060
+ product_id_: versionId,
128061
+ material_no_: isBlank$1(materialNo) ? void 0 : String(materialNo),
128062
+ material_no_id_: isBlank$1(materialNoId) ? void 0 : String(materialNoId)
128063
+ };
128064
+ }
128065
+ var ERR_RESOLVE_PRODUCT, ERR_RESOLVE_PRODUCT_SCAN;
128066
+ var init_linkage = __esmMin((() => {
128067
+ init_field_paths();
128068
+ init_field_updates();
128069
+ init_field_type();
128070
+ init_service$5();
128071
+ init_core$1();
128072
+ ERR_RESOLVE_PRODUCT = "无法解析物料,请重新选择批次";
128073
+ ERR_RESOLVE_PRODUCT_SCAN = "无法解析物料,请重新扫码";
128074
+ }));
128075
+ //#endregion
127759
128076
  //#region src/suites/edhr/panel-schema/data-init/material-consume-object/index.ts
127760
128077
  var init_material_consume_object = __esmMin((() => {
127761
128078
  init_use_tmpl_bom();
127762
128079
  init_bom_validator();
128080
+ init_linkage();
127763
128081
  }));
127764
128082
  //#endregion
127765
128083
  //#region src/runtime/validation/useFormValidator.ts
@@ -140234,7 +140552,7 @@ function useTableDropdown(props, searchFilters) {
140234
140552
  /** 非联动场景、可选过滤、或联动已选择关联值时,才展示搜索栏 */
140235
140553
  const showSearch = computed(() => !enableLinkage.value || !linkageRequiresUpstreamValue.value || !!linkDataValue.value);
140236
140554
  const fetcher = async ({ keyword = "", pageNo, pageSize, deviceTypeId }) => {
140237
- var _fieldMeta$value14, _fieldMeta$value15, _window$TMPL_BOM_CONT, _fieldMeta$value16, _parsedValuePath$segm;
140555
+ var _fieldMeta$value14, _fieldMeta$value15, _window$TMPL_BOM_CONT, _fieldMeta$value16, _fieldMeta$value17, _parsedValuePath$segm, _docInst$value$params;
140238
140556
  if (!fieldInfo.value) return {
140239
140557
  data: [],
140240
140558
  totalPage: 0,
@@ -140255,10 +140573,15 @@ function useTableDropdown(props, searchFilters) {
140255
140573
  const assocFilterParams = await buildAssocFilterExtraParams(docInst.value, widgetProps.value, runtimeValuePath.value);
140256
140574
  const belongingObject = (_fieldMeta$value15 = fieldMeta.value) === null || _fieldMeta$value15 === void 0 ? void 0 : _fieldMeta$value15.belongingObject;
140257
140575
  const formTmplBomController = (_window$TMPL_BOM_CONT = window[TMPL_BOM_CONTROLLER]) === null || _window$TMPL_BOM_CONT === void 0 ? void 0 : _window$TMPL_BOM_CONT.value;
140258
- const objectBomParams = ((_fieldMeta$value16 = fieldMeta.value) === null || _fieldMeta$value16 === void 0 ? void 0 : _fieldMeta$value16.fieldType) === FIELD_TYPE.MATERIAL_NO ? getObjectBomMaterialLotQuery({
140576
+ const objectBomParams = getObjectBomDropdownQuery((_fieldMeta$value16 = fieldMeta.value) === null || _fieldMeta$value16 === void 0 ? void 0 : _fieldMeta$value16.fieldType, {
140259
140577
  formInstBom: formTmplBomController === null || formTmplBomController === void 0 ? void 0 : formTmplBomController.formInstBom,
140260
140578
  belongingObject
140261
- }) : null;
140579
+ });
140580
+ const lotProductParams = getConsumeObjectLotProductQuery({
140581
+ doc: docInst.value,
140582
+ belongingObject,
140583
+ fieldType: (_fieldMeta$value17 = fieldMeta.value) === null || _fieldMeta$value17 === void 0 ? void 0 : _fieldMeta$value17.fieldType
140584
+ });
140262
140585
  const parsedValuePath = parseValuePath(runtimeValuePath.value);
140263
140586
  const rowIndexMatch = (_parsedValuePath$segm = parsedValuePath.segments[0]) === null || _parsedValuePath$segm === void 0 ? void 0 : _parsedValuePath$segm.match(/\[(\d+)\]/);
140264
140587
  const rowIndex = rowIndexMatch ? Number(rowIndexMatch[1]) : void 0;
@@ -140266,15 +140589,15 @@ function useTableDropdown(props, searchFilters) {
140266
140589
  const materialConsumeRow = rowIndex != null ? materialConsumeTableController === null || materialConsumeTableController === void 0 ? void 0 : materialConsumeTableController.actualTableData[rowIndex] : void 0;
140267
140590
  let materialConsumeRowParams;
140268
140591
  if (materialConsumeTableController && materialConsumeRow) {
140269
- var _fieldMeta$value17, _fieldMeta$value18;
140270
- if (((_fieldMeta$value17 = fieldMeta.value) === null || _fieldMeta$value17 === void 0 ? void 0 : _fieldMeta$value17.fieldType) === FIELD_TYPE.PRODUCT) materialConsumeRowParams = materialConsumeTableController.getProductQueryForRow(materialConsumeRow, rowIndex);
140271
- else if (((_fieldMeta$value18 = fieldMeta.value) === null || _fieldMeta$value18 === void 0 ? void 0 : _fieldMeta$value18.fieldType) === FIELD_TYPE.MATERIAL_NO) materialConsumeRowParams = materialConsumeTableController.getMaterialNoQueryForRow(materialConsumeRow, rowIndex);
140592
+ var _fieldMeta$value18, _fieldMeta$value19;
140593
+ if (((_fieldMeta$value18 = fieldMeta.value) === null || _fieldMeta$value18 === void 0 ? void 0 : _fieldMeta$value18.fieldType) === FIELD_TYPE.PRODUCT) materialConsumeRowParams = materialConsumeTableController.getProductQueryForRow(materialConsumeRow, rowIndex);
140594
+ else if (((_fieldMeta$value19 = fieldMeta.value) === null || _fieldMeta$value19 === void 0 ? void 0 : _fieldMeta$value19.fieldType) === FIELD_TYPE.MATERIAL_NO) materialConsumeRowParams = materialConsumeTableController.getMaterialNoQueryForRow(materialConsumeRow, rowIndex);
140272
140595
  }
140273
140596
  const extraParams = {
140274
140597
  ...subFieldConfig.get(valuePath),
140275
140598
  ...runtimeValuePath.value ? subFieldConfig.get(runtimeValuePath.value) : {},
140276
140599
  ...assocFilterParams,
140277
- ...objectBomParams ?? {},
140600
+ ...lotProductParams ?? objectBomParams ?? {},
140278
140601
  ...materialConsumeRowParams ?? {}
140279
140602
  };
140280
140603
  const { queryData = {}, exp = "" } = (buildQuery === null || buildQuery === void 0 ? void 0 : buildQuery({
@@ -140286,7 +140609,8 @@ function useTableDropdown(props, searchFilters) {
140286
140609
  deviceGroupId: widgetProps.value.enableCascadeDataFilter ? widgetProps.value.deviceGroupId : void 0,
140287
140610
  extraParams,
140288
140611
  optionMapping,
140289
- isMockReport: !!docInst.value.isMockReport
140612
+ isMockReport: !!docInst.value.isMockReport,
140613
+ routingOperationId: (_docInst$value$params = docInst.value.paramsConfig) === null || _docInst$value$params === void 0 ? void 0 : _docInst$value$params.routingOperationId
140290
140614
  })) ?? {};
140291
140615
  const apiFetcher = apiFetchers[fetcher];
140292
140616
  if (!apiFetcher) return {
@@ -143532,8 +143856,17 @@ var init_overlay_render_vue_vue_type_script_setup_true_lang = __esmMin((() => {
143532
143856
  belongingObject,
143533
143857
  productId: material.materialId
143534
143858
  });
143859
+ await assertReinspectionDate({
143860
+ product_id_: material.materialId,
143861
+ material_no_: material.productionIdentificationName,
143862
+ material_no_id_: material.productionIdentificationId
143863
+ });
143864
+ const productUpdates = await buildConsumeObjectScanProductUpdate({
143865
+ doc: props.doc,
143866
+ belongingObject,
143867
+ material
143868
+ });
143535
143869
  const byBiz = (bizType) => objectFields.find((item) => (item.bizType || item.type) === bizType);
143536
- const productField = byBiz(FIELD_TYPE.PRODUCT);
143537
143870
  const qtyField = byBiz(FIELD_TYPE.QTY);
143538
143871
  const expirationField = objectFields.find((item) => {
143539
143872
  var _item$key;
@@ -143542,7 +143875,7 @@ var init_overlay_render_vue_vue_type_script_setup_true_lang = __esmMin((() => {
143542
143875
  const updates = { ...transformedData };
143543
143876
  updates[runtimeValuePath.value] = material.productionIdentificationName;
143544
143877
  updates[getIdPath(runtimeValuePath.value)] = material.productionIdentificationId;
143545
- if (productField) updates[productField.key] = material.materialId;
143878
+ Object.assign(updates, productUpdates);
143546
143879
  if (qtyField && parsedValue.qty !== void 0) updates[qtyField.key] = parsedValue.qty;
143547
143880
  if (expirationField && parsedValue.expiration !== void 0) updates[expirationField.key] = parsedValue.expiration;
143548
143881
  props.doc.dataManager.setMultiple(updates, "user");
@@ -143596,7 +143929,7 @@ var init_overlay_render_vue_vue_type_script_setup_true_lang = __esmMin((() => {
143596
143929
  });
143597
143930
  }
143598
143931
  async function onChange(data, record) {
143599
- var _widgetProps$value7, _widgetProps$value8, _props$widget$widgetM, _props$widget$dataSlo, _fieldMeta$value4, _fieldMeta$value5, _fieldMeta$value6, _fieldMeta$value7;
143932
+ var _widgetProps$value7, _widgetProps$value8, _props$widget$widgetM, _props$widget$dataSlo, _fieldMeta$value4, _fieldMeta$value5, _fieldMeta$value6, _fieldMeta$value7, _fieldMeta$value10, _fieldMeta$value11;
143600
143933
  const dataValues = loadDataValuesByAutofillRules(record, (_widgetProps$value7 = widgetProps.value) === null || _widgetProps$value7 === void 0 ? void 0 : _widgetProps$value7.autofillRules, runtimeValuePath.value, (_widgetProps$value8 = widgetProps.value) === null || _widgetProps$value8 === void 0 ? void 0 : _widgetProps$value8.autofillEnabled, props.doc);
143601
143934
  const subFieldValuePath = (_props$widget$widgetM = props.widget.widgetMeta) === null || _props$widget$widgetM === void 0 || (_props$widget$widgetM = _props$widget$widgetM.field) === null || _props$widget$widgetM === void 0 ? void 0 : _props$widget$widgetM.valuePath;
143602
143935
  const dataIndex = (_props$widget$dataSlo = props.widget.dataSlotIndex) === null || _props$widget$dataSlo === void 0 ? void 0 : _props$widget$dataSlo.dataIndex;
@@ -143639,11 +143972,39 @@ var init_overlay_render_vue_vue_type_script_setup_true_lang = __esmMin((() => {
143639
143972
  ...dateObjectFill
143640
143973
  };
143641
143974
  const linkageClears = tableRuntime.buildDownstreamClears(pending);
143642
- props.doc.dataManager.setMultiple({
143975
+ let consumeUpdates = {};
143976
+ try {
143977
+ var _fieldMeta$value8, _fieldMeta$value9;
143978
+ consumeUpdates = await buildConsumeObjectSelectUpdates({
143979
+ doc: props.doc,
143980
+ belongingObject: (_fieldMeta$value8 = fieldMeta.value) === null || _fieldMeta$value8 === void 0 ? void 0 : _fieldMeta$value8.belongingObject,
143981
+ fieldType: (_fieldMeta$value9 = fieldMeta.value) === null || _fieldMeta$value9 === void 0 ? void 0 : _fieldMeta$value9.fieldType,
143982
+ selectedOption: record,
143983
+ pending: data
143984
+ });
143985
+ } catch (e) {
143986
+ GctMessage.error((e === null || e === void 0 ? void 0 : e.message) || "无法解析物料,请重新选择批次");
143987
+ return;
143988
+ }
143989
+ const nextValues = {
143643
143990
  ...pending,
143644
143991
  ...linkageClears,
143645
- ...dateObjectClears
143646
- }, "user");
143992
+ ...dateObjectClears,
143993
+ ...consumeUpdates
143994
+ };
143995
+ const reinspection = getConsumeObjectReinspectionParams({
143996
+ doc: props.doc,
143997
+ belongingObject: (_fieldMeta$value10 = fieldMeta.value) === null || _fieldMeta$value10 === void 0 ? void 0 : _fieldMeta$value10.belongingObject,
143998
+ fieldType: (_fieldMeta$value11 = fieldMeta.value) === null || _fieldMeta$value11 === void 0 ? void 0 : _fieldMeta$value11.fieldType,
143999
+ nextValues
144000
+ });
144001
+ if (reinspection) try {
144002
+ await assertReinspectionDate(reinspection);
144003
+ } catch (e) {
144004
+ GctMessage.error((e === null || e === void 0 ? void 0 : e.message) || "已超物料复检日期,该物料不可用");
144005
+ return;
144006
+ }
144007
+ props.doc.dataManager.setMultiple(nextValues, "user");
143647
144008
  if (subFieldValuePath && isNumber(dataIndex)) {
143648
144009
  var _props$doc$model, _allRegions$find;
143649
144010
  const parsed = parseValuePath(subFieldValuePath);
@@ -143777,8 +144138,8 @@ var init_overlay_render_vue_vue_type_script_setup_true_lang = __esmMin((() => {
143777
144138
  //#region src/runtime/canvas/__common__/widget-container/overlay-render.vue?vue&type=style&index=0&lang.less
143778
144139
  var init_overlay_render_vue_vue_type_style_index_0_lang = __esmMin((() => {}));
143779
144140
  //#endregion
143780
- //#region src/runtime/canvas/__common__/widget-container/overlay-render.vue?vue&type=style&index=1&scoped=d63857b1&lang.less
143781
- var init_overlay_render_vue_vue_type_style_index_1_scoped_d63857b1_lang = __esmMin((() => {}));
144141
+ //#region src/runtime/canvas/__common__/widget-container/overlay-render.vue?vue&type=style&index=1&scoped=5a0ffda2&lang.less
144142
+ var init_overlay_render_vue_vue_type_style_index_1_scoped_5a0ffda2_lang = __esmMin((() => {}));
143782
144143
  //#endregion
143783
144144
  //#region src/runtime/canvas/__common__/widget-container/overlay-render.vue
143784
144145
  var overlay_render_default;
@@ -143786,9 +144147,9 @@ var init_overlay_render = __esmMin((() => {
143786
144147
  init_overlay_render_vue_vue_type_script_setup_true_lang();
143787
144148
  init_overlay_render_vue_vue_type_script_setup_true_lang();
143788
144149
  init_overlay_render_vue_vue_type_style_index_0_lang();
143789
- init_overlay_render_vue_vue_type_style_index_1_scoped_d63857b1_lang();
144150
+ init_overlay_render_vue_vue_type_style_index_1_scoped_5a0ffda2_lang();
143790
144151
  init__plugin_vue_export_helper();
143791
- overlay_render_default = /*#__PURE__*/ _plugin_vue_export_helper_default(overlay_render_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d63857b1"]]);
144152
+ overlay_render_default = /*#__PURE__*/ _plugin_vue_export_helper_default(overlay_render_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5a0ffda2"]]);
143792
144153
  }));
143793
144154
  //#endregion
143794
144155
  //#region src/utils/composables/useHoverDelay.ts
@@ -146996,7 +147357,7 @@ var init_business_scan_menu = __esmMin((() => {
146996
147357
  }));
146997
147358
  //#endregion
146998
147359
  //#region src/runtime/canvas/table/render/table-structure-overlay/sub-table-action/repeating-table-action.vue?vue&type=script&setup=true&name=sub-table-action&lang.ts
146999
- var _hoisted_1$133, _hoisted_2$81, _hoisted_3$54, _hoisted_4$39, _hoisted_5$29, _hoisted_6$19, _hoisted_7$15, _hoisted_8$11, _hoisted_9$6, _hoisted_10$5, _hoisted_11$4, _hoisted_12$3, _hoisted_13$2, _hoisted_14$2, _hoisted_15$2, _hoisted_16$2, _hoisted_17$1, _hoisted_18$1, _hoisted_19, _hoisted_20, repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_action_lang_default;
147360
+ var _hoisted_1$133, _hoisted_2$81, _hoisted_3$54, _hoisted_4$39, _hoisted_5$29, _hoisted_6$19, _hoisted_7$15, _hoisted_8$11, _hoisted_9$6, _hoisted_10$5, _hoisted_11$4, _hoisted_12$3, _hoisted_13$2, _hoisted_14$2, _hoisted_15$2, _hoisted_16$2, _hoisted_17$1, _hoisted_18$1, _hoisted_19, _hoisted_20, _hoisted_21, _hoisted_22, _hoisted_23, _hoisted_24, _hoisted_25, _hoisted_26, repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_action_lang_default;
147000
147361
  var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_action_lang = __esmMin((() => {
147001
147362
  init_base$2();
147002
147363
  init_core$1();
@@ -147006,39 +147367,47 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147006
147367
  init_table$1();
147007
147368
  init_material_balance();
147008
147369
  init__register_();
147009
- init_types$4();
147010
147370
  init_constants$1();
147011
147371
  init_quick_fill_util();
147012
147372
  init_business_scan_menu();
147013
147373
  _hoisted_1$133 = { class: "sub-table-action-bar" };
147014
147374
  _hoisted_2$81 = { class: "sub-table-action-popper" };
147015
- _hoisted_3$54 = {
147375
+ _hoisted_3$54 = { class: "action-menu" };
147376
+ _hoisted_4$39 = { class: "item-icon" };
147377
+ _hoisted_5$29 = { class: "action-menu" };
147378
+ _hoisted_6$19 = { class: "item-icon" };
147379
+ _hoisted_7$15 = { class: "item-icon" };
147380
+ _hoisted_8$11 = { class: "item-icon" };
147381
+ _hoisted_9$6 = {
147016
147382
  key: 0,
147017
147383
  class: "action-menu"
147018
147384
  };
147019
- _hoisted_4$39 = { class: "item-icon" };
147020
- _hoisted_5$29 = { class: "item-icon" };
147021
- _hoisted_6$19 = { class: "item-icon" };
147022
- _hoisted_7$15 = {
147385
+ _hoisted_10$5 = { class: "item-icon" };
147386
+ _hoisted_11$4 = {
147023
147387
  key: 1,
147024
147388
  class: "action-menu"
147025
147389
  };
147026
- _hoisted_8$11 = { class: "item-icon" };
147027
- _hoisted_9$6 = { class: "action-menu" };
147028
- _hoisted_10$5 = { class: "item-icon scale-large" };
147029
- _hoisted_11$4 = { class: "item-icon" };
147030
147390
  _hoisted_12$3 = { class: "item-icon" };
147031
- _hoisted_13$2 = { class: "item-icon scale-large" };
147032
- _hoisted_14$2 = { class: "item-label flex-between-center" };
147033
- _hoisted_15$2 = { class: "item-icon scale-large" };
147034
- _hoisted_16$2 = { class: "item-label flex-between-center" };
147035
- _hoisted_17$1 = {
147036
- key: 2,
147391
+ _hoisted_13$2 = {
147392
+ key: 1,
147037
147393
  class: "action-menu"
147038
147394
  };
147395
+ _hoisted_14$2 = { class: "item-icon" };
147396
+ _hoisted_15$2 = { class: "action-menu" };
147397
+ _hoisted_16$2 = { class: "item-icon scale-large" };
147398
+ _hoisted_17$1 = { class: "item-icon" };
147039
147399
  _hoisted_18$1 = { class: "item-icon" };
147040
- _hoisted_19 = { class: "sub-more-btn" };
147041
- _hoisted_20 = { class: "sub-more-btn-item" };
147400
+ _hoisted_19 = { class: "item-icon scale-large" };
147401
+ _hoisted_20 = { class: "item-label flex-between-center" };
147402
+ _hoisted_21 = { class: "item-icon scale-large" };
147403
+ _hoisted_22 = { class: "item-label flex-between-center" };
147404
+ _hoisted_23 = {
147405
+ key: 0,
147406
+ class: "action-menu"
147407
+ };
147408
+ _hoisted_24 = { class: "item-icon" };
147409
+ _hoisted_25 = { class: "sub-more-btn" };
147410
+ _hoisted_26 = { class: "sub-more-btn-item" };
147042
147411
  repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_action_lang_default = /*@__PURE__*/ defineComponent({
147043
147412
  __name: "repeating-table-action",
147044
147413
  props: {
@@ -147119,12 +147488,20 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147119
147488
  const { subRenderer, subFieldKey, index } = getCtx();
147120
147489
  const visibleRows = getTableRows(subFieldKey, true);
147121
147490
  const { isMaterialConsume, isWarehouseInventory, isPretreatmentList } = subTableType.value;
147491
+ const canQuickFill = !!((_subRenderer$widgetMe = subRenderer.widgetMeta) === null || _subRenderer$widgetMe === void 0 || (_subRenderer$widgetMe = _subRenderer$widgetMe.props) === null || _subRenderer$widgetMe === void 0 ? void 0 : _subRenderer$widgetMe.quickFill);
147492
+ const canCopy = !isWarehouseInventory && !isPretreatmentList && !isMaterialConsume;
147493
+ const canInsertMulti = !isMaterialConsume;
147494
+ const canDelete = visibleRows.length > 1;
147495
+ const canClear = isMaterialConsume && visibleRows.length === 1 && !!props.isLastRow;
147496
+ const isConfirmed = !!((_visibleRows$index = visibleRows[index]) === null || _visibleRows$index === void 0 ? void 0 : _visibleRows$index.is_confirmed_);
147122
147497
  return {
147123
- canQuickFill: !!((_subRenderer$widgetMe = subRenderer.widgetMeta) === null || _subRenderer$widgetMe === void 0 || (_subRenderer$widgetMe = _subRenderer$widgetMe.props) === null || _subRenderer$widgetMe === void 0 ? void 0 : _subRenderer$widgetMe.quickFill),
147124
- canCopy: !isWarehouseInventory && !isPretreatmentList,
147125
- canInsertMulti: !isMaterialConsume,
147126
- canDelete: visibleRows.length > 1 && (isMaterialConsume ? props.isLastRow : true),
147127
- canEdit: !!((_visibleRows$index = visibleRows[index]) === null || _visibleRows$index === void 0 ? void 0 : _visibleRows$index.is_confirmed_)
147498
+ canQuickFill,
147499
+ canCopy,
147500
+ canInsertMulti,
147501
+ canDelete,
147502
+ canClear,
147503
+ canEdit: isConfirmed,
147504
+ canInsertMcRow: isMaterialConsume && !isConfirmed
147128
147505
  };
147129
147506
  });
147130
147507
  const mcTableCtrl = computed(() => {
@@ -147132,10 +147509,6 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147132
147509
  const { valuePath } = getCtx();
147133
147510
  return tmplBomCRef === null || tmplBomCRef === void 0 || (_tmplBomCRef$value = tmplBomCRef.value) === null || _tmplBomCRef$value === void 0 ? void 0 : _tmplBomCRef$value.tableControllers[valuePath];
147134
147511
  });
147135
- const mcTableIsBomPattern = computed(() => {
147136
- var _mcTableCtrl$value;
147137
- return ((_mcTableCtrl$value = mcTableCtrl.value) === null || _mcTableCtrl$value === void 0 ? void 0 : _mcTableCtrl$value.mcPattern) === MaterialConsumptionPatternEnum.BOM;
147138
- });
147139
147512
  const handleMaterialConsumeAction = async (val) => {
147140
147513
  const ctrl = mcTableCtrl.value;
147141
147514
  const { tableName, valuePath, subFieldKey, subModelKey, index: rowIndex } = getCtx();
@@ -147153,7 +147526,7 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147153
147526
  subModelKey,
147154
147527
  subFieldOptions: getSubFieldOptions(subModelKey)
147155
147528
  });
147156
- else if (val === "edit-row") ctrl.editRow({
147529
+ else if (val === "edit-row") await ctrl.editRow({
147157
147530
  dataManager,
147158
147531
  subFieldKey,
147159
147532
  rowIndex
@@ -147165,7 +147538,21 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147165
147538
  rowIndex
147166
147539
  }, doc);
147167
147540
  if (insertedIndex !== void 0) handleRowIncreased(subFieldKey, insertedIndex);
147168
- }
147541
+ } else if (val === "add-row") {
147542
+ const insertedIndex = ctrl.addRowForGroup({
147543
+ dataManager,
147544
+ subFieldKey,
147545
+ rowIndex
147546
+ }, doc);
147547
+ if (insertedIndex !== void 0) handleRowIncreased(subFieldKey, insertedIndex);
147548
+ } else if (val === "clear-row") GctModal.confirm("是否确认清除内容?", () => {
147549
+ ctrl.clearRow({
147550
+ dataManager,
147551
+ subFieldKey,
147552
+ rowIndex
147553
+ }, doc);
147554
+ handleRowIncreased(subFieldKey, rowIndex);
147555
+ });
147169
147556
  };
147170
147557
  const handleMaterialBalanceAction = async () => {
147171
147558
  await openMaterialBalanceConsumeModal({ doc: props.doc });
@@ -147198,9 +147585,13 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147198
147585
  */
147199
147586
  const handleRowIncreased = (subFieldKey, rowIndex) => {
147200
147587
  if (subTableType.value.isMaterialConsume) {
147201
- var _mcTableCtrl$value2;
147202
- (_mcTableCtrl$value2 = mcTableCtrl.value) === null || _mcTableCtrl$value2 === void 0 || _mcTableCtrl$value2.updateRowConsumed(props.doc);
147203
- if (mcTableIsBomPattern.value) MCDataUtil.updateQtyRequiredDisablement(props.doc.dataManager, `$.${subFieldKey}[${rowIndex}]`, true);
147588
+ var _mcTableCtrl$value, _props$doc$dataManage;
147589
+ (_mcTableCtrl$value = mcTableCtrl.value) === null || _mcTableCtrl$value === void 0 || _mcTableCtrl$value.updateRowConsumed(props.doc);
147590
+ const row = (_props$doc$dataManage = props.doc.dataManager.getRawData()[subFieldKey]) === null || _props$doc$dataManage === void 0 ? void 0 : _props$doc$dataManage[rowIndex];
147591
+ if (row) {
147592
+ var _mcTableCtrl$value2;
147593
+ (_mcTableCtrl$value2 = mcTableCtrl.value) === null || _mcTableCtrl$value2 === void 0 || _mcTableCtrl$value2.syncEditingRowDisablement(props.doc.dataManager, `$.${subFieldKey}[${rowIndex}]`, row);
147594
+ }
147204
147595
  }
147205
147596
  new TableRuntime(props.doc).onRowInit(subFieldKey, rowIndex);
147206
147597
  };
@@ -147275,76 +147666,104 @@ var init_repeating_table_action_vue_vue_type_script_setup_true_name_sub_table_ac
147275
147666
  "instant-move": ""
147276
147667
  }, {
147277
147668
  popper: withCtx(() => [createElementVNode("div", _hoisted_2$81, [
147278
- subTableType.value.isMaterialConsume ? (openBlock(), createElementBlock("div", _hoisted_3$54, [
147279
- _cache[16] || (_cache[16] = createElementVNode("div", { class: "menu-title" }, "业务操作", -1)),
147280
- actionInfo.value.canEdit ? (openBlock(), createElementBlock("div", {
147281
- key: 0,
147669
+ subTableType.value.isMaterialConsume ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
147670
+ createElementVNode("div", _hoisted_3$54, [_cache[17] || (_cache[17] = createElementVNode("div", { class: "menu-title" }, "业务操作", -1)), createElementVNode("div", {
147282
147671
  class: "menu-item",
147283
- onClick: _cache[0] || (_cache[0] = ($event) => handleMaterialConsumeAction("edit-row"))
147284
- }, [createElementVNode("div", _hoisted_4$39, [createVNode(unref(icon_default), { icon: "icon-bianji" })]), _cache[13] || (_cache[13] = createElementVNode("div", { class: "item-label" }, "编辑", -1))])) : createCommentVNode("", true),
147285
- __props.isLastRow ? (openBlock(), createElementBlock("div", {
147286
- key: 1,
147672
+ onClick: _cache[0] || (_cache[0] = ($event) => handleMaterialConsumeAction("scan"))
147673
+ }, [createElementVNode("div", _hoisted_4$39, [createVNode(unref(icon_default), {
147674
+ icon: "icon-saoma1",
147675
+ size: "16"
147676
+ })]), _cache[16] || (_cache[16] = createElementVNode("div", { class: "item-label" }, "条码扫描", -1))])]),
147677
+ createElementVNode("div", _hoisted_5$29, [
147678
+ _cache[21] || (_cache[21] = createElementVNode("div", { class: "menu-title" }, "行编辑", -1)),
147679
+ actionInfo.value.canEdit ? (openBlock(), createElementBlock("div", {
147680
+ key: 0,
147681
+ class: "menu-item",
147682
+ onClick: _cache[1] || (_cache[1] = ($event) => handleMaterialConsumeAction("edit-row"))
147683
+ }, [createElementVNode("div", _hoisted_6$19, [createVNode(unref(icon_default), {
147684
+ icon: "icon-zhongxinbianjidangqianhang",
147685
+ size: "20"
147686
+ })]), _cache[18] || (_cache[18] = createElementVNode("div", { class: "item-label" }, "重新编辑当前行", -1))])) : createCommentVNode("", true),
147687
+ actionInfo.value.canInsertMcRow ? (openBlock(), createElementBlock("div", {
147688
+ key: 1,
147689
+ class: "menu-item",
147690
+ onClick: _cache[2] || (_cache[2] = ($event) => handleMaterialConsumeAction("add-row"))
147691
+ }, [createElementVNode("div", _hoisted_7$15, [createVNode(unref(icon_default), {
147692
+ icon: "icon-jiayihang",
147693
+ size: "20"
147694
+ })]), _cache[19] || (_cache[19] = createElementVNode("div", { class: "item-label" }, "加一行", -1))])) : createCommentVNode("", true),
147695
+ createElementVNode("div", {
147696
+ class: "menu-item",
147697
+ onClick: _cache[3] || (_cache[3] = ($event) => handleMaterialConsumeAction("add-group"))
147698
+ }, [createElementVNode("div", _hoisted_8$11, [createVNode(unref(icon_default), {
147699
+ icon: "icon-jiayihang",
147700
+ size: "20"
147701
+ })]), _cache[20] || (_cache[20] = createElementVNode("div", { class: "item-label" }, "加一组", -1))])
147702
+ ]),
147703
+ actionInfo.value.canDelete ? (openBlock(), createElementBlock("div", _hoisted_9$6, [createElementVNode("div", {
147287
147704
  class: "menu-item",
147288
- onClick: _cache[1] || (_cache[1] = ($event) => handleMaterialConsumeAction("scan"))
147289
- }, [createElementVNode("div", _hoisted_5$29, [createVNode(unref(icon_default), { icon: "icon-saoyisao" })]), _cache[14] || (_cache[14] = createElementVNode("div", { class: "item-label" }, "条码扫描", -1))])) : createCommentVNode("", true),
147290
- __props.isLastRow ? (openBlock(), createElementBlock("div", {
147291
- key: 2,
147705
+ onClick: _cache[4] || (_cache[4] = ($event) => handleAction("deleteRowCurrent"))
147706
+ }, [createElementVNode("div", _hoisted_10$5, [createVNode(unref(icon_default), {
147707
+ icon: "icon-a-shanchubiaoge",
147708
+ size: "16"
147709
+ })]), _cache[22] || (_cache[22] = createElementVNode("div", { class: "item-label" }, "删除行", -1))])])) : actionInfo.value.canClear ? (openBlock(), createElementBlock("div", _hoisted_11$4, [createElementVNode("div", {
147292
147710
  class: "menu-item",
147293
- onClick: _cache[2] || (_cache[2] = ($event) => handleMaterialConsumeAction("add-group"))
147294
- }, [createElementVNode("div", _hoisted_6$19, [createVNode(unref(icon_default), { icon: "icon-tianjia" })]), _cache[15] || (_cache[15] = createElementVNode("div", { class: "item-label" }, "加一组", -1))])) : createCommentVNode("", true)
147295
- ])) : createCommentVNode("", true),
147296
- businessScanMenu.value ? (openBlock(), createElementBlock("div", _hoisted_7$15, [_cache[18] || (_cache[18] = createElementVNode("div", { class: "menu-title" }, "业务操作", -1)), createElementVNode("div", {
147711
+ onClick: _cache[5] || (_cache[5] = ($event) => handleMaterialConsumeAction("clear-row"))
147712
+ }, [createElementVNode("div", _hoisted_12$3, [createVNode(unref(icon_default), {
147713
+ icon: "icon-a-shanchubiaoge",
147714
+ size: "16"
147715
+ })]), _cache[23] || (_cache[23] = createElementVNode("div", { class: "item-label" }, "清除内容", -1))])])) : createCommentVNode("", true)
147716
+ ], 64)) : createCommentVNode("", true),
147717
+ businessScanMenu.value ? (openBlock(), createElementBlock("div", _hoisted_13$2, [_cache[25] || (_cache[25] = createElementVNode("div", { class: "menu-title" }, "业务操作", -1)), createElementVNode("div", {
147297
147718
  class: "menu-item",
147298
147719
  onClick: handleBusinessScanAction
147299
- }, [createElementVNode("div", _hoisted_8$11, [createVNode(unref(icon_default), { icon: "icon-saoyisao" })]), _cache[17] || (_cache[17] = createElementVNode("div", { class: "item-label" }, " 条码扫描 ", -1))])])) : createCommentVNode("", true),
147300
- createElementVNode("div", _hoisted_9$6, [
147720
+ }, [createElementVNode("div", _hoisted_14$2, [createVNode(unref(icon_default), { icon: "icon-saoyisao" })]), _cache[24] || (_cache[24] = createElementVNode("div", { class: "item-label" }, " 条码扫描 ", -1))])])) : createCommentVNode("", true),
147721
+ !subTableType.value.isMaterialConsume ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [createElementVNode("div", _hoisted_15$2, [
147301
147722
  actionInfo.value.canQuickFill ? (openBlock(), createElementBlock("div", {
147302
147723
  key: 0,
147303
147724
  class: "menu-item",
147304
- onClick: _cache[3] || (_cache[3] = ($event) => unref(handleOpenDynamicQuickFillModal)(props))
147305
- }, [createElementVNode("div", _hoisted_10$5, [createVNode(unref(icon_default), { icon: "icon-zhongxinbianjidangqianhang" })]), _cache[19] || (_cache[19] = createElementVNode("div", { class: "item-label" }, "快速填报", -1))])) : createCommentVNode("", true),
147306
- _cache[24] || (_cache[24] = createElementVNode("div", { class: "menu-title" }, "行编辑", -1)),
147307
- !subTableType.value.isMaterialConsume ? (openBlock(), createElementBlock("div", {
147308
- key: 1,
147725
+ onClick: _cache[6] || (_cache[6] = ($event) => unref(handleOpenDynamicQuickFillModal)(props))
147726
+ }, [createElementVNode("div", _hoisted_16$2, [createVNode(unref(icon_default), { icon: "icon-zhongxinbianjidangqianhang" })]), _cache[26] || (_cache[26] = createElementVNode("div", { class: "item-label" }, "快速填报", -1))])) : createCommentVNode("", true),
147727
+ _cache[31] || (_cache[31] = createElementVNode("div", { class: "menu-title" }, "行编辑", -1)),
147728
+ createElementVNode("div", {
147309
147729
  class: "menu-item",
147310
- onClick: _cache[4] || (_cache[4] = ($event) => handleAction("insertRowAfter"))
147311
- }, [createElementVNode("div", _hoisted_11$4, [createVNode(unref(icon_default), { icon: "icon-tianjia" })]), _cache[20] || (_cache[20] = createElementVNode("div", { class: "item-label" }, " 加一行 ", -1))])) : createCommentVNode("", true),
147730
+ onClick: _cache[7] || (_cache[7] = ($event) => handleAction("insertRowAfter"))
147731
+ }, [createElementVNode("div", _hoisted_17$1, [createVNode(unref(icon_default), { icon: "icon-tianjia" })]), _cache[27] || (_cache[27] = createElementVNode("div", { class: "item-label" }, " 加一行 ", -1))]),
147312
147732
  actionInfo.value.canCopy ? (openBlock(), createElementBlock("div", {
147313
- key: 2,
147733
+ key: 1,
147314
147734
  class: "menu-item",
147315
- onClick: _cache[5] || (_cache[5] = ($event) => handleAction("copyCurrentRow"))
147316
- }, [createElementVNode("div", _hoisted_12$3, [createVNode(unref(icon_default), { icon: "icon-fuzhihang" })]), _cache[21] || (_cache[21] = createElementVNode("div", { class: "item-label" }, " 复制行 ", -1))])) : createCommentVNode("", true),
147735
+ onClick: _cache[8] || (_cache[8] = ($event) => handleAction("copyCurrentRow"))
147736
+ }, [createElementVNode("div", _hoisted_18$1, [createVNode(unref(icon_default), { icon: "icon-fuzhihang" })]), _cache[28] || (_cache[28] = createElementVNode("div", { class: "item-label" }, " 复制行 ", -1))])) : createCommentVNode("", true),
147317
147737
  actionInfo.value.canInsertMulti ? (openBlock(), createElementBlock("div", {
147318
- key: 3,
147738
+ key: 2,
147319
147739
  class: "menu-item",
147320
- onClick: _cache[8] || (_cache[8] = ($event) => handleAction("insertRowBeforeMore"))
147321
- }, [createElementVNode("div", _hoisted_13$2, [createVNode(unref(icon_default), { icon: "icon-shangfangcharuhang" })]), createElementVNode("div", _hoisted_14$2, [_cache[22] || (_cache[22] = createElementVNode("div", null, " 在上方插入行 ", -1)), createVNode(unref(input_number_default), {
147740
+ onClick: _cache[11] || (_cache[11] = ($event) => handleAction("insertRowBeforeMore"))
147741
+ }, [createElementVNode("div", _hoisted_19, [createVNode(unref(icon_default), { icon: "icon-shangfangcharuhang" })]), createElementVNode("div", _hoisted_20, [_cache[29] || (_cache[29] = createElementVNode("div", null, " 在上方插入行 ", -1)), createVNode(unref(input_number_default), {
147322
147742
  modelValue: formState.upRowNum,
147323
- "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => formState.upRowNum = $event),
147743
+ "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => formState.upRowNum = $event),
147324
147744
  min: 1,
147325
147745
  integer: "",
147326
147746
  style: { "width": "68px" },
147327
- onClick: _cache[7] || (_cache[7] = withModifiers(() => {}, ["stop"]))
147747
+ onClick: _cache[10] || (_cache[10] = withModifiers(() => {}, ["stop"]))
147328
147748
  }, null, 8, ["modelValue"])])])) : createCommentVNode("", true),
147329
147749
  actionInfo.value.canInsertMulti ? (openBlock(), createElementBlock("div", {
147330
- key: 4,
147750
+ key: 3,
147331
147751
  class: "menu-item",
147332
- onClick: _cache[11] || (_cache[11] = ($event) => handleAction("insertRowAfterMore"))
147333
- }, [createElementVNode("div", _hoisted_15$2, [createVNode(unref(icon_default), { icon: "icon-xiafangcharuhang" })]), createElementVNode("div", _hoisted_16$2, [_cache[23] || (_cache[23] = createElementVNode("div", null, " 在下方插入行 ", -1)), createVNode(unref(input_number_default), {
147752
+ onClick: _cache[14] || (_cache[14] = ($event) => handleAction("insertRowAfterMore"))
147753
+ }, [createElementVNode("div", _hoisted_21, [createVNode(unref(icon_default), { icon: "icon-xiafangcharuhang" })]), createElementVNode("div", _hoisted_22, [_cache[30] || (_cache[30] = createElementVNode("div", null, " 在下方插入行 ", -1)), createVNode(unref(input_number_default), {
147334
147754
  modelValue: formState.downRowNum,
147335
- "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => formState.downRowNum = $event),
147755
+ "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => formState.downRowNum = $event),
147336
147756
  min: 1,
147337
147757
  integer: "",
147338
147758
  style: { "width": "68px" },
147339
- onClick: _cache[10] || (_cache[10] = withModifiers(() => {}, ["stop"]))
147759
+ onClick: _cache[13] || (_cache[13] = withModifiers(() => {}, ["stop"]))
147340
147760
  }, null, 8, ["modelValue"])])])) : createCommentVNode("", true)
147341
- ]),
147342
- actionInfo.value.canDelete ? (openBlock(), createElementBlock("div", _hoisted_17$1, [createElementVNode("div", {
147761
+ ]), actionInfo.value.canDelete ? (openBlock(), createElementBlock("div", _hoisted_23, [createElementVNode("div", {
147343
147762
  class: "menu-item",
147344
- onClick: _cache[12] || (_cache[12] = ($event) => handleAction("deleteRowCurrent"))
147345
- }, [createElementVNode("div", _hoisted_18$1, [createVNode(unref(icon_default), { icon: "icon-shanchu1" })]), _cache[25] || (_cache[25] = createElementVNode("div", { class: "item-label" }, " 删除行 ", -1))])])) : createCommentVNode("", true)
147763
+ onClick: _cache[15] || (_cache[15] = ($event) => handleAction("deleteRowCurrent"))
147764
+ }, [createElementVNode("div", _hoisted_24, [createVNode(unref(icon_default), { icon: "icon-shanchu1" })]), _cache[32] || (_cache[32] = createElementVNode("div", { class: "item-label" }, " 删除行 ", -1))])])) : createCommentVNode("", true)], 64)) : createCommentVNode("", true)
147346
147765
  ])]),
147347
- default: withCtx(() => [createElementVNode("div", _hoisted_19, [createElementVNode("div", _hoisted_20, [createVNode(unref(icon_default), {
147766
+ default: withCtx(() => [createElementVNode("div", _hoisted_25, [createElementVNode("div", _hoisted_26, [createVNode(unref(icon_default), {
147348
147767
  icon: "icon-gengduo1",
147349
147768
  color: "#fff"
147350
147769
  })])])]),
@@ -20,7 +20,7 @@ export interface UpdateRowOption {
20
20
  * 物料消耗表字段控制 v2026.6.15
21
21
  * - [需求数量、已消耗数量] 始终只读
22
22
  * - [有效期、唯一标识、自定义字段] 始终可填(不做控制)
23
- * - 选择的物料类型是[查看物料]时 [批次、上料数量、工序] 只读
23
+ * - 选择的物料类型是[查看物料]时 [批次、上料数量] 只读(与 Excel calcDisabledFields 一致)
24
24
  * - 单行校验通过后(包括暂存后再次编辑)[物料、批次、上料数量、工序、需求数量单位、数量单位、转换后数量、转换数量单位ID、单位转化公式] 只读
25
25
  * v2026.7.30
26
26
  * - [物料消耗模式]是[记录模式]时,可以填写[需求数量](BOM 模式禁用 需求数量)
@@ -54,6 +54,14 @@ export declare class MCDataUtil {
54
54
  rowPath: string;
55
55
  disabled: boolean;
56
56
  }): void;
57
+ /**
58
+ * 编辑态行:按 Excel calcDisabledFields 禁用字段,其余受控字段可填
59
+ */
60
+ static applyEditingRowDisablement(option: {
61
+ dataManager: DataManager;
62
+ rowPath: string;
63
+ disabledFields: string[];
64
+ }): void;
57
65
  /**
58
66
  * 校验通过后,更新指定字段是否禁用
59
67
  * 参顶部[物料消耗表字段控制]
@@ -157,13 +165,15 @@ export declare class MaterialConsumeTableController {
157
165
  * 未填报时初始化消耗表行数据
158
166
  * @param defaultData 子表行默认值(含工序等)
159
167
  */
160
- initTableData(dataManager: DataManager, subFieldKey: string, defaultData?: Record<string, any>): void;
168
+ initTableData(dataManager: DataManager, subFieldKey: string, defaultData?: Record<string, any>): number[];
161
169
  /**
162
170
  * 根据数据计算需要禁用的字段
163
171
  * @param row
164
172
  * @return {*}
165
173
  */
166
174
  calcDisabledFields(row: IMaterialConsumeData): (keyof IMaterialConsumeData)[];
175
+ /** 可编辑行:对齐 Excel getNewTdInfo + calcDisabledFields */
176
+ syncEditingRowDisablement(dataManager: DataManager, rowPath: string, row: IMaterialConsumeData): void;
167
177
  /**
168
178
  * 获取是否是 物料查看
169
179
  * @param product_id_
@@ -285,6 +295,14 @@ export declare class MaterialConsumeTableController {
285
295
  * 返回新行在活跃数据中的下标,调用方据此执行 Word 子表行初始化。
286
296
  */
287
297
  addGroup(option: UpdateRowOption, doc: Doc): Promise<number | undefined>;
298
+ /**
299
+ * 组内加一行:当前行下方插入,继承 bom_entry_id_。
300
+ */
301
+ addRowForGroup(option: UpdateRowOption, doc: Doc): number | undefined;
302
+ /**
303
+ * 仅剩一行时清空内容:保留行身份和默认值,并断开 BOM 组。
304
+ */
305
+ clearRow(option: UpdateRowOption, doc: Doc): void;
288
306
  /**
289
307
  * 更新整个数组的所有行的已消耗数量
290
308
  *
@@ -72,5 +72,13 @@ export declare function getReinspectionDate(params: {
72
72
  material_no_?: string;
73
73
  material_no_id_?: string;
74
74
  }): Promise<string | undefined>;
75
+ /** 物料+批次查复检日期;缺任一参数不查;无日期放过;小于当天则 throw */
76
+ export declare function assertReinspectionDate(opts: {
77
+ product_id_?: string;
78
+ material_no_?: string;
79
+ material_no_id_?: string;
80
+ }): Promise<void>;
81
+ /** 主表物料 RDO 引用:`baseId:versionId`。无法拼出则返回 undefined,禁止写裸版本 id。 */
82
+ export declare function resolveProductRdoRef(raw?: unknown, option?: Record<string, unknown> | null): Promise<string | undefined>;
75
83
  /** 查批次锁定记录(最新一条) */
76
84
  export declare function getLotLockedReason(production_identification_id_: string): Promise<string>;
@@ -20,6 +20,8 @@ export interface SelectQueryContext {
20
20
  };
21
21
  /** 模拟填报:工序不传 operating_state_,避免模板数据被启用态滤空 */
22
22
  isMockReport?: boolean;
23
+ /** 当前工序 id,用于限定可选工序 */
24
+ routingOperationId?: string;
23
25
  }
24
26
  export interface SelectQueryResult {
25
27
  queryData?: Record<string, any>;
@@ -25,16 +25,31 @@ export declare function validateObjectBomForScan(opts: {
25
25
  belongingObject?: string;
26
26
  productId?: string;
27
27
  }): void;
28
+ type ObjectBomSelectOpts = {
29
+ formInstBom?: FormInstBomResponse | null;
30
+ belongingObject?: string;
31
+ };
28
32
  /**
29
- * 物料消耗对象物料批下拉:未开人为指定时,限制为 BOM 主料 + 已开替代料的替代料
30
- * - 无需过滤时返回 null(无 belongingObject / 无配置 / 人为指定)
33
+ * 物料消耗对象物料批下拉:限制为 BOM 主料 + 已开替代料的替代料
34
+ * - 无需过滤时返回 null(无配置 / 记录模式 / 人为指定)
31
35
  * - 无候选时用占位 id,避免空数组被后端当成不筛选
32
36
  */
33
- export declare function getObjectBomMaterialLotQuery(opts: {
34
- formInstBom?: FormInstBomResponse | null;
35
- belongingObject?: string;
36
- }): {
37
+ export declare function getObjectBomMaterialLotQuery(opts: ObjectBomSelectOpts): {
38
+ 'product_id_.versionIn': string[];
39
+ } | null;
40
+ /**
41
+ * 物料消耗对象物料下拉:限制为 BOM 主料 + 已开替代料的替代料
42
+ * - 无需过滤时返回 null(无配置 / 记录模式 / 人为指定)
43
+ * - 无候选时用占位 id,避免空数组被后端当成不筛选
44
+ */
45
+ export declare function getObjectBomProductQuery(opts: ObjectBomSelectOpts): {
46
+ 'id_.in': string[];
47
+ } | null;
48
+ /** 对象下拉按字段类型取 BOM 过滤;非物料/批次返回 null */
49
+ export declare function getObjectBomDropdownQuery(fieldType: string | undefined, opts: ObjectBomSelectOpts): {
37
50
  'product_id_.versionIn': string[];
51
+ } | {
52
+ 'id_.in': string[];
38
53
  } | null;
39
54
  /**
40
55
  * 表单提交:校验所有物料消耗对象的数量 vs 需求数量
@@ -50,3 +65,4 @@ export declare function validateObjectBomQtyOnSubmit(opts: {
50
65
  field: string;
51
66
  message: string;
52
67
  } | null>;
68
+ export {};
@@ -1,2 +1,3 @@
1
1
  export * from './use-tmpl-bom';
2
2
  export * from './bom-validator';
3
+ export * from './linkage';
@@ -0,0 +1,64 @@
1
+ interface ConsumeObjectDoc {
2
+ isInEditMode?: () => boolean;
3
+ mainModelKey: string;
4
+ fieldModelQuery: {
5
+ getFieldList: (modelKey: string) => Array<{
6
+ key: string;
7
+ type?: string;
8
+ bizType?: string;
9
+ }> | undefined;
10
+ };
11
+ dataManager: {
12
+ get: (path: string) => unknown;
13
+ };
14
+ model?: {
15
+ getWidgetInstances?: () => any[];
16
+ };
17
+ }
18
+ export interface ConsumeObjectSelectUpdatesOpts {
19
+ doc: ConsumeObjectDoc;
20
+ belongingObject?: string;
21
+ fieldType?: string;
22
+ selectedOption?: Record<string, unknown> | null;
23
+ pending?: Record<string, unknown>;
24
+ }
25
+ /**
26
+ * 消耗对象批次下拉:同组物料有值时按该物料版本过滤,替换 BOM versionIn。
27
+ */
28
+ export declare function getConsumeObjectLotProductQuery(opts: {
29
+ doc: ConsumeObjectDoc;
30
+ belongingObject?: string;
31
+ fieldType?: string;
32
+ }): {
33
+ 'product_id_.versionEq': string;
34
+ } | null;
35
+ /**
36
+ * 物料消耗对象下拉联动:
37
+ * - 改/清物料:清空同组批次
38
+ * - 选批次且 option 有物料 id:写入同组物料(RDO `base:version`)
39
+ * - 清批次 / 手输批次:不动物料
40
+ * - 选批次但解析不出 RDO 引用:throw,调用方不得写入批次
41
+ */
42
+ export declare function buildConsumeObjectSelectUpdates(opts: ConsumeObjectSelectUpdatesOpts): Promise<Record<string, unknown>>;
43
+ /** 扫码写入同组物料:路径与下拉一致;解析失败 throw。 */
44
+ export declare function buildConsumeObjectScanProductUpdate(opts: {
45
+ doc: ConsumeObjectDoc;
46
+ belongingObject?: string;
47
+ material?: Record<string, unknown> | null;
48
+ }): Promise<Record<string, unknown>>;
49
+ /**
50
+ * 消耗对象写入前的复检入参:用即将写入的物料+批次。
51
+ * 缺对象、缺物料或批次时返回 null(与消耗表缺参不查一致)。
52
+ * product_id_ 为版本 id,供 versionEq 使用。
53
+ */
54
+ export declare function getConsumeObjectReinspectionParams(opts: {
55
+ doc: ConsumeObjectDoc;
56
+ belongingObject?: string;
57
+ fieldType?: string;
58
+ nextValues?: Record<string, unknown>;
59
+ }): {
60
+ product_id_: string;
61
+ material_no_?: string;
62
+ material_no_id_?: string;
63
+ } | null;
64
+ export {};
package/dist/word.css CHANGED
@@ -9689,7 +9689,7 @@ textarea[data-v-a7d89044]::placeholder {
9689
9689
  /**
9690
9690
  * 字段态配色 —— DOM 控件子集(input / select / overlay)
9691
9691
  */
9692
- .widget-container-action[data-v-d63857b1] {
9692
+ .widget-container-action[data-v-5a0ffda2] {
9693
9693
  position: absolute;
9694
9694
  inset: 0;
9695
9695
  z-index: 999;
@@ -9697,7 +9697,7 @@ textarea[data-v-a7d89044]::placeholder {
9697
9697
  height: 0;
9698
9698
  pointer-events: all;
9699
9699
  }
9700
- .picker-trigger[data-v-d63857b1] {
9700
+ .picker-trigger[data-v-5a0ffda2] {
9701
9701
  display: flex;
9702
9702
  box-sizing: border-box;
9703
9703
  align-items: center;
@@ -9709,19 +9709,19 @@ textarea[data-v-a7d89044]::placeholder {
9709
9709
  outline: none;
9710
9710
  background-color: #fff;
9711
9711
  }
9712
- .picker-trigger.disabled[data-v-d63857b1] {
9712
+ .picker-trigger.disabled[data-v-5a0ffda2] {
9713
9713
  border: 1px solid rgba(13, 13, 13, 0.12);
9714
9714
  cursor: not-allowed;
9715
9715
  }
9716
- .picker-trigger.disabled .gct-icon[data-v-d63857b1] {
9716
+ .picker-trigger.disabled .gct-icon[data-v-5a0ffda2] {
9717
9717
  color: rgba(0, 0, 0, 0.25);
9718
9718
  }
9719
- .picker-trigger.readonly[data-v-d63857b1] {
9719
+ .picker-trigger.readonly[data-v-5a0ffda2] {
9720
9720
  border-color: #d9d9d9;
9721
9721
  background-color: #f5f6f8;
9722
9722
  cursor: default;
9723
9723
  }
9724
- .picker-trigger.readonly .gct-icon[data-v-d63857b1] {
9724
+ .picker-trigger.readonly .gct-icon[data-v-5a0ffda2] {
9725
9725
  color: rgba(0, 0, 0, 0.65);
9726
9726
  }
9727
9727
  .resize-box[data-v-788ab62c] {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gct-paas/word",
3
- "version": "0.1.74-beta.44",
3
+ "version": "0.1.74-beta.46",
4
4
  "description": "GCT 在线 word",
5
5
  "keywords": [
6
6
  "vue",