@gct-paas/excel 0.1.40-beta.0 → 0.1.40-beta.10

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.
Files changed (164) hide show
  1. package/dist/{BaseComponent-BTolXjlE.js → BaseComponent-DKaXUiq4.js} +2 -2
  2. package/dist/{VueVideoPlayer-Dvf7Ya7H.js → VueVideoPlayer-BeylL5J6.js} +2 -2
  3. package/dist/{align-editor-jp0NsOnT.js → align-editor-r0dHXFka.js} +1 -1
  4. package/dist/{barcode-design-ClfdoOKn.js → barcode-design-BCJkI4mq.js} +2 -2
  5. package/dist/base/index.es.js +668 -262
  6. package/dist/{diagonal-design-Br0xpyqC.js → diagonal-design-CAILyrwR.js} +2 -2
  7. package/dist/{dynamic-table-action-C-HIKtZG.js → dynamic-table-action-CHY5xNLE.js} +482 -286
  8. package/dist/{dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-BHExrYFJ.js → dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-8yB6zly8.js} +1181 -696
  9. package/dist/{edit.utils-CXmmCnxE-D4-n_eOM.js → edit.utils-CXmmCnxE-Cu6obgSA.js} +1 -1
  10. package/dist/excel.css +3304 -4069
  11. package/dist/{exceljs.min-BH63KI8s.js → exceljs.min-CuCLHH9n.js} +2 -2
  12. package/dist/{font-editor-QSpu9bjJ.js → font-editor-DsrS0BQJ.js} +3 -3
  13. package/dist/{image-design-ySQAmnTF.js → image-design-FDLY6DFg.js} +2 -2
  14. package/dist/{index-CN-rY-3F.js → index-7u6Pmaax.js} +1 -1
  15. package/dist/{index-D3IdoYWe.js → index-AGp5c3cl.js} +2 -2
  16. package/dist/{index-Ca8q7yXC.js → index-B-hfUWEs.js} +2 -2
  17. package/dist/{index-CMOvPSr6.js → index-B8pwnxas.js} +2 -2
  18. package/dist/{index-ibQys99q.js → index-BCsDTwbK.js} +1 -1
  19. package/dist/{index-D9zBCWpE.js → index-BIeu5JwZ.js} +2 -2
  20. package/dist/{index-oOLbaFI8.js → index-BPc_QQH5.js} +19468 -21212
  21. package/dist/{index-C2RMbM6E.js → index-BTfYHAPC.js} +2 -2
  22. package/dist/{index-BXXvFDgt.js → index-BdFPuj12.js} +1 -1
  23. package/dist/{index-QTmeSdj9.js → index-BsVPhbAx.js} +6 -3
  24. package/dist/{index-FSCxAVGq.js → index-C3SyXJii.js} +2 -2
  25. package/dist/{index-BxEjRF0o.js → index-C6jVSwAq.js} +2 -2
  26. package/dist/{index-uVpJOLb3.js → index-CFVecFFb.js} +53 -5
  27. package/dist/{index-C7DwXZ-K.js → index-CRIhEnfm.js} +1 -1
  28. package/dist/{index-Cf7KwZfa.js → index-CRW2rDyo.js} +6 -5
  29. package/dist/{index-DZGqXE3S.js → index-CTJlsdnr.js} +3 -3
  30. package/dist/{index-4_qe7Eco.js → index-CbmHekMw.js} +2 -2
  31. package/dist/{index-Qf8D5LdT.js → index-CwK_A9FR.js} +3 -3
  32. package/dist/{index-DbPA5PUX.js → index-DEHsGK91.js} +1 -1
  33. package/dist/{index-CvDQjwre.js → index-DGODLCja.js} +1 -1
  34. package/dist/{index-8yhxxqYM.js → index-DJiuJgNx.js} +1 -1
  35. package/dist/{index-BJ6ZaX-f.js → index-DOd1pUIe.js} +2 -2
  36. package/dist/{index-DYxskDRv.js → index-DPGs3mX0.js} +3 -3
  37. package/dist/{index-BOaDYNtp.js → index-DXNSTk5n.js} +2 -2
  38. package/dist/{index-BHiNdrGr.js → index-De6oWEZJ.js} +2 -2
  39. package/dist/{index-nBc_3R3r.js → index-DgLLlaiF.js} +1 -1
  40. package/dist/{index-B3mCVcXB.js → index-DkYlfWLa.js} +2 -2
  41. package/dist/{index-dhaw5vxN.js → index-Dl_ZgCRB.js} +3 -3
  42. package/dist/{index-BJQd1G0r.js → index-DoVHKpph.js} +6 -5
  43. package/dist/{index-CTO4kNz9.js → index-Go0PUrqy.js} +1 -1
  44. package/dist/{index-Cb-I6DkL.js → index-KxrgWfEL.js} +1 -1
  45. package/dist/{index-B6Bs-q34.js → index-dXOMuxrp.js} +2 -2
  46. package/dist/{index-CUrMIr2v.js → index-etlM6HzI.js} +2 -2
  47. package/dist/{index-2FWN7Q91.js → index-gGYvWSjX.js} +2 -2
  48. package/dist/{index-COx1-SPe.js → index-rZVFumSM.js} +2 -2
  49. package/dist/index.es.js +12 -10
  50. package/dist/{mb-render-BRejJNP-.js → mb-render-_IUbyYCY.js} +9 -3
  51. package/dist/{online-form-model-select.vue_vue_type_script_setup_true_name_online-form-model-select_lang-QX4lxsni.js → online-form-model-select.vue_vue_type_script_setup_true_name_online-form-model-select_lang-CnQiVFDN.js} +8 -1
  52. package/dist/{pagination-design-pTh3Fqbz.js → pagination-design-DsOKY9kM.js} +2 -2
  53. package/dist/paper-widget-design-BTxXtF4f.js +4 -0
  54. package/dist/{print-runtime-instance-CBUjws4D.js → print-runtime-instance-lfLuU2No.js} +1 -1
  55. package/dist/{print-snapshot-renderer-s0IhY_T_.js → print-snapshot-renderer-Di-YZz7g.js} +3 -3
  56. package/dist/{qrcode-design-CnKOb-s9.js → qrcode-design-BGptsxHU.js} +1 -1
  57. package/dist/{revo-grid.entry-BqbaKcyR.js → revo-grid.entry-BZADj2ve.js} +1 -1
  58. package/dist/{revogr-attribution_7.entry-jmN78nkb.js → revogr-attribution_7.entry-DbQASE7d.js} +3 -3
  59. package/dist/{revogr-clipboard_3.entry-eK74i7_f.js → revogr-clipboard_3.entry-BUDhUelS.js} +2 -2
  60. package/dist/{revogr-data_4.entry-D2lAUBEM.js → revogr-data_4.entry-0V57Lz9p.js} +2 -2
  61. package/dist/{revogr-filter-panel.entry-C-1WXBDy.js → revogr-filter-panel.entry-BJEYteeW.js} +1 -1
  62. package/dist/seal-design-BS24iQos.js +4 -0
  63. package/dist/{serialnumber-design-DEYD9ku_.js → serialnumber-design-BbjW4gnZ.js} +1 -1
  64. package/dist/shared/index.es.js +26 -24
  65. package/dist/{single-field-drop-Bd3PcWQF.js → single-field-drop-DP6_SO_H.js} +2 -2
  66. package/dist/{size-editor-DiZ8E2R6.js → size-editor-CcYZKUn5.js} +1 -1
  67. package/dist/src/domain/document-business/business/product-release/profile.d.ts +2 -0
  68. package/dist/src/domain/document-business/business/product-release/service.d.ts +2 -0
  69. package/dist/src/domain/document-business/index.d.ts +2 -0
  70. package/dist/src/domain/document-business/registry.d.ts +2 -0
  71. package/dist/src/domain/document-business/runtime/field-query-runtime.d.ts +4 -0
  72. package/dist/src/domain/document-business/types.d.ts +24 -0
  73. package/dist/src/domain/field/number/product-release-qty-manifest.d.ts +2 -0
  74. package/dist/src/domain/field/query-filter.d.ts +15 -0
  75. package/dist/src/domain/table/business/material/material-balance/profile/fields.d.ts +2 -0
  76. package/dist/src/domain/table/business/material/material-consume/profile/fields.d.ts +2 -0
  77. package/dist/src/domain/table/business/material/material-substitution/profile/field-keys.d.ts +37 -1
  78. package/dist/src/domain/table/business/material/material-substitution/runtime/row-change-handlers.d.ts +3 -0
  79. package/dist/src/domain/table/business/material/material-substitution/runtime/select-loaders.d.ts +8 -0
  80. package/dist/src/domain/table/business/preprocess/pretreatment-list/profile/field-keys.d.ts +1 -7
  81. package/dist/src/domain/table/business/sterilize/entrust-steril-batch-list/profile/field-keys.d.ts +2 -0
  82. package/dist/src/domain/table/business/sterilize/entrust-steril-batch-list/profile/fields.d.ts +2 -0
  83. package/dist/src/domain/table/business/warehouse/shared/autofill-source-labels.d.ts +19 -0
  84. package/dist/src/domain/table/design/autofill-expander.d.ts +2 -0
  85. package/dist/src/domain/table/design/hooks/on-field-attach.d.ts +6 -0
  86. package/dist/src/domain/table/index.d.ts +1 -1
  87. package/dist/src/domain/table/types.d.ts +2 -0
  88. package/dist/src/index.d.ts +2 -0
  89. package/dist/src/nocode-base/src/core/sub-table/allocate-table-core.d.ts +2 -1
  90. package/dist/src/nocode-base/src/core/sub-table/pretreatment-list-table-core.d.ts +1 -0
  91. package/dist/src/nocode-base/src/core/sub-table/profile-driven-sub-table-core.d.ts +3 -3
  92. package/dist/src/nocode-base/src/core/sub-table/sub-table-core.d.ts +2 -1
  93. package/dist/src/nocode-base/src/core/sub-table/utils/sterilize/field-keys.d.ts +1 -2
  94. package/dist/src/nocode-base/src/hooks/form-model/form-model-controller.d.ts +2 -0
  95. package/dist/src/nocode-base/src/hooks/formula-params-cache.d.ts +15 -0
  96. package/dist/src/nocode-base/src/hooks/inspection-module-qty.d.ts +4 -0
  97. package/dist/src/nocode-base/src/hooks/material-consume/material-consume-table-controller.d.ts +1 -0
  98. package/dist/src/nocode-base/src/hooks/material-consume/tmpl-bom-controller.d.ts +12 -7
  99. package/dist/src/nocode-base/src/hooks/material-consume-object/bom-validator.d.ts +4 -3
  100. package/dist/src/nocode-base/src/hooks/material-consume-object/initialize-autofill.d.ts +17 -0
  101. package/dist/src/nocode-base/src/hooks/material-consume-object/object-validation-controller.d.ts +24 -0
  102. package/dist/src/nocode-base/src/hooks/render-page/initialize-runtime.d.ts +3 -7
  103. package/dist/src/nocode-base/src/hooks/render-page/sterilization-date.d.ts +3 -0
  104. package/dist/src/nocode-base/src/hooks/render-page/types.d.ts +4 -1
  105. package/dist/src/nocode-base/src/hooks/useCalcFunction.d.ts +8 -2
  106. package/dist/src/nocode-base/src/hooks/useRenderPageFactory.d.ts +7 -6
  107. package/dist/src/nocode-base/src/hooks/validation/createValidateFactory.d.ts +1 -0
  108. package/dist/src/nocode-base/src/interface/ref-loader.d.ts +12 -1
  109. package/dist/src/nocode-base/src/interface/render.d.ts +3 -1
  110. package/dist/src/nocode-base/src/interface/transform.d.ts +9 -1
  111. package/dist/src/nocode-base/src/runtime/async-task-coordinator.d.ts +6 -2
  112. package/dist/src/nocode-base/src/runtime/multi-sheet-runtime.d.ts +2 -0
  113. package/dist/src/nocode-base/src/runtime/runtime-field-initializer.d.ts +2 -1
  114. package/dist/src/nocode-base/src/runtime/runtime-form-state-store.d.ts +6 -0
  115. package/dist/src/nocode-base/src/runtime/runtime-validation-service.d.ts +1 -0
  116. package/dist/src/nocode-base/src/runtime/table-row-identity.d.ts +11 -2
  117. package/dist/src/nocode-base/src/types/common/base.d.ts +2 -0
  118. package/dist/src/nocode-base/src/types/fields/i-sign.d.ts +1 -1
  119. package/dist/src/nocode-base/src/types/render/mc-render.d.ts +1 -1
  120. package/dist/src/nocode-base/src/types/render/sub-table-render.d.ts +5 -1
  121. package/dist/src/nocode-web-render/src/render/sub-table/common/inventory-scan-columns.d.ts +6 -0
  122. package/dist/src/nocode-web-render/src/render/sub-table/material-consume/mc-web-render.d.ts +1 -1
  123. package/dist/src/online-form/src/views/__cell_widgets__/cell-widget-design.vue.d.ts +1 -0
  124. package/dist/src/online-form/src/views/__cell_widgets__/common/display-fields-editor/display-fields.util.d.ts +2 -2
  125. package/dist/src/online-form/src/views/__cell_widgets__/fake-field/fake-option-select.vue.d.ts +1 -0
  126. package/dist/src/online-form/src/views/designer/constants/index.d.ts +1 -0
  127. package/dist/src/online-form/src/views/designer/conversions/normalize-paper-grid.d.ts +3 -0
  128. package/dist/src/online-form/src/views/designer/utils/placed-fields.d.ts +9 -0
  129. package/dist/src/online-form/src/views/designer/utils/template-placed-fields.d.ts +7 -0
  130. package/dist/src/online-form/src/views/render/__components__/_field_/seal/component/seal-floating-field.vue.d.ts +0 -1
  131. package/dist/src/online-form/src/views/render/__components__/_field_/seal/component/seal-runtime-layer.vue.d.ts +0 -1
  132. package/dist/src/online-form/src/views/render/__components__/_field_/seal/component/use-seal-stamp.d.ts +1 -4
  133. package/dist/src/online-form/src/views/render/__components__/_field_/trace/utils/use-rule-props.d.ts +0 -3
  134. package/dist/src/online-form/src/views/render/sheet-tab-bar.vue.d.ts +5 -3
  135. package/dist/src/shared/components/DoubleInput/double-input.vue.d.ts +162 -2
  136. package/dist/src/shared/components/LimitedNumberInput/limited-number-input.vue.d.ts +41 -0
  137. package/dist/src/shared/components/LimitedNumberInput/number-input-rules.d.ts +16 -0
  138. package/dist/src/shared/components/Signature/logic/index.d.ts +15 -1
  139. package/dist/src/shared/enum/field-type.d.ts +9 -2
  140. package/dist/src/shared/enum/index.d.ts +2 -0
  141. package/dist/src/shared/enum/product-type.d.ts +9 -0
  142. package/dist/src/shared/enum/production-identification.d.ts +19 -0
  143. package/dist/src/shared/utils/withRequestCache.d.ts +27 -0
  144. package/dist/{sub-table-factory-B6HdlZ7-.js → sub-table-factory-B0YWwWSA.js} +233 -152
  145. package/dist/{text-design-D2IwsbOW.js → text-design-CquXT5UG.js} +2 -2
  146. package/dist/{throttle-Cpk1LoGk-DRpYOKiV.js → throttle-Cpk1LoGk-BVommE6v.js} +1 -1
  147. package/dist/{timediff-design-Cq3SADlb.js → timediff-design-DLlIUaqv.js} +1 -1
  148. package/dist/{trace-like-wrapper-Qmczl-Hz.js → trace-like-wrapper-BXA26KJX.js} +2 -2
  149. package/dist/{value-editor.vue_vue_type_style_index_0_lang-UXPOa0Wv.js → value-editor.vue_vue_type_style_index_0_lang-BE_003Cm.js} +2 -2
  150. package/dist/web-render/index.es.js +3 -3
  151. package/dist/{widget-barcode-C7wO0SFO.js → widget-barcode-DSLB1Wm3.js} +4 -4
  152. package/dist/{widget-diagonal-Cbuv8o5A.js → widget-diagonal-8alLoPL6.js} +3 -3
  153. package/dist/{widget-image-4AeqjwGp.js → widget-image-BmP7Adg_.js} +5 -5
  154. package/dist/{widget-line--RgXiyvO.js → widget-line-D9S0mzzT.js} +2 -2
  155. package/dist/{widget-pagination-jr6bVWPW.js → widget-pagination-BR3w_OHu.js} +5 -5
  156. package/dist/{widget-power-ptilZfAF.js → widget-power-DCV70vg5.js} +3 -3
  157. package/dist/{widget-qrcode-DH-1741M.js → widget-qrcode-CTzBIYUi.js} +3 -3
  158. package/dist/{widget-rangelimit-B4yv3Qw3.js → widget-rangelimit-1aqxil7q.js} +3 -3
  159. package/dist/{widget-serialnumber-AZ2IUJTg.js → widget-serialnumber-B-2Ey17u.js} +1 -1
  160. package/dist/{widget-text-CW0A1n16.js → widget-text-B1REfHTG.js} +5 -5
  161. package/dist/{widget-timediff-C3xTGqfj.js → widget-timediff-DRoMv5aa.js} +2 -2
  162. package/package.json +2 -2
  163. package/dist/paper-widget-design-CBI-8vTV.js +0 -4
  164. package/dist/seal-design-CMJBAfIN.js +0 -4
@@ -1,11 +1,11 @@
1
1
  import { reactive, toRaw, computed, watch, onScopeDispose, inject, h, shallowReactive, markRaw, ref, nextTick, toRef, provide, defineComponent, openBlock, createElementBlock, mergeProps, unref, createElementVNode, normalizeClass, renderSlot, createCommentVNode, createVNode, toDisplayString, Fragment, renderList, onUnmounted, isVNode, onMounted, onBeforeMount, resolveComponent, createBlock, withCtx, createTextVNode } from "vue";
2
- import { ai as CellWidgetViewState, F as FIELD_TYPE, b8 as RenderModeEnum, Y as FormTypeEnum, bE as BpmnNodeTypeEnum, cr as getFieldPlaceholder, bU as MobileFillTypeEnum, C as ComponentTypeEnum, $ as PlatformEnum, cs as isReferenceOptionActive, E as api, bu as uuid2, c2 as calcUtils, bj as findRuntimeTableRow, c4 as ensureTableRowKeys, b$ as bindRuntimeTableColumns, bi as getRowId, ct as FRONT_ROW_KEY, bw as isAttachFieldActive, cu as filterRulesByTrigger, cv as isEmptyValue$1, c3 as ensureFrontRowKey, b0 as getParseRuleInfo, aF as transformUtils, aY as materialCheck, aZ as getLotLockedReason, a_ as validateReinspectionDate, bn as FormulaRuleFieldKeyEnum, f as SubTableType, b1 as getParseRuleValue, cw as buildError, H as CreateType, bl as findRuntimeParentRow, aI as Dependency_ENUM, aH as ASSIGNMENTSTRATEGY_ENUM, bJ as commonUtils, aM as DeviceLink, a8 as _export_sfc, cd as getRenderedRuntimeTableCell, y as CellType, cm as relocateDeletedRowsToEnd, cx as resetTableRowIdentity, J as useModal, cy as q, cz as QUICK_FILL_ALLOWED_FIELDS, cA as groupFixedTableRows, cB as processQuickFillRows, cC as getIsGroupEmpty } from "./dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-BHExrYFJ.js";
2
+ import { aj as CellWidgetViewState, F as FIELD_TYPE, bm as RenderModeEnum, Z as FormTypeEnum, bG as BpmnNodeTypeEnum, cz as getFieldPlaceholder, bY as MobileFillTypeEnum, C as ComponentTypeEnum, a0 as PlatformEnum, cA as isReferenceOptionActive, p as api, bw as uuid2, c6 as calcUtils, bk as findRuntimeTableRow, ca as ensureTableRowKeys, c3 as bindRuntimeTableColumns, bj as getRowId, cB as FRONT_ROW_KEY, cp as isTableRowKeyMatch, by as isAttachFieldActive, cC as filterRulesByTrigger, cD as isEmptyValue$1, c7 as decodeTableCellRowKey, c9 as ensureFrontRowKey, b2 as getParseRuleInfo, aH as transformUtils, aZ as materialCheck, a_ as getLotLockedReason, a$ as validateReinspectionDate, bp as FormulaRuleFieldKeyEnum, h as SubTableType, b3 as getParseRuleValue, cE as buildError, I as CreateType, bn as findRuntimeParentRow, aK as Dependency_ENUM, aJ as ASSIGNMENTSTRATEGY_ENUM, bL as commonUtils, aO as DeviceLink, a9 as _export_sfc, cj as getRenderedRuntimeTableCell, A as CellType, ct as relocateDeletedRowsToEnd, cF as resetTableRowIdentity, K as useModal, cG as q, cH as QUICK_FILL_ALLOWED_FIELDS, cI as groupFixedTableRows, cJ as processQuickFillRows, cK as getIsGroupEmpty } from "./dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-8yB6zly8.js";
3
3
  import { cloneDeep, isEmpty, has, pickBy, isNil, mergeWith, omit, last, pick, merge } from "lodash-es";
4
4
  import dayjs from "dayjs";
5
5
  import { a as useNamespace, I as Icon } from "./AntdIcon-DCIaV352.js";
6
6
  import "@gct-paas/form-base";
7
7
  import { Modal, message } from "ant-design-vue";
8
- import { u as useFormModel } from "./mb-render-BRejJNP-.js";
8
+ import { u as useFormModel } from "./mb-render-_IUbyYCY.js";
9
9
  var MaterialConsumptionPatternEnum = /* @__PURE__ */ ((MaterialConsumptionPatternEnum2) => {
10
10
  MaterialConsumptionPatternEnum2["RECORD"] = "record";
11
11
  MaterialConsumptionPatternEnum2["BOM"] = "bom";
@@ -18,6 +18,61 @@ function normalizeFieldWidth(value, fallback = DEFAULT_FIELD_WIDTH) {
18
18
  const width = Number(value);
19
19
  return Number.isFinite(width) && width >= 0 ? width : fallback;
20
20
  }
21
+ function isBlank$1(value) {
22
+ return value === void 0 || value === null || value === "";
23
+ }
24
+ function matchFieldKey(match, fieldKey) {
25
+ if (!match.fieldKey) return false;
26
+ const keys = Array.isArray(match.fieldKey) ? match.fieldKey : [match.fieldKey];
27
+ return keys.includes(fieldKey);
28
+ }
29
+ function findFieldProfile(profile, fieldKey) {
30
+ return profile?.fields?.find((item) => matchFieldKey(item.match, fieldKey));
31
+ }
32
+ function buildDefaultMapFromProfile(profile, paramsConfig) {
33
+ const result = {};
34
+ if (!profile?.contextAssignments?.length) return result;
35
+ const assignments = profile.contextAssignments.filter(
36
+ (item) => item.when === "onRowInit"
37
+ );
38
+ for (const assignment of assignments) {
39
+ const value = paramsConfig?.[assignment.paramKey];
40
+ if (isBlank$1(value)) continue;
41
+ result[assignment.fieldKey] = value;
42
+ }
43
+ return result;
44
+ }
45
+ function buildFieldStatusFromProfile(params) {
46
+ const { profile, field } = params;
47
+ const result = {};
48
+ if (!profile) return result;
49
+ const fieldProfile = findFieldProfile(profile, field);
50
+ if (fieldProfile?.defaultProps) {
51
+ if (fieldProfile.defaultProps.disabled === true || fieldProfile.defaultProps.fieldDisabled === true) {
52
+ result.disabled = true;
53
+ }
54
+ if (fieldProfile.defaultProps.readonly === true || fieldProfile.defaultProps.fieldReadonly === true) {
55
+ result.readonly = true;
56
+ }
57
+ if (fieldProfile.defaultProps.required === false) {
58
+ result.required = false;
59
+ }
60
+ }
61
+ const rules2 = (profile.runtimeRules ?? []).filter(
62
+ (rule) => !rule.when || rule.when === "always" || rule.when === "onRowInit"
63
+ );
64
+ for (const rule of rules2) {
65
+ if (!rule.fields.includes(field)) continue;
66
+ if (rule.effect.readonly) result.readonly = true;
67
+ if (rule.effect.disabled) result.disabled = true;
68
+ if (rule.effect.required !== void 0) result.required = rule.effect.required;
69
+ }
70
+ return result;
71
+ }
72
+ function getRowHandlersForFieldChange(profile, changedField) {
73
+ if (!profile?.rowHandlers?.length) return [];
74
+ return profile.rowHandlers.filter((item) => item.when === "onFieldChange").filter((item) => !item.watch?.length || item.watch.includes(changedField)).map((item) => item.handler);
75
+ }
21
76
  function hasSignatureValue(value) {
22
77
  if (value === void 0 || value === null) return false;
23
78
  if (typeof value !== "string") {
@@ -958,6 +1013,8 @@ function convertV1Runtime(runtime) {
958
1013
  return { schemaVersion: 1, formConfig, sheets: [sheet] };
959
1014
  }
960
1015
  const MULTI_SHEET_SCHEMA_VERSION = 2;
1016
+ const MAX_RUNTIME_SHEETS = 100;
1017
+ const MAX_RUNTIME_SHEET_TITLE_LENGTH = 255;
961
1018
  function assertObject(value, message2) {
962
1019
  if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(message2);
963
1020
  }
@@ -1023,7 +1080,9 @@ function normalizeRuntime(runtime) {
1023
1080
  if (!Array.isArray(runtime.sheets) || runtime.sheets.length === 0) {
1024
1081
  throw new Error("多 Sheet 运行时至少需要一个工作表");
1025
1082
  }
1026
- if (runtime.sheets.length > 10) throw new Error("每份表单最多支持 10 个工作表");
1083
+ if (runtime.sheets.length > MAX_RUNTIME_SHEETS) {
1084
+ throw new Error(`每份表单最多支持 ${MAX_RUNTIME_SHEETS} 个工作表`);
1085
+ }
1027
1086
  const formConfig = runtime.formConfig ?? {};
1028
1087
  assertObject(formConfig, "多 Sheet 运行时的 formConfig 格式无效");
1029
1088
  const ids = /* @__PURE__ */ new Set();
@@ -1034,7 +1093,9 @@ function normalizeRuntime(runtime) {
1034
1093
  const sheetId = String(rawSheet.sheetId ?? "").trim();
1035
1094
  const title = String(rawSheet.title ?? "").trim();
1036
1095
  if (!sheetId) throw new Error(`第 ${index + 1} 个工作表缺少 sheetId`);
1037
- if (!title || title.length > 20) throw new Error(`工作表名称必须为 1 到 20 个字符:${title}`);
1096
+ if (!title || title.length > MAX_RUNTIME_SHEET_TITLE_LENGTH) {
1097
+ throw new Error(`工作表名称必须为 1 到 ${MAX_RUNTIME_SHEET_TITLE_LENGTH} 个字符:${title}`);
1098
+ }
1038
1099
  if (ids.has(sheetId)) throw new Error(`重复的 sheetId:${sheetId}`);
1039
1100
  if (titles.has(title)) throw new Error(`重复的工作表名称:${title}`);
1040
1101
  ids.add(sheetId);
@@ -1605,6 +1666,14 @@ class RuntimeFormStateStore {
1605
1666
  const paths = Object.keys(values);
1606
1667
  this.mutate(paths, source, () => this.assignValues(this.reactiveState, values));
1607
1668
  }
1669
+ /**
1670
+ * 保存后只回填后端身份元数据,不能用仅含 id_/front_row_key_ 的数组覆盖当前业务行。
1671
+ * 二维内置复合键可通过原始子行键匹配保存前的本地行。
1672
+ */
1673
+ patchSavedMetadata(values) {
1674
+ const paths = Object.keys(values);
1675
+ this.mutate(paths, "restore", () => this.mergeSavedMetadata(this.reactiveState, values));
1676
+ }
1608
1677
  /**
1609
1678
  * 用新对象整体替换实例数据,删除旧对象中多余的顶层字段。
1610
1679
  * 草稿/接口恢复后会清空用户修改标记;restore 来源同时恢复为非脏状态。
@@ -1716,6 +1785,46 @@ class RuntimeFormStateStore {
1716
1785
  target[key] = incoming;
1717
1786
  });
1718
1787
  }
1788
+ mergeSavedMetadata(target, incoming, path = "") {
1789
+ if (Array.isArray(incoming)) {
1790
+ const isTableRows = this.subtableFields.has(path) || path.endsWith("._2DTABLE_");
1791
+ if (!isTableRows || !Array.isArray(target)) return incoming;
1792
+ incoming.forEach((savedRow) => {
1793
+ const rowKey = savedRow?.[FRONT_ROW_KEY];
1794
+ const savedId = savedRow?.id_;
1795
+ let currentRow = target.find((row) => {
1796
+ if (!row || typeof row !== "object") return false;
1797
+ if (rowKey != null && isTableRowKeyMatch(rowKey, row[FRONT_ROW_KEY])) return true;
1798
+ return savedId != null && row.id_ != null && String(row.id_) === String(savedId);
1799
+ });
1800
+ let matchedByGroup = false;
1801
+ if (!currentRow && Array.isArray(savedRow?._2DTABLE_) && savedRow.group_ != null && String(savedRow.group_).trim() !== "") {
1802
+ const matchingGroups = target.filter(
1803
+ (row) => Array.isArray(row?._2DTABLE_) && row.group_ != null && String(row.group_) === String(savedRow.group_)
1804
+ );
1805
+ if (matchingGroups.length === 1) {
1806
+ currentRow = matchingGroups[0];
1807
+ matchedByGroup = true;
1808
+ }
1809
+ }
1810
+ if (currentRow) {
1811
+ this.mergeSavedMetadata(
1812
+ currentRow,
1813
+ matchedByGroup ? { ...savedRow, [FRONT_ROW_KEY]: currentRow[FRONT_ROW_KEY] } : savedRow,
1814
+ path
1815
+ );
1816
+ }
1817
+ });
1818
+ return target;
1819
+ }
1820
+ if (!incoming || typeof incoming !== "object") return incoming;
1821
+ if (!target || typeof target !== "object" || Array.isArray(target)) return incoming;
1822
+ Object.entries(incoming).forEach(([key, value]) => {
1823
+ const childPath = path ? `${path}.${key}` : key;
1824
+ target[key] = this.mergeSavedMetadata(target[key], value, childPath);
1825
+ });
1826
+ return target;
1827
+ }
1719
1828
  /**
1720
1829
  * 所有写入口共用的表格身份边界:整表恢复/回填、数组插入、二维子行替换均在通知前补齐。
1721
1830
  * 只处理业务索引声明的表格及 _2DTABLE_,不把多选值、上传文件等数组当作表格。
@@ -1800,6 +1909,7 @@ class RuntimeAsyncTaskCoordinator {
1800
1909
  fieldIdentity: options.fieldIdentity,
1801
1910
  sheetId: options.sheetId,
1802
1911
  required: options.required !== false,
1912
+ blockOnFailure: options.blockOnFailure !== false,
1803
1913
  status: "pending",
1804
1914
  sequence,
1805
1915
  promise: task,
@@ -1843,7 +1953,7 @@ class RuntimeAsyncTaskCoordinator {
1843
1953
  * 等待全部 required 任务达到稳定状态。
1844
1954
  *
1845
1955
  * 一轮任务完成后的字段回填可能触发新的公式或远程任务,因此这里循环读取任务表,直到
1846
- * 没有新的 pending required 任务。稳定后统一检查失败项,使提交事务得到明确失败原因。
1956
+ * 没有新的 pending required 任务。稳定后只检查需要阻断提交的失败项。
1847
1957
  */
1848
1958
  async waitForRequired(keyPrefix) {
1849
1959
  const matches = (task) => task.required && (!keyPrefix || task.key.startsWith(keyPrefix));
@@ -1855,7 +1965,7 @@ class RuntimeAsyncTaskCoordinator {
1855
1965
  await Promise.allSettled(pending.map((task) => task.promise));
1856
1966
  }
1857
1967
  const failed = Array.from(this.tasks.values()).filter(
1858
- (task) => matches(task) && task.status === "rejected"
1968
+ (task) => matches(task) && task.blockOnFailure && task.status === "rejected"
1859
1969
  );
1860
1970
  if (failed.length) {
1861
1971
  const details = failed.map((task) => {
@@ -3201,11 +3311,12 @@ class RuntimeValidationService {
3201
3311
  this.pendingLive = this.pendingLive === "blur" ? "blur" : trigger;
3202
3312
  if (this.liveTimer) clearTimeout(this.liveTimer);
3203
3313
  this.liveTimer = void 0;
3204
- if (immediate) void this.flushLive().catch((error) => console.error("字段校验失败", error));
3314
+ if (immediate)
3315
+ void this.flushLive().catch((error) => this.logBackgroundError("字段校验失败", error));
3205
3316
  else
3206
3317
  this.liveTimer = setTimeout(() => {
3207
3318
  this.liveTimer = void 0;
3208
- void this.flushLive().catch((error) => console.error("字段校验失败", error));
3319
+ void this.flushLive().catch((error) => this.logBackgroundError("字段校验失败", error));
3209
3320
  }, 300);
3210
3321
  }
3211
3322
  async flushLive() {
@@ -3227,11 +3338,17 @@ class RuntimeValidationService {
3227
3338
  this.displayTimer = void 0;
3228
3339
  const run = () => {
3229
3340
  this.displayTimer = void 0;
3230
- void this.validate("display").catch((error) => console.error("字段展示校验失败", error));
3341
+ void this.validate("display").catch(
3342
+ (error) => this.logBackgroundError("字段展示校验失败", error)
3343
+ );
3231
3344
  };
3232
3345
  if (immediate) run();
3233
3346
  else this.displayTimer = setTimeout(run, 320);
3234
3347
  }
3348
+ logBackgroundError(label, error) {
3349
+ if (error instanceof Error && error.message.startsWith("以下异步任务执行失败:")) return;
3350
+ console.error(label, error);
3351
+ }
3235
3352
  pruneComments() {
3236
3353
  if (!this.binding || this.disposed) return;
3237
3354
  this.binding.applyComments(
@@ -3827,8 +3944,10 @@ const SNAPSHOT_SKIP = /* @__PURE__ */ new Set([
3827
3944
  ]);
3828
3945
  function rowIdentityKeys(row) {
3829
3946
  if (!row) return [];
3947
+ const frontRowKey = row[FRONT_ROW_KEY] != null && String(row[FRONT_ROW_KEY]).trim() !== "" ? String(row[FRONT_ROW_KEY]) : void 0;
3830
3948
  return [
3831
- row[FRONT_ROW_KEY] != null && String(row[FRONT_ROW_KEY]).trim() !== "" ? String(row[FRONT_ROW_KEY]) : void 0,
3949
+ frontRowKey,
3950
+ decodeTableCellRowKey(frontRowKey)?.cellRowKey,
3832
3951
  row.id_ != null && row.id_ !== "" ? String(row.id_) : void 0
3833
3952
  ].filter(Boolean);
3834
3953
  }
@@ -4562,7 +4681,16 @@ class BomEntriesValidator {
4562
4681
  memberIndexes.push(idx);
4563
4682
  if (byLot && !row.material_no_) emptyLotIndexes.push(idx);
4564
4683
  });
4565
- const needInsert = !this.groupExistsInTable(arr, target);
4684
+ const targetExists = this.groupExistsInTable(arr, target);
4685
+ if (!targetExists) {
4686
+ const index = arr.findIndex((row2) => !row2.deleted_);
4687
+ const row = arr[index];
4688
+ const canReuse = row && !row.product_id_ && !row.bom_entry_id_ && !row.is_confirmed_ && arr.every((item, idx) => item.deleted_ || idx === index);
4689
+ if (canReuse) {
4690
+ emptyProductIndexes.push(index);
4691
+ }
4692
+ }
4693
+ const needInsert = !targetExists && emptyProductIndexes.length === 0;
4566
4694
  const last2 = memberIndexes[memberIndexes.length - 1];
4567
4695
  let groupInsertIndex = -1;
4568
4696
  if (needInsert) {
@@ -5187,7 +5315,8 @@ class MaterialConsumeTableController {
5187
5315
  constructor(tmplBomController, tmplBom, options = {}) {
5188
5316
  this.tmplBomController = tmplBomController;
5189
5317
  this.tmplBom = tmplBom;
5190
- if (!options.printOnly) this.initScanRule(this.tmplBom.barcode_parsing_rules_id_);
5318
+ if (!options.printOnly && this.hasFormInstance)
5319
+ this.initScanRule(this.tmplBom.barcode_parsing_rules_id_);
5191
5320
  this.scanParamType = this.tmplBom.scan_param_type_;
5192
5321
  markRaw(this);
5193
5322
  this.bomEntriesValidator = new BomEntriesValidator(
@@ -5250,6 +5379,9 @@ class MaterialConsumeTableController {
5250
5379
  get mcPattern() {
5251
5380
  return this.tmplBom.material_consumption_pattern_ ?? this.tmplBomController.defaultMCPattern;
5252
5381
  }
5382
+ get hasFormInstance() {
5383
+ return this.tmplBomController.hasFormInstance;
5384
+ }
5253
5385
  /**
5254
5386
  * 解析规则数据对象
5255
5387
  */
@@ -5502,6 +5634,10 @@ class MaterialConsumeTableController {
5502
5634
  }
5503
5635
  const isRecordPattern = this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_;
5504
5636
  console.log("parseScanStr", data);
5637
+ if (!data.lot && !data.uniqueCode) {
5638
+ this.error($t("sys.edhr.mcTable.lotOrUniqueCodeRequired"));
5639
+ return;
5640
+ }
5505
5641
  const arr = await materialCheck({
5506
5642
  material_no_: data.materialCode,
5507
5643
  production_identification_name_: data.lot,
@@ -5996,7 +6132,16 @@ class MaterialConsumeTableController {
5996
6132
  this.error(msg);
5997
6133
  return;
5998
6134
  }
5999
- if (!value) return;
6135
+ if (!value) {
6136
+ if (row.product_id_ && !this.isCustomRequiredQty) {
6137
+ const util = this.bomEntriesValidator.findUtilByProductId(row.product_id_);
6138
+ if (util) {
6139
+ row.qty_required_ = util.total;
6140
+ }
6141
+ }
6142
+ this.updateDerivedQtyFields();
6143
+ return;
6144
+ }
6000
6145
  try {
6001
6146
  await validateReinspectionDate({
6002
6147
  product_id_: option.product_id_ ?? row.product_id_,
@@ -6020,6 +6165,7 @@ class MaterialConsumeTableController {
6020
6165
  const qty = oldGroupId && row.bom_entry_id_ === oldGroupId ? oldRequiredQty : this.getCustomGroupRequiredQty(row);
6021
6166
  this.setCustomGroupRequiredQty(row, qty);
6022
6167
  }
6168
+ this.updateDerivedQtyFields();
6023
6169
  } else if (field === "qty_") {
6024
6170
  this.updateDerivedQtyFields();
6025
6171
  }
@@ -6654,11 +6800,12 @@ class SubTableCore {
6654
6800
  /**
6655
6801
  * 扫码多条候选时选择一行(1 条自动选中)
6656
6802
  */
6657
- async pickScanRecord(records) {
6803
+ async pickScanRecord(records, options = {}) {
6658
6804
  if (!records.length) return void 0;
6659
6805
  if (records.length === 1) return records[0];
6660
6806
  return this.render.openMultiRowsModal({
6661
- rows: mapScanRecordsForPicker(records)
6807
+ rows: mapScanRecordsForPicker(records),
6808
+ ...options
6662
6809
  });
6663
6810
  }
6664
6811
  /**
@@ -6680,37 +6827,71 @@ class SubTableCore {
6680
6827
  console.log(this.ctx.widget.props.tableTitle, "处理表单按钮点击事件", params);
6681
6828
  }
6682
6829
  }
6683
- let currentParamsConfig = {
6684
- routingParamList: [],
6685
- inspectionParamList: []
6686
- };
6687
- function setFormulaParamsConfig(paramsConfig = {}) {
6688
- currentParamsConfig = paramsConfig ?? {};
6830
+ const STORAGE_KEY = "gct:formula:params:v1";
6831
+ const PARAMS_CHANGED_EVENT = "gct:formula-params-updated:v1";
6832
+ function emptyConfig() {
6833
+ return {
6834
+ routingParamList: [],
6835
+ inspectionParamList: [],
6836
+ deviceParamList: []
6837
+ };
6689
6838
  }
6690
- async function CALC_IS_QUALIFIED(key, value, paramList) {
6691
- if (!key || value == null) {
6692
- return null;
6839
+ function normalizeList(value) {
6840
+ if (!Array.isArray(value)) return [];
6841
+ return value.filter(
6842
+ (item) => item !== null && typeof item === "object" && typeof item.customFieldKey === "string"
6843
+ );
6844
+ }
6845
+ function normalizeConfig(value) {
6846
+ const data = value !== null && typeof value === "object" ? value : {};
6847
+ return {
6848
+ routingParamList: normalizeList(data.routingParamList),
6849
+ inspectionParamList: normalizeList(data.inspectionParamList),
6850
+ deviceParamList: normalizeList(data.deviceParamList)
6851
+ };
6852
+ }
6853
+ let lastRaw;
6854
+ let cachedConfig = emptyConfig();
6855
+ function readFormulaParamsConfig() {
6856
+ const raw = window.localStorage.getItem(STORAGE_KEY);
6857
+ if (raw !== lastRaw) {
6858
+ try {
6859
+ cachedConfig = normalizeConfig(raw ? JSON.parse(raw) : null);
6860
+ } catch {
6861
+ cachedConfig = emptyConfig();
6862
+ }
6863
+ lastRaw = raw;
6864
+ }
6865
+ return cachedConfig;
6866
+ }
6867
+ const currentParamsConfig = {
6868
+ get routingParamList() {
6869
+ return readFormulaParamsConfig().routingParamList;
6870
+ },
6871
+ get inspectionParamList() {
6872
+ return readFormulaParamsConfig().inspectionParamList;
6693
6873
  }
6694
- const config = paramList?.find((e) => e.customFieldKey === key);
6695
- if (!config) return null;
6696
- const { upperLimit, lowerLimit } = config;
6697
- if (lowerLimit == null || upperLimit == null) return null;
6698
- const actual = Number(value);
6699
- const min = Number(config.lowerLimit);
6700
- const max = Number(config.upperLimit);
6701
- if (![actual, min, max].every(Number.isFinite)) return null;
6702
- return actual >= min && actual <= max;
6703
- }
6704
- const FORMULA_FUNCS = {
6705
- RoutingParamCheck: (key, value) => CALC_IS_QUALIFIED(key, value, currentParamsConfig.routingParamList || []),
6706
- InspectionParamCheck: (key, value) => CALC_IS_QUALIFIED(key, value, currentParamsConfig.inspectionParamList || [])
6707
6874
  };
6708
- function registerFormulaFuncs() {
6709
- const register2 = window.NocodeAdapter.utils?.formulaRegister;
6710
- if (!register2) return;
6711
- Object.entries(FORMULA_FUNCS).forEach(([k, func]) => {
6712
- register2(k, func);
6875
+ function setFormulaParamsConfig(paramsConfig = {}) {
6876
+ const raw = JSON.stringify(normalizeConfig(paramsConfig));
6877
+ if (window.localStorage.getItem(STORAGE_KEY) === raw) return;
6878
+ window.localStorage.setItem(STORAGE_KEY, raw);
6879
+ window.dispatchEvent(new Event(PARAMS_CHANGED_EVENT));
6880
+ }
6881
+ const boundCalculators = /* @__PURE__ */ new WeakSet();
6882
+ function bindFormulaCacheInvalidation(value) {
6883
+ if (typeof value !== "function") return;
6884
+ const calculator = value;
6885
+ if (typeof calculator.clear !== "function" || boundCalculators.has(calculator)) return;
6886
+ boundCalculators.add(calculator);
6887
+ const clearCache = () => calculator.clear();
6888
+ window.addEventListener(PARAMS_CHANGED_EVENT, clearCache);
6889
+ window.addEventListener("storage", (event) => {
6890
+ if (event.storageArea === window.localStorage && (event.key === STORAGE_KEY || event.key === null)) {
6891
+ clearCache();
6892
+ }
6713
6893
  });
6894
+ clearCache();
6714
6895
  }
6715
6896
  function getGroupProductIds(entry) {
6716
6897
  const ids = [entry.product_id_];
@@ -6884,7 +7065,7 @@ async function validateObjectBomQtyOnSubmit(opts) {
6884
7065
  for (const obj of objectFieldList) {
6885
7066
  if (!obj?.objectField) continue;
6886
7067
  const objectBom = findObjectBom(formInstBom, obj.objectField);
6887
- if (objectBom?.material_consumption_pattern_ === MaterialConsumptionPatternEnum.RECORD) {
7068
+ if (objectBom?.material_consumption_pattern_ === MaterialConsumptionPatternEnum.RECORD && !objectBom.personal_bom_enabled_) {
6888
7069
  continue;
6889
7070
  }
6890
7071
  const { productKey, productFieldName, qtyKey, qtyRequiredKey, qtyFieldName } = pickObjectFieldKeys(obj.subFields, obj.objectField);
@@ -6945,150 +7126,6 @@ async function validateObjectBomQtyOnSubmit(opts) {
6945
7126
  }
6946
7127
  return errors;
6947
7128
  }
6948
- function isBlank(value) {
6949
- return value == null || value === "";
6950
- }
6951
- function pickPresent(preferred, fallback) {
6952
- return isBlank(preferred) ? fallback : preferred;
6953
- }
6954
- function resolveObjectFieldKeys(opts) {
6955
- const obj = opts.objectFieldList?.find((item) => item.objectField === opts.belongingObject);
6956
- const fromList = obj?.subFields ? pickObjectFieldKeys(obj.subFields, opts.belongingObject) : {};
6957
- const fromFallback = pickObjectFieldKeys(opts.fallbackFields, opts.belongingObject, {
6958
- requireUsed: false
6959
- });
6960
- return {
6961
- productKey: pickPresent(fromList.productKey, fromFallback.productKey),
6962
- productFieldName: fromList.productFieldName ?? fromFallback.productFieldName,
6963
- materialNoKey: pickPresent(fromList.materialNoKey, fromFallback.materialNoKey),
6964
- materialNoFieldName: fromList.materialNoFieldName ?? fromFallback.materialNoFieldName,
6965
- qtyKey: pickPresent(fromList.qtyKey, fromFallback.qtyKey),
6966
- qtyRequiredKey: pickPresent(fromList.qtyRequiredKey, fromFallback.qtyRequiredKey),
6967
- qtyFieldName: fromList.qtyFieldName ?? fromFallback.qtyFieldName,
6968
- bomEntryIdKey: pickPresent(fromList.bomEntryIdKey, fromFallback.bomEntryIdKey)
6969
- };
6970
- }
6971
- function buildObjectLotExtraQuery(productId) {
6972
- if (isBlank(productId)) return {};
6973
- const versionId = String(productId).split(":").pop();
6974
- if (!versionId) return {};
6975
- return { "product_id_.versionEq": versionId };
6976
- }
6977
- function clearedLotFields(materialNoKey) {
6978
- if (!materialNoKey) return {};
6979
- return {
6980
- [materialNoKey]: void 0,
6981
- [`${materialNoKey}_id_`]: void 0,
6982
- [`${materialNoKey}_lb_`]: void 0
6983
- };
6984
- }
6985
- function shouldClearLotOnProductChange(opts) {
6986
- const { prevProduct, nextProduct, lotValue } = opts;
6987
- if (isBlank(prevProduct) && isBlank(nextProduct)) return false;
6988
- if (prevProduct === nextProduct) return false;
6989
- if (isBlank(prevProduct) && !isBlank(nextProduct) && !isBlank(lotValue)) {
6990
- return false;
6991
- }
6992
- return true;
6993
- }
6994
- let fillingProduct = false;
6995
- function runWithFillProduct(fn) {
6996
- fillingProduct = true;
6997
- try {
6998
- fn();
6999
- } finally {
7000
- nextTick(() => {
7001
- fillingProduct = false;
7002
- });
7003
- }
7004
- }
7005
- function resolveLotValidateParams(keys, formData, option) {
7006
- return {
7007
- product_id_: option?.product_id_ ?? option?._item?.product_id_ ?? (keys.productKey ? formData[keys.productKey] : void 0),
7008
- material_no_: option?.name_ ?? option?.__VALUE__ ?? (keys.materialNoKey ? formData[keys.materialNoKey] : void 0),
7009
- material_no_id_: option?.id_ ?? (keys.materialNoKey ? formData[`${keys.materialNoKey}_id_`] : void 0)
7010
- };
7011
- }
7012
- async function applyConsumeObjectTraceChange(opts) {
7013
- const { belongingObject, role, formData } = opts;
7014
- if (!belongingObject || !formData) return {};
7015
- const keys = resolveObjectFieldKeys({
7016
- belongingObject,
7017
- objectFieldList: opts.objectFieldList,
7018
- fallbackFields: opts.fallbackFields
7019
- });
7020
- if (role === FIELD_TYPE.PRODUCT) {
7021
- if (!("prevProduct" in opts) || fillingProduct) return {};
7022
- const values = {};
7023
- if (shouldClearLotOnProductChange({
7024
- prevProduct: opts.prevProduct,
7025
- nextProduct: opts.nextValue,
7026
- lotValue: keys.materialNoKey ? formData[keys.materialNoKey] : void 0
7027
- })) {
7028
- Object.assign(values, clearedLotFields(keys.materialNoKey));
7029
- }
7030
- if (keys.bomEntryIdKey) {
7031
- values[keys.bomEntryIdKey] = null;
7032
- if (!isBlank(opts.nextValue) && opts.formInstBom) {
7033
- const entry = resolveObjectBomEntry({
7034
- formInstBom: opts.formInstBom,
7035
- belongingObject,
7036
- productId: String(opts.nextValue)
7037
- });
7038
- if (entry) values[keys.bomEntryIdKey] = entry.id_;
7039
- }
7040
- }
7041
- opts.rowWriter.patchRow(values, "autofill");
7042
- const lotValue = keys.materialNoKey ? formData[keys.materialNoKey] : void 0;
7043
- if (!isBlank(opts.nextValue) && !isBlank(lotValue)) {
7044
- try {
7045
- await validateReinspectionDate({
7046
- product_id_: String(opts.nextValue),
7047
- material_no_: lotValue,
7048
- material_no_id_: keys.materialNoKey ? formData[`${keys.materialNoKey}_id_`] : void 0
7049
- });
7050
- } catch (e) {
7051
- return { abortReinspection: e?.message || String(e) };
7052
- }
7053
- }
7054
- return {};
7055
- }
7056
- if (role === FIELD_TYPE.MATERIAL_NO) {
7057
- if (opts.option?.is_locked_) {
7058
- opts.rowWriter.patchRow(clearedLotFields(keys.materialNoKey), "autofill");
7059
- return { abortLocked: opts.option.id_ };
7060
- }
7061
- const params = resolveLotValidateParams(keys, formData, opts.option);
7062
- if (isBlank(params.material_no_) && isBlank(params.material_no_id_)) return {};
7063
- try {
7064
- await validateReinspectionDate(params);
7065
- } catch (e) {
7066
- opts.rowWriter.patchRow(clearedLotFields(keys.materialNoKey), "async");
7067
- return { abortReinspection: e?.message || String(e) };
7068
- }
7069
- const values = {};
7070
- const productId = opts.option?.product_id_ ?? opts.option?._item?.product_id_;
7071
- if (keys.productKey && !isBlank(productId)) values[keys.productKey] = productId;
7072
- if (keys.bomEntryIdKey && opts.formInstBom) {
7073
- if (!isBlank(productId)) {
7074
- const entry = resolveObjectBomEntry({
7075
- formInstBom: opts.formInstBom,
7076
- belongingObject,
7077
- productId: String(productId)
7078
- });
7079
- if (entry) values[keys.bomEntryIdKey] = entry.id_;
7080
- }
7081
- }
7082
- const patchRelatedFields = () => opts.rowWriter.patchRow(values, "autofill");
7083
- if (keys.productKey && !isBlank(productId)) {
7084
- runWithFillProduct(patchRelatedFields);
7085
- } else {
7086
- patchRelatedFields();
7087
- }
7088
- return {};
7089
- }
7090
- return {};
7091
- }
7092
7129
  function useRuntimeRowState(rowSource) {
7093
7130
  const { formStateStore } = useRuntimeInstanceServices();
7094
7131
  function requireStore() {
@@ -7841,6 +7878,150 @@ function useFormTmplConfig() {
7841
7878
  injectController
7842
7879
  };
7843
7880
  }
7881
+ function isBlank(value) {
7882
+ return value == null || value === "";
7883
+ }
7884
+ function pickPresent(preferred, fallback) {
7885
+ return isBlank(preferred) ? fallback : preferred;
7886
+ }
7887
+ function resolveObjectFieldKeys(opts) {
7888
+ const obj = opts.objectFieldList?.find((item) => item.objectField === opts.belongingObject);
7889
+ const fromList = obj?.subFields ? pickObjectFieldKeys(obj.subFields, opts.belongingObject) : {};
7890
+ const fromFallback = pickObjectFieldKeys(opts.fallbackFields, opts.belongingObject, {
7891
+ requireUsed: false
7892
+ });
7893
+ return {
7894
+ productKey: pickPresent(fromList.productKey, fromFallback.productKey),
7895
+ productFieldName: fromList.productFieldName ?? fromFallback.productFieldName,
7896
+ materialNoKey: pickPresent(fromList.materialNoKey, fromFallback.materialNoKey),
7897
+ materialNoFieldName: fromList.materialNoFieldName ?? fromFallback.materialNoFieldName,
7898
+ qtyKey: pickPresent(fromList.qtyKey, fromFallback.qtyKey),
7899
+ qtyRequiredKey: pickPresent(fromList.qtyRequiredKey, fromFallback.qtyRequiredKey),
7900
+ qtyFieldName: fromList.qtyFieldName ?? fromFallback.qtyFieldName,
7901
+ bomEntryIdKey: pickPresent(fromList.bomEntryIdKey, fromFallback.bomEntryIdKey)
7902
+ };
7903
+ }
7904
+ function buildObjectLotExtraQuery(productId) {
7905
+ if (isBlank(productId)) return {};
7906
+ const versionId = String(productId).split(":").pop();
7907
+ if (!versionId) return {};
7908
+ return { "product_id_.versionEq": versionId };
7909
+ }
7910
+ function clearedLotFields(materialNoKey) {
7911
+ if (!materialNoKey) return {};
7912
+ return {
7913
+ [materialNoKey]: void 0,
7914
+ [`${materialNoKey}_id_`]: void 0,
7915
+ [`${materialNoKey}_lb_`]: void 0
7916
+ };
7917
+ }
7918
+ function shouldClearLotOnProductChange(opts) {
7919
+ const { prevProduct, nextProduct, lotValue } = opts;
7920
+ if (isBlank(prevProduct) && isBlank(nextProduct)) return false;
7921
+ if (prevProduct === nextProduct) return false;
7922
+ if (isBlank(prevProduct) && !isBlank(nextProduct) && !isBlank(lotValue)) {
7923
+ return false;
7924
+ }
7925
+ return true;
7926
+ }
7927
+ let fillingProduct = false;
7928
+ function runWithFillProduct(fn) {
7929
+ fillingProduct = true;
7930
+ try {
7931
+ fn();
7932
+ } finally {
7933
+ nextTick(() => {
7934
+ fillingProduct = false;
7935
+ });
7936
+ }
7937
+ }
7938
+ function resolveLotValidateParams(keys, formData, option) {
7939
+ return {
7940
+ product_id_: option?.product_id_ ?? option?._item?.product_id_ ?? (keys.productKey ? formData[keys.productKey] : void 0),
7941
+ material_no_: option?.name_ ?? option?.__VALUE__ ?? (keys.materialNoKey ? formData[keys.materialNoKey] : void 0),
7942
+ material_no_id_: option?.id_ ?? (keys.materialNoKey ? formData[`${keys.materialNoKey}_id_`] : void 0)
7943
+ };
7944
+ }
7945
+ async function applyConsumeObjectTraceChange(opts) {
7946
+ const { belongingObject, role, formData } = opts;
7947
+ if (!belongingObject || !formData) return {};
7948
+ const keys = resolveObjectFieldKeys({
7949
+ belongingObject,
7950
+ objectFieldList: opts.objectFieldList,
7951
+ fallbackFields: opts.fallbackFields
7952
+ });
7953
+ if (role === FIELD_TYPE.PRODUCT) {
7954
+ if (!("prevProduct" in opts) || fillingProduct) return {};
7955
+ const values = {};
7956
+ if (shouldClearLotOnProductChange({
7957
+ prevProduct: opts.prevProduct,
7958
+ nextProduct: opts.nextValue,
7959
+ lotValue: keys.materialNoKey ? formData[keys.materialNoKey] : void 0
7960
+ })) {
7961
+ Object.assign(values, clearedLotFields(keys.materialNoKey));
7962
+ }
7963
+ if (keys.bomEntryIdKey) {
7964
+ values[keys.bomEntryIdKey] = null;
7965
+ if (!isBlank(opts.nextValue) && opts.formInstBom) {
7966
+ const entry = resolveObjectBomEntry({
7967
+ formInstBom: opts.formInstBom,
7968
+ belongingObject,
7969
+ productId: String(opts.nextValue)
7970
+ });
7971
+ if (entry) values[keys.bomEntryIdKey] = entry.id_;
7972
+ }
7973
+ }
7974
+ opts.rowWriter.patchRow(values, "autofill");
7975
+ const lotValue = keys.materialNoKey ? formData[keys.materialNoKey] : void 0;
7976
+ if (!isBlank(opts.nextValue) && !isBlank(lotValue)) {
7977
+ try {
7978
+ await validateReinspectionDate({
7979
+ product_id_: String(opts.nextValue),
7980
+ material_no_: lotValue,
7981
+ material_no_id_: keys.materialNoKey ? formData[`${keys.materialNoKey}_id_`] : void 0
7982
+ });
7983
+ } catch (e) {
7984
+ return { abortReinspection: e?.message || String(e) };
7985
+ }
7986
+ }
7987
+ return {};
7988
+ }
7989
+ if (role === FIELD_TYPE.MATERIAL_NO) {
7990
+ if (opts.option?.is_locked_) {
7991
+ opts.rowWriter.patchRow(clearedLotFields(keys.materialNoKey), "autofill");
7992
+ return { abortLocked: opts.option.id_ };
7993
+ }
7994
+ const params = resolveLotValidateParams(keys, formData, opts.option);
7995
+ if (isBlank(params.material_no_) && isBlank(params.material_no_id_)) return {};
7996
+ try {
7997
+ await validateReinspectionDate(params);
7998
+ } catch (e) {
7999
+ opts.rowWriter.patchRow(clearedLotFields(keys.materialNoKey), "async");
8000
+ return { abortReinspection: e?.message || String(e) };
8001
+ }
8002
+ const values = {};
8003
+ const productId = opts.option?.product_id_ ?? opts.option?._item?.product_id_;
8004
+ if (keys.productKey && !isBlank(productId)) values[keys.productKey] = productId;
8005
+ if (keys.bomEntryIdKey && opts.formInstBom) {
8006
+ if (!isBlank(productId)) {
8007
+ const entry = resolveObjectBomEntry({
8008
+ formInstBom: opts.formInstBom,
8009
+ belongingObject,
8010
+ productId: String(productId)
8011
+ });
8012
+ if (entry) values[keys.bomEntryIdKey] = entry.id_;
8013
+ }
8014
+ }
8015
+ const patchRelatedFields = () => opts.rowWriter.patchRow(values, "autofill");
8016
+ if (keys.productKey && !isBlank(productId)) {
8017
+ runWithFillProduct(patchRelatedFields);
8018
+ } else {
8019
+ patchRelatedFields();
8020
+ }
8021
+ return {};
8022
+ }
8023
+ return {};
8024
+ }
7844
8025
  const _hoisted_1$5 = ["data-merge", "data-fill-direction"];
7845
8026
  const _hoisted_2$1 = {
7846
8027
  key: 0,
@@ -8161,6 +8342,7 @@ const DocumentSubTable = /* @__PURE__ */ defineComponent({
8161
8342
  showDisplayStatus,
8162
8343
  dataRelationShip
8163
8344
  } = useWidgetStaticAttrs(props.widget);
8345
+ const isMockMaterialConsume = computed(() => !!dataRelationShip?.isMockReport && !!props.widget.props.isMaterialConsumeTable);
8164
8346
  const sheetId = () => fields.value?.findWidgetById(props.widget.id)?.sheetId;
8165
8347
  const subTableCore = props.subTableCore;
8166
8348
  provide(NCB_PROVIDE.SUB_TABLE_CORE, subTableCore);
@@ -8301,6 +8483,9 @@ const DocumentSubTable = /* @__PURE__ */ defineComponent({
8301
8483
  key,
8302
8484
  actionValue
8303
8485
  }) => {
8486
+ if (isMockMaterialConsume.value && (key === SubTableActionEnum.SCAN || key === SubTableActionEnum.Insert1GroupAfter)) {
8487
+ return;
8488
+ }
8304
8489
  switch (key) {
8305
8490
  case "insertRowBefore":
8306
8491
  handleAddRow({
@@ -8394,10 +8579,11 @@ const DocumentSubTable = /* @__PURE__ */ defineComponent({
8394
8579
  showRowWatermark,
8395
8580
  rowGroupKey
8396
8581
  }) => {
8397
- const menus = subTableCore?.calcSubTableActionMenu({
8582
+ const baseMenus = subTableCore?.calcSubTableActionMenu({
8398
8583
  rowData,
8399
8584
  showDelBtn
8400
8585
  });
8586
+ const menus = isMockMaterialConsume.value ? [getMenuByAction(SubTableActionEnum.SCAN), getMenuByAction(SubTableActionEnum.Insert1GroupAfter), ...baseMenus ?? []] : baseMenus;
8401
8587
  const annRowDetails = dataRelationShip?.annRowDetails;
8402
8588
  const rowMark = dataIdx !== -1 && annRowDetails?.length ? resolveRowFormChangeMark(field, rowData, annRowDetails) : null;
8403
8589
  const rowUi = resolveFormChangeRowUi(rowData, rowMark);
@@ -8710,7 +8896,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
8710
8896
  const {
8711
8897
  showDisplayStatus,
8712
8898
  dataRelationShip
8713
- } = useWidgetStaticAttrs(props);
8899
+ } = useWidgetStaticAttrs(props.widget);
8714
8900
  const sheetId = () => fields.value?.findWidgetById(props.widget.id)?.sheetId;
8715
8901
  const formModelController = useFormModel().injectController();
8716
8902
  const tableController = props.tableController;
@@ -8899,6 +9085,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
8899
9085
  }));
8900
9086
  };
8901
9087
  const handleAction = (action, rowData) => {
9088
+ if (!tableController.hasFormInstance) return;
8902
9089
  switch (action) {
8903
9090
  case MaterialConsumeActionType.CONFIRM:
8904
9091
  tableController.confirm(rowData);
@@ -8971,6 +9158,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
8971
9158
  key,
8972
9159
  actionValue
8973
9160
  }) => {
9161
+ if (!tableController.hasFormInstance) return;
8974
9162
  switch (key) {
8975
9163
  case "rowEdit":
8976
9164
  await tableController.editRow(rowData);
@@ -9341,7 +9529,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
9341
9529
  createElementVNode("i", { class: "iconfont icon-zhuyi" }),
9342
9530
  createElementVNode("ul", { class: "tips-list" }, [
9343
9531
  createElementVNode("li", null, "可将Excel内容粘贴到表格中,支持使用复制、粘贴、删除快捷键"),
9344
- createElementVNode("li", null, " 表单中支持快速填报的字段类型:文本、长文本、整数、长整数、小数、精度小数、日期、时间、日期时间、LOT/SN、报废物料批次、枚举单选、枚举多选(选项间以“,”分割) ")
9532
+ createElementVNode("li", null, " 表单中支持快速填报的字段类型:文本、长文本、整数、长整数、小数、精度小数、日期、时间、日期时间、批次/SN、报废物料批次、枚举单选、枚举多选(选项间以“,”分割) ")
9345
9533
  ])
9346
9534
  ], -1)),
9347
9535
  createElementVNode("div", {
@@ -9366,7 +9554,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
9366
9554
  };
9367
9555
  }
9368
9556
  });
9369
- const FixedQuickFillModal = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-b589958f"]]);
9557
+ const FixedQuickFillModal = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-58540cb3"]]);
9370
9558
  const _hoisted_1$1 = {
9371
9559
  key: 1,
9372
9560
  class: "sub-table-action__subtitle"
@@ -10068,7 +10256,7 @@ const DocumentPaper = /* @__PURE__ */ defineComponent({
10068
10256
  }) : null,
10069
10257
  // 在[固定表]顶部的可见单元格上加装操作按钮
10070
10258
  tableAction: (() => {
10071
- const fixedTableActionVisible = fixedTableInfo?.quickFillVisible && !filledFixedTableKeys.value.includes(fixedTableInfo.subFieldKey);
10259
+ const fixedTableActionVisible = props.basicInfo.renderModeType !== RenderModeEnum.ViewMode && fixedTableInfo?.quickFillVisible && !filledFixedTableKeys.value.includes(fixedTableInfo.subFieldKey);
10072
10260
  return () => fixedTableActionVisible ? createVNode(_sfc_main$2, {
10073
10261
  "tdId": tdId,
10074
10262
  "formState": formState.value,
@@ -10139,7 +10327,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
10139
10327
  createElementVNode("i", { class: "iconfont icon-zhuyi" }),
10140
10328
  createElementVNode("ul", { class: "tips-list" }, [
10141
10329
  createElementVNode("li", null, "可将Excel内容粘贴到表格中,支持使用复制、粘贴、删除快捷键"),
10142
- createElementVNode("li", null, "表单中支持快速填报的字段类型:文本、长文本、整数、长整数、小数、精度小数、日期、时间、日期时间、LOT/SN、报废物料批次、枚举单选、枚举多选(选项间以“,”分割)"),
10330
+ createElementVNode("li", null, "表单中支持快速填报的字段类型:文本、长文本、整数、长整数、小数、精度小数、日期、时间、日期时间、批次/SN、报废物料批次、枚举单选、枚举多选(选项间以“,”分割)"),
10143
10331
  createElementVNode("li", null, "当前快速填报最多支持200行")
10144
10332
  ])
10145
10333
  ], -1)),
@@ -10159,7 +10347,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
10159
10347
  };
10160
10348
  }
10161
10349
  });
10162
- const DynamicQuickFillModal = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-ae9acd3f"]]);
10350
+ const DynamicQuickFillModal = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-840aca0a"]]);
10163
10351
  const _sfc_main = /* @__PURE__ */ defineComponent({
10164
10352
  __name: "dynamic-table-action",
10165
10353
  props: {
@@ -10243,109 +10431,117 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
10243
10431
  });
10244
10432
  const DynamicTableAction = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-53d7e66c"]]);
10245
10433
  export {
10246
- closeValidatorPopovers as $,
10247
- useFieldPresentation as A,
10434
+ setFormulaParamsConfig as $,
10435
+ getObjectBomProductQuery as A,
10248
10436
  BorderTD as B,
10249
- useRuntimeEditorFlusher as C,
10437
+ normalizeHistoricalAutofillRow as C,
10250
10438
  DEFAULT_BOOLEAN_FIELD_WIDTH as D,
10251
10439
  EMPTY_PRODUCT_VERSION_ID as E,
10252
- createRuntimeInstanceContext as F,
10253
- RuntimeInstanceRegistry as G,
10254
- RequiredQtyCalcRule as H,
10255
- registerFormulaFuncs as I,
10256
- DocumentPaper as J,
10257
- DynamicTableAction as K,
10258
- getRuntimeDataFieldId as L,
10259
- MULTI_SHEET_SCHEMA_VERSION as M,
10440
+ parseRuntimeFieldPath as F,
10441
+ useStyles as G,
10442
+ useDependency as H,
10443
+ useFieldPresentation as I,
10444
+ useRuntimeEditorFlusher as J,
10445
+ createRuntimeInstanceContext as K,
10446
+ RuntimeInstanceRegistry as L,
10447
+ MAX_RUNTIME_SHEETS as M,
10260
10448
  NCB_PROVIDE as N,
10261
- buildRuntimeFieldPath as O,
10262
- resolveRuntimeFieldProps as P,
10263
- resolveRuntimeFieldState as Q,
10449
+ RequiredQtyCalcRule as O,
10450
+ DocumentPaper as P,
10451
+ DynamicTableAction as Q,
10264
10452
  RuntimeFormStateStore as R,
10265
10453
  ScanParamType as S,
10266
- getRuntimeDependencyOutputKey as T,
10267
- isRowAddedInCurrentFormChange as U,
10268
- MaterialConsumeTableController as V,
10269
- setFormulaParamsConfig as W,
10270
- normalizeRuntime as X,
10271
- RuntimeSheetService as Y,
10272
- validateObjectBomQtyOnSubmit as Z,
10454
+ getRuntimeDataFieldId as T,
10455
+ buildRuntimeFieldPath as U,
10456
+ resolveRuntimeFieldProps as V,
10457
+ resolveRuntimeFieldState as W,
10458
+ getRuntimeDependencyOutputKey as X,
10459
+ isRowAddedInCurrentFormChange as Y,
10460
+ MaterialConsumeTableController as Z,
10273
10461
  _sfc_main$5 as _,
10274
- normalizeHistoricalBusinessRow as a,
10275
- enrichFormChangeRowDetails as a0,
10276
- useMaterialBalance as a1,
10277
- collectFormChangeFieldLocations as a2,
10278
- nextFormChangeRowViewHistoryId as a3,
10279
- DeviceConnector as a4,
10280
- DocumentLoading as a5,
10281
- DynamicQuickFillModal as a6,
10282
- FixedQuickFillModal as a7,
10283
- FormTmplConfigController as a8,
10284
- LEGACY_RUNTIME_FORM_CONFIG_KEYS as a9,
10285
- resolveFormChangeRowUi as aA,
10286
- resolveRowFormChangeMark as aB,
10287
- setSelectMobileTdId as aC,
10288
- stripLegacyFormConfigFromPaper as aD,
10289
- SubTableActionMenuTypeEnum as aE,
10290
- getMenuByAction as aF,
10291
- SubTableActionEnum as aG,
10292
- resolveScanFillData as aH,
10293
- getInsertSubMenu as aI,
10294
- resolveScanAdjustType as aJ,
10295
- resolveScanQty as aK,
10296
- toDateOnly as aL,
10297
- getCopySubMenu as aM,
10298
- resolveScanParsedValue as aN,
10299
- isProductBatchEmptyRow as aO,
10300
- LEGACY_RUNTIME_SHEET_ID as aa,
10301
- LEGACY_RUNTIME_SHEET_TITLE as ab,
10302
- MCDataUtil as ac,
10303
- OCR_MODEL_PRECISION_ENUM_KEY as ad,
10304
- RuntimeAsyncTaskCoordinator as ae,
10305
- RuntimeDependencyService as af,
10306
- RuntimeFieldRegistry as ag,
10307
- RuntimeInstanceEventBus as ah,
10308
- RuntimePersistenceCoordinator as ai,
10309
- RuntimeValidationService as aj,
10310
- SubTableCore as ak,
10311
- buildFormChangeDisplayRows as al,
10312
- convertV1Runtime as am,
10313
- detailsHaveFormChangeRowOps as an,
10314
- extractFormChangeRowDetails as ao,
10315
- getFormChangeRowKey as ap,
10316
- getFormChangeRowOp as aq,
10317
- getSubTableQuickFillInfo as ar,
10318
- isAnnLocationSelected as as,
10319
- isBlank as at,
10320
- isFormChangeGhostRow as au,
10321
- normalizeHistoricalFieldConfig as av,
10322
- pickObjectFieldKeys as aw,
10323
- recordSubtableRowAdd as ax,
10324
- recordSubtableRowDelete as ay,
10325
- resolveAnnotationFieldLocation as az,
10326
- DeviceLinkTmplUtil as b,
10327
- createRuntimeDocumentV2 as c,
10328
- normalizeAIOcrTmpl as d,
10329
- useWidgetStaticAttrs as e,
10330
- useRuntimeInstanceServices as f,
10462
+ MAX_RUNTIME_SHEET_TITLE_LENGTH as a,
10463
+ normalizeRuntime as a0,
10464
+ RuntimeSheetService as a1,
10465
+ validateObjectBomQtyOnSubmit as a2,
10466
+ closeValidatorPopovers as a3,
10467
+ enrichFormChangeRowDetails as a4,
10468
+ useMaterialBalance as a5,
10469
+ collectFormChangeFieldLocations as a6,
10470
+ nextFormChangeRowViewHistoryId as a7,
10471
+ DeviceConnector as a8,
10472
+ DocumentLoading as a9,
10473
+ pickObjectFieldKeys as aA,
10474
+ recordSubtableRowAdd as aB,
10475
+ recordSubtableRowDelete as aC,
10476
+ resolveAnnotationFieldLocation as aD,
10477
+ resolveFormChangeRowUi as aE,
10478
+ resolveRowFormChangeMark as aF,
10479
+ setSelectMobileTdId as aG,
10480
+ stripLegacyFormConfigFromPaper as aH,
10481
+ SubTableActionMenuTypeEnum as aI,
10482
+ getMenuByAction as aJ,
10483
+ SubTableActionEnum as aK,
10484
+ resolveScanFillData as aL,
10485
+ buildDefaultMapFromProfile as aM,
10486
+ buildFieldStatusFromProfile as aN,
10487
+ getRowHandlersForFieldChange as aO,
10488
+ getInsertSubMenu as aP,
10489
+ resolveScanAdjustType as aQ,
10490
+ resolveScanQty as aR,
10491
+ toDateOnly as aS,
10492
+ hasSubtableBusinessData as aT,
10493
+ getCopySubMenu as aU,
10494
+ resolveScanParsedValue as aV,
10495
+ isProductBatchEmptyRow as aW,
10496
+ DynamicQuickFillModal as aa,
10497
+ FixedQuickFillModal as ab,
10498
+ FormTmplConfigController as ac,
10499
+ LEGACY_RUNTIME_FORM_CONFIG_KEYS as ad,
10500
+ LEGACY_RUNTIME_SHEET_ID as ae,
10501
+ LEGACY_RUNTIME_SHEET_TITLE as af,
10502
+ MCDataUtil as ag,
10503
+ OCR_MODEL_PRECISION_ENUM_KEY as ah,
10504
+ RuntimeAsyncTaskCoordinator as ai,
10505
+ RuntimeDependencyService as aj,
10506
+ RuntimeFieldRegistry as ak,
10507
+ RuntimeInstanceEventBus as al,
10508
+ RuntimePersistenceCoordinator as am,
10509
+ RuntimeValidationService as an,
10510
+ SubTableCore as ao,
10511
+ buildFormChangeDisplayRows as ap,
10512
+ convertV1Runtime as aq,
10513
+ detailsHaveFormChangeRowOps as ar,
10514
+ extractFormChangeRowDetails as as,
10515
+ getFormChangeRowKey as at,
10516
+ getFormChangeRowOp as au,
10517
+ getSubTableQuickFillInfo as av,
10518
+ isAnnLocationSelected as aw,
10519
+ isBlank as ax,
10520
+ isFormChangeGhostRow as ay,
10521
+ normalizeHistoricalFieldConfig as az,
10522
+ bindFormulaCacheInvalidation as b,
10523
+ currentParamsConfig as c,
10524
+ MULTI_SHEET_SCHEMA_VERSION as d,
10525
+ createRuntimeDocumentV2 as e,
10526
+ findFieldProfile as f,
10331
10527
  getBusinessFieldKey as g,
10332
- setSelectAnnotationId as h,
10333
- useRuntimeRowState as i,
10334
- getObjectBomMaterialLotQuery as j,
10335
- buildObjectLotExtraQuery as k,
10336
- MaterialConsumptionPatternEnum as l,
10337
- resolveObjectBomEntry as m,
10528
+ normalizeHistoricalBusinessRow as h,
10529
+ DeviceLinkTmplUtil as i,
10530
+ normalizeAIOcrTmpl as j,
10531
+ useWidgetStaticAttrs as k,
10532
+ useRuntimeInstanceServices as l,
10533
+ setSelectAnnotationId as m,
10338
10534
  normalizeFieldWidth as n,
10339
- runWithFillProduct as o,
10340
- useNocodeFormWidget as p,
10341
- applyConsumeObjectTraceChange as q,
10535
+ useRuntimeRowState as o,
10536
+ getObjectBomMaterialLotQuery as p,
10537
+ buildObjectLotExtraQuery as q,
10342
10538
  resolveObjectFieldKeys as r,
10343
10539
  setSelectValidatorId as s,
10344
- getObjectBomProductQuery as t,
10540
+ MaterialConsumptionPatternEnum as t,
10345
10541
  useFormTmplConfig as u,
10346
10542
  validateObjectBomForScan as v,
10347
- normalizeHistoricalAutofillRow as w,
10348
- parseRuntimeFieldPath as x,
10349
- useStyles as y,
10350
- useDependency as z
10543
+ resolveObjectBomEntry as w,
10544
+ runWithFillProduct as x,
10545
+ useNocodeFormWidget as y,
10546
+ applyConsumeObjectTraceChange as z
10351
10547
  };