@gct-paas/excel 0.1.28-beta.2 → 0.1.28-beta.21

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 (224) hide show
  1. package/dist/{VueVideoPlayer-B6X1JmEL.js → VueVideoPlayer-DCU2I_H7.js} +2 -2
  2. package/dist/{agg-design-DZpDRz0Y.js → agg-design-RbW6fgNa.js} +1 -1
  3. package/dist/{agg-props-ockP_cAM.js → agg-props-CfoEBrRu.js} +1 -1
  4. package/dist/{agg-style-C7nWM2if.js → agg-style-CgbQAKr0.js} +1 -1
  5. package/dist/{align-editor-DpWvsI_x.js → align-editor-B80IEr3w.js} +1 -1
  6. package/dist/{attach-fields-editor-BbWYEXfG.js → attach-fields-editor-BIiVvohl.js} +2 -2
  7. package/dist/{barcode-design-D1hSeWVJ.js → barcode-design-DOLYhwbG.js} +2 -2
  8. package/dist/base/index.es.js +886 -703
  9. package/dist/{base-font-editor-DFHc_3JJ.js → base-font-editor-e9sd4IkJ.js} +2 -2
  10. package/dist/{boolean-design-UO0nUx1k.js → boolean-design-Dlu6lW8d.js} +8 -7
  11. package/dist/{boolean-props--l1hf_NI.js → boolean-props-s96hsuRe.js} +3 -3
  12. package/dist/{boolean-style-Dqwd3N4b.js → boolean-style-f5mMhRME.js} +4 -4
  13. package/dist/{cell-upload-PkWTiWYW.js → cell-upload-DYgGT9In.js} +8 -11
  14. package/dist/{date-range-editor-CVQsTg3G.js → date-range-editor-BUGosnLi.js} +2 -2
  15. package/dist/{date-time-design-DmeUPsi-.js → date-time-design-BdZ_d-PG.js} +25 -6
  16. package/dist/{date-time-props-DqAAdD7L.js → date-time-props-tlQ_cWpv.js} +3 -3
  17. package/dist/{date-time-style-BTtKVpV4.js → date-time-style--7vBwDaL.js} +1 -1
  18. package/dist/{decimal-design-DQ-61MMF.js → decimal-design-C0K5wkAw.js} +1 -1
  19. package/dist/{decimal-display-mode-CPL-jNCK.js → decimal-display-mode-C3qGt4Zt.js} +2 -2
  20. package/dist/{decimal-props-DUeC4_o5.js → decimal-props-PGR7K6rT.js} +4 -4
  21. package/dist/{decimal-style-B-0QILJa.js → decimal-style-D2u4XTHf.js} +1 -1
  22. package/dist/{default-value-editor.vue_vue_type_script_setup_true_name_default-value-editor_lang-CeTlpjT4.js → default-value-editor.vue_vue_type_script_setup_true_name_default-value-editor_lang-BWpYVxPc.js} +2 -2
  23. package/dist/{diagonal-design-Cx7RTy6_.js → diagonal-design-BrGfDqGb.js} +2 -2
  24. package/dist/{double-design-Bpuy9Ss3.js → double-design-B1Uiy26Z.js} +1 -1
  25. package/dist/{double-props-BLp5rMS0.js → double-props-yH1fU0x4.js} +6 -4
  26. package/dist/{double-style-BQT4UDRo.js → double-style-BVx9woku.js} +1 -1
  27. package/dist/{dynamic-table-action-CT_aYOca.js → dynamic-table-action-Bg2X8eeh.js} +586 -380
  28. package/dist/{dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-SAa6KGYz.js → dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-B-KhKgs2.js} +700 -332
  29. package/dist/{edit.utils-CXmmCnxE-CrBcZqbG.js → edit.utils-CXmmCnxE-C46O9P-0.js} +1 -1
  30. package/dist/{enum-design-DTh9UhHf.js → enum-design-D7-yLeJb.js} +11 -4
  31. package/dist/{enum-props-J-3PLabW.js → enum-props-COQQfulB.js} +68 -47
  32. package/dist/{enum-style-h5lmzZD_.js → enum-style-CcebnktY.js} +3 -3
  33. package/dist/excel.css +1373 -722
  34. package/dist/{exceljs.min-mW_Nqru2.js → exceljs.min-Muu74e_A.js} +2 -2
  35. package/dist/{expression-design-Cbi_6pnX.js → expression-design-DIJRzVab.js} +1 -1
  36. package/dist/{expression-props-DuvdDUWt.js → expression-props-Dd1_kGVD.js} +1 -1
  37. package/dist/{expression-style-CcdTrGye.js → expression-style-Bp-2sfOx.js} +1 -1
  38. package/dist/{file-design-Cix4ztNq.js → file-design-DLIY-29d.js} +1 -1
  39. package/dist/{file-props-DvZgFCjv.js → file-props-QGxoOGHI.js} +5 -4
  40. package/dist/{file-style-DTXliETB.js → file-style-CQZsWmvF.js} +1 -1
  41. package/dist/{font-editor-D_4CECiK.js → font-editor-DyrF1wB8.js} +3 -3
  42. package/dist/{image-design-BxFQTm4-.js → image-design-4odCIiI7.js} +3 -2
  43. package/dist/{image-design-IaQbw4Bv.js → image-design-eVwFd3tD.js} +1 -1
  44. package/dist/{image-props-BmLfiJIb.js → image-props-cT1RL-gD.js} +1 -1
  45. package/dist/{image-style-BuGQiWh9.js → image-style-MnNoeDW2.js} +1 -1
  46. package/dist/{index-hkXYQoCV.js → index-2I_EN7Yx.js} +6 -6
  47. package/dist/{index-DnxIXenr.js → index-2gNIJ0-V.js} +2 -2
  48. package/dist/{index-Dl48Dmuf.js → index-3JgiYInP.js} +1 -1
  49. package/dist/{index-CvefH3Ld.js → index-BBnBDqub.js} +1 -1
  50. package/dist/{index-V3KPtSlA.js → index-BC-6IALL.js} +1 -1
  51. package/dist/{index-DIHeOfRf.js → index-BEKNxaNo.js} +1 -1
  52. package/dist/{index-T_P3hv-X.js → index-BITMorpM.js} +2 -2
  53. package/dist/{index-DuELqbrc.js → index-BcLaruk3.js} +1 -1
  54. package/dist/{index-C7XazAkv.js → index-BeFplGKa.js} +121 -455
  55. package/dist/{index-CO1Iw_97.js → index-BhgnUKpp.js} +1 -1
  56. package/dist/{index-VU8yct3A.js → index-BidsDLhX.js} +1 -1
  57. package/dist/{index-5E89tzgQ.js → index-Bn9kqGy7.js} +1 -1
  58. package/dist/{index-PgmRu5Zh.js → index-C-e2nOug.js} +1 -1
  59. package/dist/{index-CYc23F99.js → index-CBIz0i4u.js} +1 -1
  60. package/dist/{index-1kSDRqJL.js → index-CEa50csS.js} +1 -1
  61. package/dist/{index-CSGDQQxf.js → index-CLKf0Gla.js} +6 -6
  62. package/dist/{index-HHW_GvS9.js → index-CMN7FUpJ.js} +1 -1
  63. package/dist/{index-aZhb-M_v.js → index-CO1k5u4I.js} +1 -1
  64. package/dist/{index-BKQgEYOt.js → index-CRbhhL-C.js} +1 -1
  65. package/dist/{index-CmfE-VkX.js → index-CaNmok7V.js} +1 -1
  66. package/dist/{index-BCFgHqQ4.js → index-Cjfws4Sx.js} +1 -1
  67. package/dist/{index-BuucdbMD.js → index-CnH58RKA.js} +1 -1
  68. package/dist/{index-BSWx0ysi.js → index-DCucm9qw.js} +1 -1
  69. package/dist/{index-DJsySg7Z.js → index-DJRgFTjP.js} +1 -1
  70. package/dist/{index-CdoJjtvt.js → index-DS3Z0wlu.js} +2 -2
  71. package/dist/{index-BRifPJNN.js → index-DW9FL8UO.js} +2 -2
  72. package/dist/{index-DG8SGSHV.js → index-DlGnj7bK.js} +1 -1
  73. package/dist/{index-hcp9zj3F.js → index-QFP7aiss.js} +7621 -3448
  74. package/dist/{index-uIR6j0YE.js → index-bk4bX2Xm.js} +1 -1
  75. package/dist/{index-DAVndG-D.js → index-islXi0nD.js} +2 -2
  76. package/dist/{index-DayP0trN.js → index-kCtDgCx3.js} +1 -1
  77. package/dist/{index-6AnvwL1T.js → index-oabZhVuL.js} +1 -1
  78. package/dist/{index-BUEsJ6db.js → index-tWQfSOrQ.js} +1 -1
  79. package/dist/index.es.js +45 -45
  80. package/dist/{integer-design-B48BapfF.js → integer-design-BD-LDEV_.js} +1 -1
  81. package/dist/{integer-props-G5n3P-Vt.js → integer-props-DZvJ_bdU.js} +4 -4
  82. package/dist/{integer-style-yziEYd90.js → integer-style-CxTdmZsN.js} +1 -1
  83. package/dist/{mb-render-DiWQ5hOn.js → mb-render-B9PVK2lM.js} +2 -1
  84. package/dist/{number-input-ex-6e_-B7y7.js → number-input-ex-BpIoI25j.js} +1 -1
  85. package/dist/{org-design-DEibx7uD.js → org-design-DWZI8xev.js} +1 -1
  86. package/dist/{org-props-uZzEnRfn.js → org-props-D0D94kmP.js} +2 -2
  87. package/dist/{org-style-CtYMw9ob.js → org-style-B_7Bhmgz.js} +1 -1
  88. package/dist/{pagination-design-CdnyxoR4.js → pagination-design-CWNP4U9A.js} +2 -2
  89. package/dist/paper-widget-design-CMzzcWw8.js +4 -0
  90. package/dist/{qrcode-design-Bh_lT1Yn.js → qrcode-design-DeCNb5kH.js} +1 -1
  91. package/dist/quick-search.util-DbpUfahg.js +77 -0
  92. package/dist/{ref-autofill-editor-99WrBySm.js → ref-autofill-editor-DQnrKJfB.js} +152 -115
  93. package/dist/{ref-design-C7LbDVQz.js → ref-design-BQ8o1gKm.js} +1 -1
  94. package/dist/{ref-props-BGzOHDvi.js → ref-props-BnrWZt61.js} +22 -13
  95. package/dist/{ref-style-C1-VGUt9.js → ref-style-BHBHe1mo.js} +1 -1
  96. package/dist/{regex-editor-BAjvqlvo.js → regex-editor-ChABNYS9.js} +94 -67
  97. package/dist/{revo-grid.entry-Cg-4cMIo.js → revo-grid.entry-DIdL7jYD.js} +1 -1
  98. package/dist/{revogr-attribution_7.entry-DzamtFvo.js → revogr-attribution_7.entry-DBPjWGup.js} +3 -3
  99. package/dist/{revogr-clipboard_3.entry-CIxDfW07.js → revogr-clipboard_3.entry-MYdZD9tl.js} +2 -2
  100. package/dist/{revogr-data_4.entry-BNENcgpR.js → revogr-data_4.entry-C4rrqPT4.js} +2 -2
  101. package/dist/{revogr-filter-panel.entry-BrYsomo0.js → revogr-filter-panel.entry-BAU18Dos.js} +1 -1
  102. package/dist/{select-render-type-editor.vue_vue_type_script_setup_true_lang-Dg2h8nwx.js → select-render-type-editor.vue_vue_type_script_setup_true_lang-D_WfbMb1.js} +2 -2
  103. package/dist/{serialnumber-design-BsAogg1u.js → serialnumber-design-CckdQzWc.js} +1 -1
  104. package/dist/shared/index.es.js +22 -22
  105. package/dist/{signature-design-sSyiIxFB.js → signature-design-TKvCOON-.js} +1 -1
  106. package/dist/{signature-props-CYmd9GVl.js → signature-props-D1pC6hm4.js} +3 -3
  107. package/dist/{signature-style-wLJo19Kd.js → signature-style-BLrwnz_M.js} +1 -1
  108. package/dist/{single-field-drop-CilJB5DX.js → single-field-drop-C-PadB1d.js} +2 -2
  109. package/dist/{size-editor-DnyvSWUn.js → size-editor-szo7icZ-.js} +1 -1
  110. package/dist/src/adapter/adapter.d.ts +10 -0
  111. package/dist/src/adapter/setup.d.ts +11 -0
  112. package/dist/src/domain/table/business/warehouse/warehouse-inventory/profile/field-keys.d.ts +0 -2
  113. package/dist/src/index.d.ts +1 -2
  114. package/dist/src/nocode-base/src/core/sub-table/allocate-table-core.d.ts +3 -4
  115. package/dist/src/nocode-base/src/core/sub-table/index.d.ts +2 -0
  116. package/dist/src/nocode-base/src/core/sub-table/pretreatment-list-table-core.d.ts +3 -12
  117. package/dist/src/nocode-base/src/core/sub-table/profile-driven-sub-table-core.d.ts +19 -17
  118. package/dist/src/nocode-base/src/core/sub-table/sterilize-batch-table-core.d.ts +3 -14
  119. package/dist/src/nocode-base/src/core/sub-table/stocktake-table-core.d.ts +6 -5
  120. package/dist/src/nocode-base/src/core/sub-table/sub-table-core.d.ts +11 -0
  121. package/dist/src/nocode-base/src/core/sub-table/utils/scan/index.d.ts +3 -0
  122. package/dist/src/nocode-base/src/core/sub-table/utils/scan/inventory-scan-api.d.ts +9 -0
  123. package/dist/src/nocode-base/src/core/sub-table/utils/scan/production-identification-scan-api.d.ts +9 -0
  124. package/dist/src/nocode-base/src/core/sub-table/utils/scan/scan-helpers.d.ts +38 -0
  125. package/dist/src/nocode-base/src/core/sub-table/utils/stocktake/stocktake-calc.d.ts +6 -59
  126. package/dist/src/nocode-base/src/core/sub-table/warehouse-in-table-core.d.ts +11 -0
  127. package/dist/src/nocode-base/src/core/sub-table/warehouse-out-table-core.d.ts +21 -0
  128. package/dist/src/nocode-base/src/hooks/index.d.ts +1 -1
  129. package/dist/src/nocode-base/src/hooks/label-parse-rule/type.d.ts +6 -0
  130. package/dist/src/nocode-base/src/hooks/material-consume/bom-validator.d.ts +15 -74
  131. package/dist/src/nocode-base/src/hooks/material-consume/material-consume-table-controller.d.ts +32 -19
  132. package/dist/src/nocode-base/src/hooks/material-consume/tmpl-bom-controller.d.ts +4 -4
  133. package/dist/src/nocode-base/src/hooks/material-consume/types.d.ts +15 -0
  134. package/dist/src/nocode-base/src/hooks/material-consume-object/bom-validator.d.ts +38 -0
  135. package/dist/src/nocode-base/src/hooks/material-consume-object/index.d.ts +2 -0
  136. package/dist/src/nocode-base/src/hooks/material-consume-object/use-tmpl-bom.d.ts +13 -0
  137. package/dist/src/nocode-base/src/hooks/material-date/material-date.d.ts +14 -0
  138. package/dist/src/nocode-base/src/hooks/useRenderPageFactory.d.ts +6 -0
  139. package/dist/src/nocode-base/src/hooks/validation/useFormValidator.d.ts +2 -0
  140. package/dist/src/nocode-base/src/interface/device-query.d.ts +31 -0
  141. package/dist/src/nocode-base/src/interface/index.d.ts +1 -0
  142. package/dist/src/nocode-base/src/interface/render.d.ts +1 -0
  143. package/dist/src/nocode-base/src/interface/transform.d.ts +1 -1
  144. package/dist/src/nocode-base/src/types/business/index.d.ts +11 -1
  145. package/dist/src/nocode-base/src/types/business/pretreatment-list.d.ts +3 -1
  146. package/dist/src/nocode-base/src/types/business/sterilize-batch.d.ts +3 -1
  147. package/dist/src/nocode-base/src/types/business/stocktake.d.ts +3 -1
  148. package/dist/src/nocode-base/src/types/common/base.d.ts +4 -0
  149. package/dist/src/nocode-base/src/types/render/sub-table-render.d.ts +7 -0
  150. package/dist/src/nocode-web-render/src/render/parse-rule/add-rule-btn.vue.d.ts +2 -0
  151. package/dist/src/nocode-web-render/src/render/parse-rule/parse-rule-modal.vue.d.ts +1 -0
  152. package/dist/src/nocode-web-render/src/render/sub-table/common/scan-modal.vue.d.ts +0 -1
  153. package/dist/src/nocode-web-render/src/render/sub-table/common/sub-table-render.d.ts +2 -1
  154. package/dist/src/nocode-web-render/src/render/sub-table/stocktake/index.d.ts +0 -1
  155. package/dist/src/nocode-web-render/src/render/sub-table/stocktake/stocktake-web-render.d.ts +11 -1
  156. package/dist/src/online-form/src/views/__cell_widgets__/cell-widget-dependency.vue.d.ts +1 -0
  157. package/dist/src/online-form/src/views/__cell_widgets__/common/display-fields-editor/display-fields-editor.vue.d.ts +3 -3
  158. package/dist/src/online-form/src/views/__cell_widgets__/common/display-fields-editor/display-fields.util.d.ts +6 -0
  159. package/dist/src/online-form/src/views/__cell_widgets__/common/quick-search-editor/quick-search.util.d.ts +11 -3
  160. package/dist/src/online-form/src/views/designer/constants/index.d.ts +2 -4
  161. package/dist/src/online-form/src/views/designer/hooks/useAllSpreadSheets.d.ts +473 -0
  162. package/dist/src/online-form/src/views/designer/hooks/useModelFields.d.ts +7 -0
  163. package/dist/src/online-form/src/views/designer/hooks/useSpreadSheet.d.ts +622 -2
  164. package/dist/src/online-form/src/views/designer/modules/modals/add-dependency-modal/add-dependency-modal.vue.d.ts +5 -1
  165. package/dist/src/online-form/src/views/designer/modules/panel/comps/signature-config/config-modal.vue.d.ts +2 -0
  166. package/dist/src/online-form/src/views/designer/modules/panel/comps/signature-config/field-tree-select.vue.d.ts +1 -0
  167. package/dist/src/online-form/src/views/designer/modules/panel/comps/signature-config/index.d.ts +1 -1
  168. package/dist/src/online-form/src/views/designer/modules/panel/material-consumption/policy-items/consume-item.vue.d.ts +20 -0
  169. package/dist/src/online-form/src/views/designer/modules/panel/material-consumption/policy-items/qty-item/bom-formula-editor.vue.d.ts +18 -0
  170. package/dist/src/online-form/src/views/designer/modules/panel/material-consumption/policy-items/qty-item/qty-item.vue.d.ts +15 -0
  171. package/dist/src/online-form/src/views/designer/modules/panel/material-consumption/policy-items/substitute-item.vue.d.ts +23 -0
  172. package/dist/src/online-form/src/views/designer/modules/panel/panel-data-init-config/object-init/hooks/useObjectInit.d.ts +62 -0
  173. package/dist/src/online-form/src/views/designer/modules/panel/panel-data-init-config/object-init/index.d.ts +0 -1
  174. package/dist/src/online-form/src/views/designer/modules/panel/sub-table/comps/use-dynamic-sub-table-panel.d.ts +292 -0
  175. package/dist/src/online-form/src/views/designer/modules/panel/sub-table/material-consumption/bom-modal.vue.d.ts +1 -1
  176. package/dist/src/online-form/src/views/designer/modules/panel/sub-table/material-consumption/edit-parse-rule.vue.d.ts +1 -0
  177. package/dist/src/online-form/src/views/designer/types/index.d.ts +5 -15
  178. package/dist/src/online-form/src/views/designer/utils/design-readonly-modal.d.ts +3 -0
  179. package/dist/src/online-form/src/views/inline-cell/use-inline-icon-catalog.d.ts +2 -3
  180. package/dist/src/online-form/src/views/render/__components__/_field_/trace/composables/assoc-filter.d.ts +5 -4
  181. package/dist/src/online-form/src/views/render/__components__/_field_/trace/utils/columns.d.ts +2 -1
  182. package/dist/src/shared/components/Signature/card-signer.vue.d.ts +14 -0
  183. package/dist/src/shared/components/Signature/logic/index.d.ts +1 -0
  184. package/dist/src/shared/components/Signature/security-config.d.ts +6 -0
  185. package/dist/src/shared/components/Signature/ui/password-signer.vue.d.ts +1 -0
  186. package/dist/src/shared/components/Signature/ui/sign-switcher-modal.vue.d.ts +8 -5
  187. package/dist/src/shared/components/Signature/ui/sign-switcher.vue.d.ts +1 -0
  188. package/dist/src/shared/components/field-transfer/components/field-transfer-modal.vue.d.ts +2 -0
  189. package/dist/src/shared/components/field-transfer/components/modal-wrapper.vue.d.ts +2 -0
  190. package/dist/src/shared/components/field-transfer/useFieldTransfer.d.ts +2 -0
  191. package/dist/src/shared/components/rdo-tree-select/rdo-tree-select.vue.d.ts +1 -0
  192. package/dist/src/shared/enum/field-type.d.ts +12 -0
  193. package/dist/src/shared/utils/lot2sn.d.ts +22 -0
  194. package/dist/{text-design-7Cct8yh2.js → text-design-C8gY_Ud0.js} +5 -5
  195. package/dist/{text-design-DKPFi1Rh.js → text-design-DUOCvsW-.js} +2 -2
  196. package/dist/{text-props-a-16iwJu.js → text-props-D-KBRHkK.js} +5 -5
  197. package/dist/{text-style-CRqOGAZr.js → text-style-D75O3cAI.js} +1 -1
  198. package/dist/{throttle-Cpk1LoGk-BYyz4gtI.js → throttle-Cpk1LoGk-D40m8Nov.js} +1 -1
  199. package/dist/{timediff-design-JHt1-ug6.js → timediff-design-Brg2Aoo2.js} +1 -1
  200. package/dist/{trace-design-DAHDTG5n.js → trace-design-Bphl0RjB.js} +33 -9
  201. package/dist/{trace-props-B5FBtpNR.js → trace-props-DkH0QJYT.js} +63 -35
  202. package/dist/{trace-style-CgdePCcv.js → trace-style-DZx1slRE.js} +1 -1
  203. package/dist/{user-design-BRIV937X.js → user-design-fMF_h4IG.js} +4 -4
  204. package/dist/{user-props-BJVjolL7.js → user-props-u0p3vKkm.js} +2 -2
  205. package/dist/{user-style-D17ZPHqU.js → user-style-dhqwLgPW.js} +1 -1
  206. package/dist/{value-editor.vue_vue_type_style_index_0_lang-J3MR2K39.js → value-editor.vue_vue_type_style_index_0_lang-C1Y-__ux.js} +2 -2
  207. package/dist/{version-select-Bw8yzDaH.js → version-select-Cx1oBH6h.js} +1 -1
  208. package/dist/web-render/index.es.js +397 -24
  209. package/dist/{widget-barcode-IbgHM5xo.js → widget-barcode-D8F4NNVm.js} +4 -4
  210. package/dist/{widget-diagonal-juPAlqEe.js → widget-diagonal-DxWX94Uz.js} +3 -3
  211. package/dist/{widget-image-Dnaej-nk.js → widget-image-BZQOltF7.js} +6 -5
  212. package/dist/{widget-line-DL9jw_oY.js → widget-line-DrYIib_u.js} +4 -4
  213. package/dist/{widget-pagination-BlRJo3n4.js → widget-pagination-M80nEc3Z.js} +5 -5
  214. package/dist/{widget-power-CIC6itUt.js → widget-power-D7jJhsVT.js} +3 -3
  215. package/dist/{widget-qrcode-BWEOVEZg.js → widget-qrcode-CY6qnSPs.js} +3 -3
  216. package/dist/{widget-rangelimit-C4KG56d-.js → widget-rangelimit-CZ6cWnwZ.js} +3 -3
  217. package/dist/{widget-serialnumber-DnfRRyBY.js → widget-serialnumber-DHmkrctf.js} +1 -1
  218. package/dist/{widget-text-C7d0ZrX3.js → widget-text-C4e7Ec_2.js} +5 -5
  219. package/dist/{widget-timediff-FAvqRtXk.js → widget-timediff-B4JkGADo.js} +2 -2
  220. package/package.json +12 -1
  221. package/dist/paper-widget-design-gmMHiQFV.js +0 -4
  222. package/dist/src/nocode-base/src/hooks/material-stocktake/index.d.ts +0 -1
  223. package/dist/src/nocode-base/src/hooks/material-stocktake/useMaterialStocktake.d.ts +0 -8
  224. package/dist/src/online-form/src/views/designer/modules/panel/panel-data-init-config/object-init/object-init-modal.vue.d.ts +0 -26
@@ -1,10 +1,10 @@
1
- import { computed, watch, toRaw, onUnmounted, markRaw, ref, reactive, inject, provide, defineComponent, openBlock, createElementBlock, mergeProps, unref, createElementVNode, normalizeClass, renderSlot, createCommentVNode, createVNode, toDisplayString, toRef, isVNode, h, onBeforeMount, resolveComponent, createBlock, withCtx, Fragment, renderList, createTextVNode, onMounted } from "vue";
1
+ import { computed, watch, toRaw, onUnmounted, markRaw, ref, inject, unref, provide, reactive, defineComponent, openBlock, createElementBlock, mergeProps, createElementVNode, normalizeClass, renderSlot, createCommentVNode, createVNode, toDisplayString, toRef, isVNode, h, onBeforeMount, resolveComponent, createBlock, withCtx, Fragment, renderList, createTextVNode, onMounted } from "vue";
2
2
  import { isNil, cloneDeep, merge, pickBy, mergeWith, omit, last, pick } from "lodash-es";
3
- import { aw as useWidgetStaticAttrs, m as ComponentTypeEnum, cq as assembleRules, cr as deleteFormRule, cs as setFormRule, bl as requestDisplayValidation, ct as isReferenceOptionActive, cu as validateAllFields, cv as runValidation, co as stockCheck, cw as ensureFrontRowKey, cx as FRONT_ROW_KEY, by as getRowId, aH as getParseRuleInfo, bf as transformUtils, cc as materialCheck, aK as getLotLockedReason, aP as FormulaRuleFieldKeyEnum, cb as judgeUnique, w as api, d as SubTableType, aI as getParseRuleValue, bs as uuid2, ao as DeviceLink, _ as _export_sfc, aE as NCB_PROVIDE, bQ as buildFormChangeDisplayRows, cm as resolveRowFormChangeMark, cl as resolveFormChangeRowUi, c6 as isAnnLocationSelected, cn as setSelectMobileTdId, c7 as isFormChangeGhostRow, t as CellType, ay as setSelectAnnotationId, cg as recordSubtableRowDelete, bS as deleteSubtableRow, ch as relocateDeletedRowsToEnd, c5 as insertSubtableRows, cf as recordSubtableRowAdd, aJ as useCurrentPageFormState, aB as renderUtils, y as useModal, cy as q, cz as groupFixedTableRows, cA as QUICK_FILL_ALLOWED_FIELDS, cB as processQuickFillRows, cC as getIsGroupEmpty, aM as RenderModeEnum, c0 as getSubTableQuickFillInfo } from "./dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-SAa6KGYz.js";
3
+ import { ax as useWidgetStaticAttrs, Q as PlatformEnum, m as ComponentTypeEnum, cE as assembleRules, cF as deleteFormRule, cG as setFormRule, bx as requestDisplayValidation, cH as isReferenceOptionActive, cI as validateAllFields, cJ as runValidation, cK as ensureFrontRowKey, cL as FRONT_ROW_KEY, bK as getRowId, aL as getParseRuleInfo, br as transformUtils, aO as materialCheck, aP as getLotLockedReason, aU as FormulaRuleFieldKeyEnum, aF as NCB_PROVIDE, F as FIELD_TYPE, w as api, d as SubTableType, aM as getParseRuleValue, bE as uuid2, ap as DeviceLink, _ as _export_sfc, c3 as buildFormChangeDisplayRows, cA as resolveRowFormChangeMark, cz as resolveFormChangeRowUi, cl as isAnnLocationSelected, cB as setSelectMobileTdId, cm as isFormChangeGhostRow, t as CellType, az as setSelectAnnotationId, cu as recordSubtableRowDelete, c5 as deleteSubtableRow, cv as relocateDeletedRowsToEnd, ck as insertSubtableRows, ct as recordSubtableRowAdd, y as useModal, cM as q, cN as groupFixedTableRows, cO as QUICK_FILL_ALLOWED_FIELDS, cP as processQuickFillRows, cQ as getIsGroupEmpty, aS as RenderModeEnum, cf as getSubTableQuickFillInfo } from "./dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-B-KhKgs2.js";
4
4
  import dayjs from "dayjs";
5
5
  import { u as useNamespace } from "./use-namespace-BxkK4ofX.js";
6
6
  import { Modal, message } from "ant-design-vue";
7
- import { u as useFormModel } from "./mb-render-DiWQ5hOn.js";
7
+ import { u as useFormModel } from "./mb-render-B9PVK2lM.js";
8
8
  const InstanceStatusValues = {
9
9
  /** 作废状态 */
10
10
  ABANDON: "ABANDON",
@@ -76,7 +76,7 @@ function useStyles(widget, isArea = false) {
76
76
  }
77
77
  const constantRequiredStyles = {
78
78
  "--required-border-color": "#ffb0ae",
79
- "--required-border-hover-color": "rgb(255, 31, 31, 0.86)",
79
+ "--required-border-hover-color": "#ff7875",
80
80
  "--required-background-color": "#fff7f7"
81
81
  };
82
82
  const resetRequiredStyles = {
@@ -112,9 +112,15 @@ function useValidator(props) {
112
112
  showDisplayStatus,
113
113
  dataRelationShip
114
114
  } = useWidgetStaticAttrs(widget);
115
+ const isDpPlatform = computed(
116
+ () => dataRelationShip?.platformType === PlatformEnum.INTEGRATION_PAAS_DP
117
+ );
118
+ const rawCmpWidth = widget.props.cmpWidth;
119
+ const numericCmpWidth = Number(rawCmpWidth);
120
+ const normalizedCmpWidth = !isNil(rawCmpWidth) && Number.isFinite(numericCmpWidth) && numericCmpWidth >= 0 ? numericCmpWidth : 75;
115
121
  const sizeStyles = {
116
122
  "--size": `${widget.props.size ?? 12}px`,
117
- "--cmp-width": `${widget.props.cmpWidth ?? 0}px`,
123
+ "--cmp-width": `${normalizedCmpWidth}px`,
118
124
  "--cmp-height": `${widget.props.cmpHeight ?? 0}px`
119
125
  };
120
126
  const skipFormItem = computed(() => {
@@ -127,7 +133,7 @@ function useValidator(props) {
127
133
  return !!showDisabled.value || ["readonly-text", "readonly-component"].includes(showDisplayStatus.value);
128
134
  });
129
135
  const rules = computed(() => {
130
- if (skipFormItem.value || !targetFieldId) {
136
+ if (isDpPlatform.value || skipFormItem.value || !targetFieldId) {
131
137
  return [];
132
138
  }
133
139
  return assembleRules({
@@ -288,12 +294,14 @@ function useValidator(props) {
288
294
  () => isReferenceOptionActive(props.referenceInfo, props.formData)
289
295
  );
290
296
  const widgetStyles = computed(() => {
291
- if (widget.component === ComponentTypeEnum.DynValue) return {};
292
- const requiredActive = showRequired.value && !blocked.value && referenceActive.value;
297
+ if (widget.component === ComponentTypeEnum.DynValue) {
298
+ return isDpPlatform.value ? resetRequiredStyles : {};
299
+ }
300
+ const requiredActive = !isDpPlatform.value && showRequired.value && !blocked.value && referenceActive.value;
293
301
  const isAttachField = !!props.referenceInfo?.belongFieldId;
294
302
  return {
295
303
  ...sizeStyles,
296
- ...requiredActive ? constantRequiredStyles : isAttachField ? resetRequiredStyles : {},
304
+ ...isDpPlatform.value ? resetRequiredStyles : requiredActive ? constantRequiredStyles : isAttachField ? resetRequiredStyles : {},
297
305
  ...isVerticalLrText(widget.style) ? reliableVerticalTextStyles : {}
298
306
  };
299
307
  });
@@ -322,6 +330,16 @@ const validate = async (formData, paper, uniqueId) => {
322
330
  uiApplied: false
323
331
  };
324
332
  };
333
+ class McRowValidateError extends Error {
334
+ constructor(message2, targetFieldId, row) {
335
+ super(message2);
336
+ this.targetFieldId = targetFieldId;
337
+ this.row = row;
338
+ this.name = "McRowValidateError";
339
+ }
340
+ targetFieldId;
341
+ row;
342
+ }
325
343
  class BomEntryValidator {
326
344
  constructor(bomEntry, enableSequenceLoading, getMaterialNoNum, historyData, mainMaterialNo, noBomMode) {
327
345
  this.bomEntry = bomEntry;
@@ -494,7 +512,7 @@ class BomEntryValidator {
494
512
  }
495
513
  const allowed = (this.bomEntry.specified_material_entries_ ?? []).map((e) => e.name_).filter(Boolean);
496
514
  if (!allowed.includes(lot)) {
497
- throw new Error(`${lot},不在指定物料批次范围内`);
515
+ throw new McRowValidateError(`${lot},不在指定物料批次范围内`, "material_no_", row);
498
516
  }
499
517
  }
500
518
  /** 整组指定批次校验:组内每一行有批次值的都检查 */
@@ -509,47 +527,6 @@ class BomEntryValidator {
509
527
  this.validateSpecifiedMaterialNo(row);
510
528
  });
511
529
  }
512
- /**
513
- * 校验数量
514
- * @param arr
515
- * @return {*}
516
- */
517
- async validateNum(arr) {
518
- if (!this.bomEntry.qty_validation_enabled_) {
519
- return;
520
- }
521
- if (this.bomEntry.type_ === "view") {
522
- return;
523
- }
524
- const consumeNum = this.calcQtyConsumed(arr);
525
- if (consumeNum === 0) {
526
- return;
527
- }
528
- if (["eq", "lte"].includes(this.bomEntry.qty_validation_rule_) && consumeNum > this.remainingNum) {
529
- throw new Error($t("sys.edhr.mcTable.overMaterialConsumeError"));
530
- }
531
- if (this.bomEntry.qty_validation_rule_ === "bounds") {
532
- const groupData = this.filterGroupData(arr);
533
- const consumeSum = consumeNum + this.hasConsumed;
534
- const { max } = await this.calcCustomNumberLimit(groupData[0]);
535
- if (consumeSum > max) {
536
- throw new Error(
537
- $t("sys.edhr.mcTable.overBoundsMaxError", {
538
- product: this.bomEntry.product_code_,
539
- max
540
- })
541
- );
542
- }
543
- }
544
- return;
545
- }
546
- /**
547
- * 校验库存
548
- * @param row 当前行数据
549
- */
550
- async validateStock(row) {
551
- await stockCheck({ row, entry: this.bomEntry, mainMaterialNo: this.mainMaterialNo });
552
- }
553
530
  /**
554
531
  * 计算已经消耗的数量之和
555
532
  * @param arr
@@ -630,57 +607,6 @@ class BomEntryValidator {
630
607
  }
631
608
  }
632
609
  }
633
- /**
634
- * 按顺序投料用
635
- * 检查数据中的当前明细的填报是否已经完成
636
- * @param arr
637
- */
638
- async validateHasCompleted(arr) {
639
- const groupData = this.filterGroupData(arr);
640
- const message2 = $t("sys.edhr.mcTable.sequenceLoadingError", {
641
- product: this.bomEntry.product_code_
642
- });
643
- if (!groupData.length) {
644
- if (!this.bomEntry.force_loading_enabled_) {
645
- return;
646
- }
647
- throw new Error(message2);
648
- }
649
- if (this.bomEntry.type_ === "view") {
650
- return;
651
- }
652
- const consumeNum = this.calcQtyConsumed(groupData);
653
- if (!this.bomEntry.qty_validation_enabled_ && consumeNum) {
654
- return;
655
- }
656
- switch (this.bomEntry.qty_validation_rule_) {
657
- // 等于的时候要相等才算填报完成,小于的时候报错,大于由修改的时候报错,这边不报错
658
- case "eq":
659
- if (consumeNum < this.remainingNum) {
660
- throw new Error(message2);
661
- }
662
- break;
663
- // 大于等于的时候要大于等于才算完成
664
- case "gte":
665
- if (consumeNum < this.remainingNum) {
666
- throw new Error(message2);
667
- }
668
- break;
669
- // 小于等于的时候要小于等于有值就算算完成
670
- case "lte":
671
- if (consumeNum <= 0) {
672
- throw new Error(message2);
673
- }
674
- break;
675
- case "bounds":
676
- const consumeSum = consumeNum + this.hasConsumed;
677
- const { min } = await this.calcCustomNumberLimit(groupData[0]);
678
- if (consumeSum < min) {
679
- throw new Error(message2);
680
- }
681
- break;
682
- }
683
- }
684
610
  }
685
611
  class BomEntriesValidator {
686
612
  constructor(entries, enableSequenceLoading, getMaterialNoNum, historyData, mainMaterialNo, noBomMode) {
@@ -708,10 +634,6 @@ class BomEntriesValidator {
708
634
  mainMaterialNo;
709
635
  noBomMode;
710
636
  bomEntryValidators;
711
- /** 当前批次/生产数量 */
712
- get materialNoNum() {
713
- return Number(this.getMaterialNoNum()) || 0;
714
- }
715
637
  /**
716
638
  * 翻译物料的code
717
639
  * @param productId
@@ -762,15 +684,6 @@ class BomEntriesValidator {
762
684
  }
763
685
  return true;
764
686
  }
765
- /** 取当前唯一编辑组的 BOM 明细 id;没有则 undefined */
766
- getEditingGroupId(arr) {
767
- if (!this.hasEditingGroup(arr)) return;
768
- const editRows = arr.filter((i) => !i.is_confirmed_ && !i.deleted_);
769
- for (const row of editRows) {
770
- const id = this.getRowGroupId(row);
771
- if (id) return id;
772
- }
773
- }
774
687
  /**
775
688
  * 行 → BOM 明细在 bomEntryValidators 中的下标,找不到返回 -1
776
689
  */
@@ -847,22 +760,6 @@ class BomEntriesValidator {
847
760
  if (cur >= next || cur >= this.bomEntryValidators.length) return;
848
761
  return this.bomEntryValidators[cur];
849
762
  }
850
- /**
851
- * 检验是否符合顺序投料的顺序要求
852
- * @param row 当前编辑的行
853
- * @param arr 所有的数据
854
- * @return {*}
855
- */
856
- async validateSequenceLoading(row, arr) {
857
- if (!this.enableSequenceLoading) {
858
- return;
859
- }
860
- const seqBomEntry = this.findSequenceBomEntry(arr);
861
- if (!seqBomEntry) throw new Error("没有查找到对应的上料顺序");
862
- if (!seqBomEntry.productIds.includes(row.product_id_)) {
863
- throw new Error($t("请按顺序上料"));
864
- }
865
- }
866
763
  /** 表中是否已有该 BOM 组(有物料行或带 bom_entry_id_ 的空行) */
867
764
  groupExistsInTable(arr, util) {
868
765
  return arr.some((row) => isRowInBomGroup(row, util));
@@ -994,15 +891,9 @@ class BomEntriesValidator {
994
891
  if (!rows.length) throw new Error($t("sys.edhr.mcTable.materialEmptyError"));
995
892
  rows.forEach((row) => {
996
893
  this.validateDataCompleted(row);
997
- if (row.expiration_date_ && dayjs(row.expiration_date_).endOf("day").isBefore(dayjs())) {
998
- throw new Error(
999
- $t("sys.expirationDateError", { product: row.product_id__lb_, lot: row.material_no_ })
1000
- );
1001
- }
1002
894
  });
1003
895
  util.validateSubstitute(arr);
1004
896
  util.validateLotMixing(arr);
1005
- util.validateSpecifiedMaterialNoForGroup(arr);
1006
897
  const orderIndex = this.resolveGroupOrderIndexByUtil(util, arr);
1007
898
  const groupNo = orderIndex >= 0 ? orderIndex + 1 : void 0;
1008
899
  await util.validateGroupQty(arr, this.enableSequenceLoading, groupNo);
@@ -1014,106 +905,98 @@ class BomEntriesValidator {
1014
905
  await this.validateGroup(arr, current);
1015
906
  }
1016
907
  /**
1017
- * 校验物料是否在bom里被使用
1018
- * @param row 单行的数据
908
+ * 行级错误(提交收集全部打标;切组/扫码抛第一条)
1019
909
  */
1020
- validateInBom(row) {
910
+ getRowFieldErrors(row) {
1021
911
  if (this.noBomMode) {
1022
- return;
912
+ return [];
1023
913
  }
914
+ const errors = [];
1024
915
  if (!row.product_id_) {
1025
- throw new Error($t("sys.edhr.mcTable.materialEmptyError"));
916
+ errors.push(
917
+ new McRowValidateError($t("sys.edhr.mcTable.materialEmptyError"), "product_id_", row)
918
+ );
919
+ return errors;
1026
920
  }
1027
921
  const util = this.findUtilByProductId(row.product_id_);
1028
922
  if (!util) {
1029
- throw new Error($t("匹配不到对应物料,请按规则上料或新增物料"));
923
+ errors.push(
924
+ new McRowValidateError($t("匹配不到对应物料,请按规则上料或新增物料"), "product_id_", row)
925
+ );
926
+ return errors;
1030
927
  }
1031
- }
1032
- /**
1033
- * 检查数据是否完整
1034
- * @param arr
1035
- */
1036
- validateDataCompleted(row) {
1037
- this.validateInBom(row);
1038
- const util = this.findUtilByProductId(row.product_id_);
1039
928
  const { type_ } = util.bomEntry;
1040
929
  if (type_ === "view") {
1041
- return;
930
+ return errors;
1042
931
  }
1043
932
  if (type_ === "by_lot" && !row.material_no_) {
1044
- throw new Error(
1045
- $t("sys.edhr.mcTable.materialNoEmptyError", {
1046
- product: this.translateProductCode(row.product_id_)
1047
- })
933
+ errors.push(
934
+ new McRowValidateError(
935
+ $t("sys.edhr.mcTable.materialNoEmptyError", {
936
+ product: this.translateProductCode(row.product_id_)
937
+ }),
938
+ "material_no_",
939
+ row
940
+ )
1048
941
  );
1049
942
  }
1050
943
  if (!row.qty_) {
1051
- throw new Error(
1052
- $t("sys.edhr.mcTable.materialNumEmptyError", {
1053
- product: this.translateProductCode(row.product_id_)
1054
- })
944
+ errors.push(
945
+ new McRowValidateError(
946
+ $t("sys.edhr.mcTable.materialNumEmptyError", {
947
+ product: this.translateProductCode(row.product_id_)
948
+ }),
949
+ "qty_",
950
+ row
951
+ )
1055
952
  );
1056
953
  }
954
+ if (row.expiration_date_ && dayjs(row.expiration_date_).endOf("day").isBefore(dayjs())) {
955
+ errors.push(
956
+ new McRowValidateError(
957
+ $t("sys.expirationDateError", {
958
+ product: row.product_id__lb_,
959
+ lot: row.material_no_
960
+ }),
961
+ "expiration_date_",
962
+ row
963
+ )
964
+ );
965
+ }
966
+ try {
967
+ util.validateSpecifiedMaterialNo(row);
968
+ } catch (e) {
969
+ if (e instanceof McRowValidateError) {
970
+ errors.push(e);
971
+ } else if (e?.message) {
972
+ errors.push(new McRowValidateError(e.message, "material_no_", row));
973
+ }
974
+ }
975
+ return errors;
1057
976
  }
1058
977
  /**
1059
- * 校验替代料校验
1060
- * @param arr
1061
- */
1062
- validateSubstitute(arr) {
1063
- this.bomEntryValidators.forEach((i) => {
1064
- i.validateSubstitute(arr);
1065
- });
1066
- }
1067
- /**
1068
- * 校验混批校验
1069
- * @param arr
1070
- */
1071
- validateLotMixing(arr) {
1072
- this.bomEntryValidators.forEach((i) => {
1073
- i.validateLotMixing(arr);
1074
- });
1075
- }
1076
- /**
1077
- * 通用校验 3(扫码/写入前):用 row + 表内同行组数据对比混批次数,不改动原 validateLotMixing
978
+ * 校验物料是否在bom里被使用
979
+ * @param row 单行的数据
1078
980
  */
1079
- validateLotMixingWithRow(row, arr) {
1080
- const util = this.findUtilByProductId(row.product_id_);
1081
- util?.validateLotMixingWithRow(row, arr);
981
+ validateInBom(row) {
982
+ const first = this.getRowFieldErrors(row).find((e) => e.targetFieldId === "product_id_");
983
+ if (first) throw first;
1082
984
  }
1083
985
  /**
1084
- * 校验数量
1085
- * @param arr
986
+ * 检查数据是否完整(切组/扫码:遇错即抛)
1086
987
  */
1087
- async validateNum(arr) {
1088
- const validatePromises = this.bomEntryValidators.map((i) => i.validateNum(arr));
1089
- await Promise.all(validatePromises);
1090
- }
1091
- /**
1092
- * 校验库存消耗
1093
- * @param row
1094
- */
1095
- async validateStock(row) {
1096
- const find = this.findUtilByProductId(row.product_id_);
1097
- await find.validateStock(row);
988
+ validateDataCompleted(row) {
989
+ const first = this.getRowFieldErrors(row)[0];
990
+ if (first) throw first;
1098
991
  }
1099
- /**
1100
- * 检验整个数组是否符合bom配置的要求
1101
- * @param arr
1102
- */
1103
- async validate(arr) {
1104
- const editRow = arr.find((i) => !i.is_confirmed_);
1105
- if (!editRow) {
1106
- throw new Error($t("sys.edhr.mcTable.noEditingRow"));
1107
- }
1108
- this.validateInBom(editRow);
1109
- await this.validateSequenceLoading(editRow, arr);
1110
- this.validateSubstitute(arr);
1111
- this.validateLotMixing(arr);
1112
- this.validateDataCompleted(editRow);
1113
- await this.validateNum(arr);
1114
- if (editRow) {
1115
- await this.validateStock(editRow);
1116
- }
992
+ /** 提交:收集全表行级错误,不中断。无物料且无组归属的占位行跳过 */
993
+ collectRowErrors(arr) {
994
+ const errors = [];
995
+ arr.forEach((row) => {
996
+ if (row.deleted_ || !row.product_id_ && !row.bom_entry_id_) return;
997
+ errors.push(...this.getRowFieldErrors(row));
998
+ });
999
+ return errors;
1117
1000
  }
1118
1001
  /**
1119
1002
  * 检查扫描数据是否可以插入,通过后返回填充计划(记录模式无 plan)
@@ -1128,21 +1011,6 @@ class BomEntriesValidator {
1128
1011
  plan.target.validateLotMixingWithRow(row, arr);
1129
1012
  return plan;
1130
1013
  }
1131
- /**
1132
- * 校验当前编辑行的数据
1133
- * @param arr
1134
- * @returns
1135
- */
1136
- async validateEditRow(arr) {
1137
- const editRow = arr.find((i) => !i.is_confirmed_);
1138
- if (!editRow || this.noBomMode) {
1139
- return;
1140
- }
1141
- this.validateInBom(editRow);
1142
- await this.validateSequenceLoading(editRow, arr);
1143
- this.validateSubstitute(arr);
1144
- this.validateLotMixing(arr);
1145
- }
1146
1014
  /**
1147
1015
  * 顺序上料提交:表中最后一组之前,必须上料组不能缺失(仅结构/顺序,不校验数量)
1148
1016
  */
@@ -1162,9 +1030,9 @@ class BomEntriesValidator {
1162
1030
  }
1163
1031
  }
1164
1032
  /**
1165
- * 提交整表校验:必须上料组须存在;顺序上料校验组序;表中存在的组走整组校验(不含库存)
1033
+ * 提交组级校验:必须上料 / 顺序 / 替代料 / 混批 / 组数量。遇错即抛,不含行级必填。
1166
1034
  */
1167
- async validateAllRows(arr) {
1035
+ async assertGroupRules(arr) {
1168
1036
  if (this.noBomMode) {
1169
1037
  return;
1170
1038
  }
@@ -1177,48 +1045,17 @@ class BomEntriesValidator {
1177
1045
  this.assertSubmitSequenceOrder(arr);
1178
1046
  }
1179
1047
  for (const util of this.bomEntryValidators) {
1180
- if (this.groupExistsInTable(arr, util)) {
1181
- await this.validateGroup(arr, util);
1182
- }
1183
- }
1184
- }
1185
- /**
1186
- * 把扫描数据按情况插入到数组的位置,返回新数组
1187
- * @param row
1188
- * @param arr
1189
- * @return {*}
1190
- */
1191
- mergeRowInArr(row, arr) {
1192
- this.validateInBom(row);
1193
- const newArr = cloneDeep(arr).filter((i) => i.product_id_);
1194
- const util = this.findUtilByProductId(row.product_id_);
1195
- const sameIndex = newArr.findLastIndex((i) => {
1196
- if (row.product_id_ !== i.product_id_) {
1197
- return false;
1198
- }
1199
- if (i.material_no_) {
1200
- return i.material_no_ === row.material_no_;
1201
- } else {
1202
- return true;
1203
- }
1204
- });
1205
- if (sameIndex >= 0) {
1206
- const oldQty = newArr[sameIndex].qty_ ?? 0;
1207
- const newQty = oldQty + (row.qty_ ?? 0);
1208
- merge(newArr[sameIndex], row, { qty_: newQty });
1209
- return newArr;
1210
- }
1211
- if (util) {
1212
- const sameGroupIndex = newArr.findLastIndex((i) => {
1213
- return util.productIds.includes(i.product_id_);
1214
- });
1215
- if (sameGroupIndex >= 0) {
1216
- newArr.splice(sameGroupIndex + 1, 0, row);
1217
- return newArr;
1218
- }
1048
+ if (!this.groupExistsInTable(arr, util)) continue;
1049
+ const rows = arr.filter(
1050
+ (r) => !r.deleted_ && r.product_id_ && (util.productIds.includes(r.product_id_) || r.bom_entry_id_ === util.bomEntry.id_)
1051
+ );
1052
+ if (!rows.length) continue;
1053
+ util.validateSubstitute(arr);
1054
+ util.validateLotMixing(arr);
1055
+ const orderIndex = this.resolveGroupOrderIndexByUtil(util, arr);
1056
+ const groupNo = orderIndex >= 0 ? orderIndex + 1 : void 0;
1057
+ await util.validateGroupQty(arr, this.enableSequenceLoading, groupNo);
1219
1058
  }
1220
- newArr.push(row);
1221
- return newArr;
1222
1059
  }
1223
1060
  /**
1224
1061
  * 获取BOM里面所有的主料,替换料的id集合
@@ -1647,10 +1484,12 @@ class MaterialConsumeTableController {
1647
1484
  formModelController;
1648
1485
  /** 当前 paper 上配置的单位转化规则(由组件 setup 注入) */
1649
1486
  unitConversionRules = [];
1650
- /** 主表 formState(由组件 setup 注入),用于读取主表字段值 */
1487
+ /** 主表 formState(由 factory bindRuntime 注入),用于读取主表字段值 */
1651
1488
  mainFormState = ref({});
1652
- /** 表单数据状态(由组件 setup 注入):未填报 / STASH / SUBMIT */
1489
+ /** 表单数据状态(由 factory bindRuntime 注入):未填报 / STASH / SUBMIT */
1653
1490
  dataStatus;
1491
+ /** factory 是否已绑定过运行时(避免重复 initTableData) */
1492
+ runtimeBound = false;
1654
1493
  /** 表单是否已暂存或提交(已处理过则不再跑初始化) */
1655
1494
  get isDataProcessed() {
1656
1495
  return ["STASH", "SUBMIT"].includes(this.dataStatus ?? "");
@@ -1992,16 +1831,15 @@ class MaterialConsumeTableController {
1992
1831
  });
1993
1832
  }
1994
1833
  /**
1995
- * 消耗表组件setup时调用
1996
- * @param opts
1834
+ * 表单加载时由 factory 调用:绑定稳定数据源并初始化行数据。
1835
+ * 不在分页组件 setup 中调用,避免跨页挂载重复 init。
1997
1836
  */
1998
- async setup(opts) {
1837
+ bindRuntime(opts) {
1999
1838
  this.tableDataRef = opts.tableDataRef;
2000
- this.widget = opts.widget;
2001
- this.formModelController = opts.formModelController;
2002
- this.unitConversionRules = opts.unitConversionRules ?? [];
2003
1839
  this.mainFormState = opts.mainFormState ?? ref({});
2004
1840
  this.dataStatus = opts.dataStatus;
1841
+ if (this.runtimeBound) return;
1842
+ this.runtimeBound = true;
2005
1843
  this.initTableData(opts.defaultRowData);
2006
1844
  if (this.actualTableData.length === 1) {
2007
1845
  const firstRow = this.actualTableData[0];
@@ -2009,14 +1847,14 @@ class MaterialConsumeTableController {
2009
1847
  MCDataUtil.setRowEditing(firstRow, true);
2010
1848
  }
2011
1849
  }
2012
- watch(
2013
- () => this.materialNoNum,
2014
- () => this.syncQtyRequiredFromBom(),
2015
- { immediate: true }
2016
- );
2017
- onUnmounted(() => {
2018
- MaterialConsumeTableController.render.destroyAllModals();
2019
- });
1850
+ }
1851
+ /**
1852
+ * 消耗表组件挂载时调用:只同步视图依赖,不初始化数据、不注册 watch。
1853
+ */
1854
+ bindView(opts) {
1855
+ this.widget = opts.widget;
1856
+ this.formModelController = opts.formModelController;
1857
+ this.unitConversionRules = opts.unitConversionRules ?? [];
2020
1858
  }
2021
1859
  /**
2022
1860
  * 按当前 materialNoNum 回写各行 qty_required_(校验侧 total 已通过 getter 实时读取)
@@ -2089,49 +1927,73 @@ class MaterialConsumeTableController {
2089
1927
  * 校验数据,并退出编辑
2090
1928
  * @param row
2091
1929
  */
2092
- async confirm(row) {
2093
- try {
2094
- if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD) {
2095
- if (!row.product_id_) {
2096
- throw new Error($t("sys.edhr.mcTable.materialEmptyError"));
2097
- }
2098
- this.validateExpiration(row);
2099
- } else {
2100
- await this.bomEntriesValidator.validate(this.actualTableData);
2101
- }
2102
- const isUnique = await judgeUnique({
2103
- modelKey: this.widget.props.modelKey,
2104
- data: this.actualTableData
2105
- });
2106
- if (!isUnique) {
2107
- throw new Error($t("当前数据与已有的数据存在重复的唯一字段,请修改后重试"));
2108
- }
2109
- await this.applyUnitConversionRules(row);
2110
- MCDataUtil.setRowEditing(row, false);
2111
- } catch (e) {
2112
- if (e.message) {
2113
- this.error(e.message);
2114
- }
2115
- }
2116
- }
1930
+ // async confirm(row: IMaterialConsumeData) {
1931
+ // try {
1932
+ // if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD) {
1933
+ // // 物料必填
1934
+ // if (!row.product_id_) {
1935
+ // throw new Error($t('sys.edhr.mcTable.materialEmptyError'));
1936
+ // }
1937
+ // // 保留:有效期校验
1938
+ // this.validateExpiration(row);
1939
+ // } else {
1940
+ // // BOM 模式:原有内置字段校验
1941
+ // await this.bomEntriesValidator.validate(this.actualTableData);
1942
+ // }
1943
+ // // 唯一校验
1944
+ // const isUnique = await judgeUnique({
1945
+ // modelKey: this.widget.props.modelKey!,
1946
+ // data: this.actualTableData,
1947
+ // });
1948
+ // if (!isUnique) {
1949
+ // throw new Error($t('当前数据与已有的数据存在重复的唯一字段,请修改后重试'));
1950
+ // }
1951
+ // // 单位转化规则:校验通过后、退出编辑前执行
1952
+ // await this.applyUnitConversionRules(row);
1953
+ // MCDataUtil.setRowEditing(row, false);
1954
+ // } catch (e) {
1955
+ // if (e.message) {
1956
+ // this.error(e.message);
1957
+ // }
1958
+ // }
1959
+ // }
2117
1960
  /**
2118
- * 生成校验清单格式的报错
2119
- * @param message
2120
- * @return {*}
1961
+ * 生成校验清单格式的报错(仅行级,挂对应单元格)
2121
1962
  */
2122
- calcErrorObj(message2) {
1963
+ calcErrorObj(err) {
1964
+ const targetFieldId = err.targetFieldId;
1965
+ const rowIndex = Math.max(this.actualTableData.indexOf(err.row), 0);
1966
+ const modelKey = this.widget.props.modelKey;
1967
+ const showFieldName = this.formModelController?.findField(modelKey, targetFieldId)?.name || targetFieldId;
2123
1968
  return {
2124
- field: this.widget.props.field + "_0_product_id_",
1969
+ field: `${this.widget.props.field}_${rowIndex}_${targetFieldId}`,
2125
1970
  message: JSON.stringify({
2126
- message: message2,
2127
- showFieldName: $t("sys.model.product"),
2128
- showModelKey: this.widget.props.modelKey,
1971
+ message: err.message,
1972
+ showFieldName,
1973
+ showModelKey: modelKey,
2129
1974
  showModelName: this.widget.props.tableTitle,
2130
1975
  subFieldKey: this.widget.props.field,
2131
- targetFieldId: "product_id_"
1976
+ targetFieldId
2132
1977
  })
2133
1978
  };
2134
1979
  }
1980
+ /**
1981
+ * 当前行 BOM 行级批注:待删除的 key + 重算后的错误
1982
+ * 改物料/批次会清批次数量有效期,四个字段一起替换;改数量/有效期只动自身
1983
+ */
1984
+ getRowCommentPatch(row, field) {
1985
+ const rowIndex = Math.max(this.actualTableData.indexOf(row), 0);
1986
+ const fieldKeys = field === "qty_" || field === "expiration_date_" ? [field] : ["product_id_", "material_no_", "qty_", "expiration_date_"];
1987
+ const keys = fieldKeys.map((f) => `${this.widget.props.field}_${rowIndex}_${f}`);
1988
+ const keySet = new Set(keys);
1989
+ const add = {};
1990
+ this.bomEntriesValidator.getRowFieldErrors(row).forEach((e) => {
1991
+ const obj = this.calcErrorObj(e);
1992
+ if (!keySet.has(obj.field)) return;
1993
+ (add[obj.field] ??= []).push(obj);
1994
+ });
1995
+ return { keys, add };
1996
+ }
2135
1997
  /**
2136
1998
  * 是否是单独一行空数据
2137
1999
  */
@@ -2145,23 +2007,33 @@ class MaterialConsumeTableController {
2145
2007
  return false;
2146
2008
  }
2147
2009
  /**
2148
- * 提交的时候的校验
2010
+ * 提交校验:先行级打标,全部通过后再组级 fail-fast toast
2149
2011
  */
2150
2012
  async submitValidate() {
2151
2013
  if (this.isOnlyEmptyRow()) {
2152
- return;
2014
+ return { isValid: true };
2015
+ }
2016
+ if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_) {
2017
+ return { isValid: true };
2018
+ }
2019
+ const rowErrors = this.bomEntriesValidator.collectRowErrors(this.actualTableData);
2020
+ if (rowErrors.length) {
2021
+ const fields = {};
2022
+ rowErrors.forEach((e) => {
2023
+ const obj = this.calcErrorObj(e);
2024
+ (fields[obj.field] ??= []).push(obj);
2025
+ });
2026
+ return { isValid: false, fields };
2153
2027
  }
2154
- let errorObj;
2155
2028
  try {
2156
- if (this.mcPattern !== MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_) {
2157
- await this.bomEntriesValidator.validateAllRows(this.actualTableData);
2158
- }
2029
+ await this.bomEntriesValidator.assertGroupRules(this.actualTableData);
2159
2030
  } catch (e) {
2160
2031
  if (e?.message) {
2161
- errorObj = this.calcErrorObj(e.message);
2032
+ this.error(e.message);
2162
2033
  }
2034
+ return { isValid: false };
2163
2035
  }
2164
- return errorObj;
2036
+ return { isValid: true };
2165
2037
  }
2166
2038
  /**
2167
2039
  * 是否有正在编辑的行
@@ -2294,6 +2166,221 @@ class MaterialConsumeTableController {
2294
2166
  }
2295
2167
  }
2296
2168
  }
2169
+ const FormTmplBomControllerKey = "GctFormTmplBomController";
2170
+ function useTmplBom() {
2171
+ function provideController(c) {
2172
+ provide(FormTmplBomControllerKey, c);
2173
+ return c;
2174
+ }
2175
+ function injectController() {
2176
+ const provided = inject(
2177
+ FormTmplBomControllerKey,
2178
+ void 0
2179
+ );
2180
+ const dataRelationShip = inject(
2181
+ NCB_PROVIDE.DATA_RELATION_SHIP,
2182
+ void 0
2183
+ );
2184
+ const tmplBomCMap = inject(NCB_PROVIDE.TMPL_BOM_CONTROLLER_MAP, void 0);
2185
+ return computed(() => {
2186
+ const fromProvide = unref(provided);
2187
+ if (fromProvide) {
2188
+ return fromProvide;
2189
+ }
2190
+ return tmplBomCMap?.value?.[dataRelationShip?.uniqueId ?? ""];
2191
+ });
2192
+ }
2193
+ function injectFormInstBom() {
2194
+ const controller = injectController();
2195
+ return computed(() => controller.value?.formInstBom);
2196
+ }
2197
+ return {
2198
+ provideController,
2199
+ injectController,
2200
+ injectFormInstBom
2201
+ };
2202
+ }
2203
+ function getGroupProductIds(entry) {
2204
+ const ids = [entry.product_id_];
2205
+ if (entry.substitute_material_enabled_ && entry.substitute_material_entries_) {
2206
+ entry.substitute_material_entries_.forEach((i) => {
2207
+ ids.push(i.product_id_);
2208
+ });
2209
+ }
2210
+ return ids;
2211
+ }
2212
+ function findEntryByProductId(entries, productId) {
2213
+ return entries.find((entry) => getGroupProductIds(entry).includes(productId));
2214
+ }
2215
+ const ERR_MATERIAL_NOT_MATCH = "当前物料不在 bom 中";
2216
+ function findObjectBom(formInstBom, belongingObject) {
2217
+ if (!belongingObject || !formInstBom) return void 0;
2218
+ const objectBomList = formInstBom.formTmplObjectBomList;
2219
+ return objectBomList?.find((item) => item.object_key_ === belongingObject);
2220
+ }
2221
+ function normalizeSubFields(subFields) {
2222
+ if (!subFields) return [];
2223
+ return (Array.isArray(subFields) ? subFields : Object.values(subFields)).filter(
2224
+ (f) => Boolean(f?.used && f?.key)
2225
+ );
2226
+ }
2227
+ function matchFieldBiz(f, bizType) {
2228
+ return (f.bizType || f.type) === bizType;
2229
+ }
2230
+ function pickObjectFieldKeys(subFields, belongingObject) {
2231
+ const list = normalizeSubFields(subFields).filter(
2232
+ (f) => !belongingObject || !f.belongingObject || f.belongingObject === belongingObject
2233
+ );
2234
+ const byBiz = (bizType) => list.find((f) => matchFieldBiz(f, bizType));
2235
+ const qtyField = byBiz(FIELD_TYPE.QTY);
2236
+ return {
2237
+ productKey: byBiz(FIELD_TYPE.PRODUCT)?.key,
2238
+ qtyKey: qtyField?.key,
2239
+ qtyRequiredKey: byBiz(FIELD_TYPE.QTY_REQUIRED)?.key,
2240
+ qtyFieldName: qtyField?.name
2241
+ };
2242
+ }
2243
+ function hasRequiredQtyValue(value) {
2244
+ return value !== null && value !== void 0 && value !== "";
2245
+ }
2246
+ function resolveObjectBomEntry(opts) {
2247
+ const { formInstBom, belongingObject, productId } = opts;
2248
+ const objectBom = findObjectBom(formInstBom, belongingObject);
2249
+ if (!objectBom) return void 0;
2250
+ if (objectBom.personal_bom_enabled_) {
2251
+ return objectBom.entries_?.[0];
2252
+ }
2253
+ if (!productId) return void 0;
2254
+ return findEntryByProductId(formInstBom.bomEntries ?? [], productId);
2255
+ }
2256
+ async function executeQtyBoundExpr(str, qtyRequired) {
2257
+ if (!str) return void 0;
2258
+ try {
2259
+ const json = JSON.parse(str);
2260
+ if (json.expr) {
2261
+ return await window.gct_expression.execute(json.expr, {
2262
+ qty_required_: qtyRequired
2263
+ });
2264
+ }
2265
+ } catch (error) {
2266
+ console.error("parse expression error", error);
2267
+ }
2268
+ return void 0;
2269
+ }
2270
+ async function assertObjectQtyValidationRule(opts) {
2271
+ const { loaded, required, entry, sequential } = opts;
2272
+ if (!entry.qty_validation_enabled_ || entry.type_ === "view") {
2273
+ return;
2274
+ }
2275
+ const diff = loaded - required;
2276
+ const rule = entry.qty_validation_rule_;
2277
+ const fail = (msg) => {
2278
+ throw new Error(msg);
2279
+ };
2280
+ switch (rule) {
2281
+ case "eq":
2282
+ if (sequential) {
2283
+ if (diff !== 0) fail($t("sys.qtyValidationRule.eq"));
2284
+ } else if (loaded > required) {
2285
+ fail($t("sys.qtyValidationRule.lte"));
2286
+ }
2287
+ break;
2288
+ case "gte":
2289
+ if (diff < 0) fail($t("sys.qtyValidationRule.gte"));
2290
+ break;
2291
+ case "lte":
2292
+ if (diff > 0) fail($t("sys.qtyValidationRule.lte"));
2293
+ break;
2294
+ case "bounds": {
2295
+ const max = await executeQtyBoundExpr(entry.max_value_, required);
2296
+ const min = await executeQtyBoundExpr(entry.min_value_, required);
2297
+ if (min !== void 0 && loaded < min || max !== void 0 && loaded > max) {
2298
+ fail($t("sys.qtyValidationRule.bounds", { min, max }));
2299
+ }
2300
+ break;
2301
+ }
2302
+ }
2303
+ }
2304
+ function validateObjectBomForScan(opts) {
2305
+ const { formInstBom, belongingObject, productId } = opts;
2306
+ if (!belongingObject || !productId || !formInstBom) {
2307
+ return;
2308
+ }
2309
+ const objectBom = findObjectBom(formInstBom, belongingObject);
2310
+ if (!objectBom) {
2311
+ return;
2312
+ }
2313
+ if (objectBom.personal_bom_enabled_) {
2314
+ return;
2315
+ }
2316
+ const bomEntries = formInstBom.bomEntries ?? [];
2317
+ if (!findEntryByProductId(bomEntries, productId)) {
2318
+ throw new Error(ERR_MATERIAL_NOT_MATCH);
2319
+ }
2320
+ }
2321
+ function getObjectBomMaterialLotQuery(opts) {
2322
+ const { formInstBom, belongingObject } = opts;
2323
+ const objectBom = findObjectBom(formInstBom, belongingObject);
2324
+ if (!objectBom || objectBom.personal_bom_enabled_) {
2325
+ return null;
2326
+ }
2327
+ const bomEntries = formInstBom.bomEntries ?? [];
2328
+ const versionIds = /* @__PURE__ */ new Set();
2329
+ bomEntries.forEach((entry) => {
2330
+ getGroupProductIds(entry).forEach((id) => {
2331
+ const versionId = id?.split(":").pop();
2332
+ if (versionId) versionIds.add(versionId);
2333
+ });
2334
+ });
2335
+ return {
2336
+ "product_id_.versionIn": versionIds.size ? Array.from(versionIds) : [EMPTY_PRODUCT_VERSION_ID]
2337
+ };
2338
+ }
2339
+ async function validateObjectBomQtyOnSubmit(opts) {
2340
+ const { formState, objectFieldList, formInstBom } = opts;
2341
+ if (!formInstBom || !objectFieldList?.length) {
2342
+ return null;
2343
+ }
2344
+ const sequential = !!formInstBom.sequenceEntries?.[0]?.enabled_;
2345
+ for (const obj of objectFieldList) {
2346
+ if (!obj?.objectField) continue;
2347
+ const { productKey, qtyKey, qtyRequiredKey, qtyFieldName } = pickObjectFieldKeys(
2348
+ obj.subFields,
2349
+ obj.objectField
2350
+ );
2351
+ if (!qtyKey || !qtyRequiredKey) continue;
2352
+ const requiredRaw = formState[qtyRequiredKey];
2353
+ if (!hasRequiredQtyValue(requiredRaw)) continue;
2354
+ const productId = productKey ? formState[productKey] : void 0;
2355
+ const entry = resolveObjectBomEntry({
2356
+ formInstBom,
2357
+ belongingObject: obj.objectField,
2358
+ productId
2359
+ });
2360
+ if (!entry?.qty_validation_enabled_) continue;
2361
+ if (entry.type_ === "view") continue;
2362
+ const loaded = Number(formState[qtyKey] ?? 0);
2363
+ const required = Number(requiredRaw);
2364
+ try {
2365
+ await assertObjectQtyValidationRule({
2366
+ loaded,
2367
+ required,
2368
+ entry,
2369
+ sequential
2370
+ });
2371
+ } catch (e) {
2372
+ return {
2373
+ field: qtyKey,
2374
+ message: JSON.stringify({
2375
+ message: e?.message || String(e),
2376
+ showFieldName: qtyFieldName || qtyKey,
2377
+ targetFieldId: qtyKey
2378
+ })
2379
+ };
2380
+ }
2381
+ }
2382
+ return null;
2383
+ }
2297
2384
  function useMaterialBalance() {
2298
2385
  async function getConsumeData({ cloneRuntimeJson, operationId, materialNo }) {
2299
2386
  const balanceTables = cloneRuntimeJson?.paper?.props?.materialBalanceTableList;
@@ -2551,6 +2638,86 @@ class TdHandler {
2551
2638
  this.mergeTd({ cellWidget: { props: { newSpecificConfig: { customLoader } } } });
2552
2639
  }
2553
2640
  }
2641
+ const SCAN_ROW_META_KEYS = /* @__PURE__ */ new Set([FRONT_ROW_KEY, "id_", "id", "group_", "deleted_", "delete_"]);
2642
+ function hasRowId(row) {
2643
+ const id = row.id_ ?? row.id;
2644
+ return id !== void 0 && id !== null && String(id).trim() !== "";
2645
+ }
2646
+ function isEmptyScanValue(value) {
2647
+ if (value == null || value === "") return true;
2648
+ if (typeof value === "object" && !Array.isArray(value) && Object.keys(value).length === 0) {
2649
+ return true;
2650
+ }
2651
+ return false;
2652
+ }
2653
+ function hasSubtableBusinessData(row, ignoreValues = {}) {
2654
+ if (!row || typeof row !== "object") return false;
2655
+ if (hasRowId(row)) return true;
2656
+ return Object.keys(row).some((key) => {
2657
+ if (SCAN_ROW_META_KEYS.has(key) || key.startsWith("_")) return false;
2658
+ const value = row[key];
2659
+ if (isEmptyScanValue(value)) return false;
2660
+ if (key in ignoreValues && value === ignoreValues[key]) return false;
2661
+ return true;
2662
+ });
2663
+ }
2664
+ function appendOrFillScanRow(visibleRows, row, ignoreValues = {}) {
2665
+ const emptyIndex = visibleRows.findIndex(
2666
+ (item) => item && !item.deleted_ && !hasSubtableBusinessData(item, ignoreValues)
2667
+ );
2668
+ if (emptyIndex >= 0) {
2669
+ const existing = visibleRows[emptyIndex];
2670
+ const next = { ...existing };
2671
+ for (const [key, value] of Object.entries(row)) {
2672
+ if (SCAN_ROW_META_KEYS.has(key)) continue;
2673
+ next[key] = value;
2674
+ }
2675
+ return visibleRows.map((item, index) => index === emptyIndex ? next : item);
2676
+ }
2677
+ ensureFrontRowKey(row);
2678
+ return [...visibleRows, row];
2679
+ }
2680
+ function resolveScanParsedValue(input) {
2681
+ if (input.parsedValue && typeof input.parsedValue === "object") {
2682
+ return input.parsedValue;
2683
+ }
2684
+ return void 0;
2685
+ }
2686
+ function resolveScanFillData(input) {
2687
+ if (input.transformedData && typeof input.transformedData === "object") {
2688
+ return input.transformedData;
2689
+ }
2690
+ return {};
2691
+ }
2692
+ function resolveScanAdjustType(input) {
2693
+ return input.type === "minus" ? "minus" : "add";
2694
+ }
2695
+ function resolveScanQty(parsedQty, recordQty, fallback = 1) {
2696
+ const fromParsed = Number(parsedQty);
2697
+ if (Number.isFinite(fromParsed) && fromParsed > 0) return fromParsed;
2698
+ const fromRecord = Number(recordQty);
2699
+ if (Number.isFinite(fromRecord) && fromRecord > 0) return fromRecord;
2700
+ return fallback;
2701
+ }
2702
+ function toDateOnly(value) {
2703
+ if (value == null || value === "") return void 0;
2704
+ if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}/.test(value)) {
2705
+ return value.slice(0, 10);
2706
+ }
2707
+ const date = new Date(value);
2708
+ if (Number.isNaN(date.getTime())) return void 0;
2709
+ const y = date.getFullYear();
2710
+ const m = String(date.getMonth() + 1).padStart(2, "0");
2711
+ const d = String(date.getDate()).padStart(2, "0");
2712
+ return `${y}-${m}-${d}`;
2713
+ }
2714
+ function mapScanRecordsForPicker(records) {
2715
+ return records.map((record) => ({
2716
+ ...record,
2717
+ productId: record.product_id_name_ ?? record.product_id_code_,
2718
+ materialNo: record.material_no_ ?? record.name_
2719
+ }));
2720
+ }
2554
2721
  class SubTableCore {
2555
2722
  constructor(params, factory) {
2556
2723
  this.factory = factory;
@@ -2818,19 +2985,48 @@ class SubTableCore {
2818
2985
  if (this.isScanOpen) {
2819
2986
  return;
2820
2987
  }
2821
- if (!this.scanRuleInfo) {
2822
- this.error({ content: $t("sys.edhr.mcTable.scanRuleNotFound") });
2823
- return;
2824
- }
2825
2988
  this.isScanOpen = true;
2989
+ const { disableBarcodeParsing, scanParamType } = this.bizTableConfig || {};
2826
2990
  await this.render.openScanModal({
2827
2991
  title: this.ctx.widget.props.tableTitle,
2828
2992
  subModelKey: this.subModelKey,
2829
2993
  formModelController: this.formModelController,
2994
+ scanRules: disableBarcodeParsing ? void 0 : this.scanRuleProps,
2995
+ scanParam: disableBarcodeParsing ? scanParamType : void 0,
2830
2996
  onScan: this.onScan
2831
2997
  });
2832
2998
  this.isScanOpen = false;
2833
2999
  }
3000
+ /** 解析子表默认值(函数默认值先求值),扫码填空行时忽略这些字段 */
3001
+ resolveScanIgnoreValues() {
3002
+ const defaultMap = this.calcDefaultMap() || {};
3003
+ const ignoreValues = {};
3004
+ for (const [key, value] of Object.entries(defaultMap)) {
3005
+ ignoreValues[key] = typeof value === "function" ? value() : value;
3006
+ }
3007
+ return ignoreValues;
3008
+ }
3009
+ /**
3010
+ * 扫码入行:优先回填首个空壳占位行,否则追加到表尾。
3011
+ * 对齐 Word appendOrFillScanRow,避免仅一行空壳时扫码落到第二行。
3012
+ */
3013
+ appendOrFillScanRow(row) {
3014
+ this.tableData = appendOrFillScanRow(
3015
+ this.showTableData,
3016
+ row,
3017
+ this.resolveScanIgnoreValues()
3018
+ );
3019
+ }
3020
+ /**
3021
+ * 扫码多条候选时选择一行(1 条自动选中)
3022
+ */
3023
+ async pickScanRecord(records) {
3024
+ if (!records.length) return void 0;
3025
+ if (records.length === 1) return records[0];
3026
+ return this.render.openMultiRowsModal({
3027
+ rows: mapScanRecordsForPicker(records)
3028
+ });
3029
+ }
2834
3030
  /**
2835
3031
  * 处理扫码弹窗回调
2836
3032
  * 参数由扫码弹窗决定
@@ -3110,7 +3306,7 @@ class FormTmplConfigController {
3110
3306
  * 初始化权限
3111
3307
  */
3112
3308
  async initPermissions() {
3113
- this.state.IOTPermission = await api.platform.license.getModuleAuth({ module: "IOT" }) || false;
3309
+ this.state.IOTPermission = await api.platform.license.getModuleAuth({ moduleType: "IOT" }) || false;
3114
3310
  this.state.OCRPermission = await api.apaas.onlineFormTmpl.getIsOcrGranted() || false;
3115
3311
  }
3116
3312
  /**
@@ -3123,7 +3319,7 @@ class FormTmplConfigController {
3123
3319
  pageNo: 1,
3124
3320
  pageSize: 100
3125
3321
  });
3126
- this.state.OCRModelPrecisionOptions = (result?.records || []).filter((item) => item.text && item.value).map((item) => ({ label: item.text, value: item.value }));
3322
+ this.state.OCRModelPrecisionOptions = (result?.data || []).filter((item) => item.text && item.value).map((item) => ({ label: item.text, value: item.value }));
3127
3323
  } catch {
3128
3324
  this.state.OCRModelPrecisionOptions = [];
3129
3325
  }
@@ -3988,10 +4184,6 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3988
4184
  const tableController = props.tableController;
3989
4185
  const paperWidget = inject(NCB_PROVIDE.PAGER, null);
3990
4186
  const unitConversionRules = paperWidget?.props?.unitConversionRules ?? [];
3991
- const {
3992
- currentPageFormState
3993
- } = useCurrentPageFormState();
3994
- const selfInfoList = inject(NCB_PROVIDE.FORM_INST_LIST, []);
3995
4187
  provide(NCB_PROVIDE.MATERIAL_CONSUME_TABLE_CONTROLLER, tableController);
3996
4188
  const {
3997
4189
  field = "",
@@ -4012,21 +4204,13 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4012
4204
  updateCalcCallback?.(dataRelationShip?.uniqueId);
4013
4205
  }
4014
4206
  });
4015
- const currentSelfInfo = selfInfoList?.find((item) => item?.id === dataRelationShip?.key || item?.uniqueId === dataRelationShip?.uniqueId) ?? selfInfoList?.[0];
4016
4207
  const currentFieldDefaultData = computed(() => {
4017
4208
  return defaultDataMap?.[dataRelationShip?.uniqueId ?? ""] ?? {};
4018
4209
  });
4019
- tableController.setup({
4020
- tableDataRef: modelValue,
4210
+ tableController.bindView({
4021
4211
  widget: props.widget,
4022
4212
  formModelController,
4023
- unitConversionRules,
4024
- mainFormState: currentPageFormState,
4025
- dataStatus: currentSelfInfo?.dataStatus,
4026
- defaultRowData: renderUtils.getDefaultValueInfo({
4027
- defaultDataMap: currentFieldDefaultData.value,
4028
- key: field
4029
- })
4213
+ unitConversionRules
4030
4214
  });
4031
4215
  const dataInfo = computed(() => {
4032
4216
  const visibleToRealIndexMap = {};
@@ -4065,6 +4249,11 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4065
4249
  row.tempDeleted = true;
4066
4250
  }
4067
4251
  };
4252
+ const clearMcValidatorComments = () => {
4253
+ if (!dataRelationShip) return;
4254
+ dataRelationShip.mcValidatorMessageMap = {};
4255
+ dataRelationShip.mcValidatorLocationList = [];
4256
+ };
4068
4257
  const deleteRowAt = (row, index) => {
4069
4258
  recordSubtableRowDelete(dataRelationShip, field, row);
4070
4259
  deleteSubtableRow(field, index);
@@ -4084,6 +4273,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4084
4273
  deleteRowAt(rowData, realIndex);
4085
4274
  }
4086
4275
  modelValue.value = relocateDeletedRowsToEnd(modelValue.value.filter((d) => !d.tempDeleted));
4276
+ clearMcValidatorComments();
4087
4277
  };
4088
4278
  const createDefaultRows = (rowNum, quickFillDatas, patch) => {
4089
4279
  return Array.from({
@@ -4108,6 +4298,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4108
4298
  modelValue.value = relocateDeletedRowsToEnd(modelValue.value);
4109
4299
  recordSubtableRowAdd(dataRelationShip, field, rows);
4110
4300
  updateCalcCallback?.(dataRelationShip?.uniqueId);
4301
+ clearMcValidatorComments();
4111
4302
  };
4112
4303
  const resolveRealIndex = (index) => dataInfo.value.visibleToRealIndexMap[props.start + index];
4113
4304
  const handleAddRowForGroup = ({
@@ -4459,10 +4650,10 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4459
4650
  return dynamicIds.map((rowId, rowIdx) => {
4460
4651
  const isLastDynRow = rowIdx === lastDynRowIdx;
4461
4652
  const showDelBtn = dataInfo.value.hasSubData && isLastDynRow;
4462
- const showScanBtn = isLastDynRow;
4653
+ const showScanBtn = !isFormChange.value && isLastDynRow;
4463
4654
  const showActionMenu = isLastDynRow;
4464
4655
  const showEditBtn = !isFormChange.value && data.is_confirmed_;
4465
- const showInsert1RowBtn = !isFormChange.value && !data.is_confirmed_;
4656
+ const showInsert1RowBtn = isFormChange.value || !isFormChange.value && !data.is_confirmed_;
4466
4657
  const row = props.widgetCenter[rowId];
4467
4658
  const dynHeight = props.subInfo.dynamicRowHeights?.[rowId]?.[dataIdx];
4468
4659
  return renderTr2Td(`${stableRowKey}_${rowIdx}`, row, data, {
@@ -4950,6 +5141,7 @@ const DocumentPaper = /* @__PURE__ */ defineComponent({
4950
5141
  provide(NCB_PROVIDE.FORM_INST_LIST, props.selfInfoList);
4951
5142
  const tmplBomCMap = inject(NCB_PROVIDE.TMPL_BOM_CONTROLLER_MAP);
4952
5143
  const tmplBomController = computed(() => tmplBomCMap.value?.[props.basicInfo?.uniqueId]);
5144
+ useTmplBom().provideController(tmplBomController);
4953
5145
  const subTableCoreFactoryMap = inject(NCB_PROVIDE.SUB_TABLE_CORE_FACTORY_MAP);
4954
5146
  const subTableCoreFactory = computed(() => subTableCoreFactoryMap.value?.[props.basicInfo?.uniqueId]);
4955
5147
  const filledFixedTableKeys = ref([]);
@@ -4971,19 +5163,24 @@ const DocumentPaper = /* @__PURE__ */ defineComponent({
4971
5163
  quickFill
4972
5164
  } = table;
4973
5165
  const {
4974
- r: colNo,
4975
- t: rowNo
5166
+ r: rightNo,
5167
+ t: topNo
4976
5168
  } = range;
4977
- const trId = widgetCenter[ComponentTypeEnum.PAPER].nextIds[rowNo - 1];
4978
- const tdId = widgetCenter[trId].nextIds[colNo - 1];
4979
- const newOptions = widgetCenter[tdId]?.cellWidget?.props?.newSpecificConfig?.newOptions || [];
4980
- const columns = Object.values(widgetCenter[ComponentTypeEnum.PAPER].props.fixedTableFieldMap || {}).map((o) => o.fieldMeta).filter((m) => m?.subFieldKey === subFieldKey).map((m) => ({
4981
- prop: m.field,
4982
- fieldType: m.fieldType,
4983
- newOptions
4984
- }));
5169
+ const firstTrId = widgetCenter[ComponentTypeEnum.PAPER].nextIds[topNo - 1];
5170
+ const lastTdId_inFirstTr = widgetCenter[firstTrId].nextIds[rightNo - 1];
5171
+ const columns = Object.values(widgetCenter[ComponentTypeEnum.PAPER].props.fixedTableFieldMap || {}).filter((o) => o.fieldMeta?.subFieldKey === subFieldKey).map((o) => {
5172
+ const {
5173
+ fieldMeta,
5174
+ fieldWidget
5175
+ } = o;
5176
+ return {
5177
+ prop: fieldMeta.field,
5178
+ fieldType: fieldMeta.fieldType,
5179
+ newOptions: fieldWidget.options
5180
+ };
5181
+ });
4985
5182
  const columnKeys = columns.map((c) => c.prop);
4986
- map[tdId] = {
5183
+ map[lastTdId_inFirstTr] = {
4987
5184
  subFieldKey,
4988
5185
  subModelKey,
4989
5186
  range,
@@ -5404,7 +5601,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5404
5601
  });
5405
5602
  const DynamicTableAction = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-53d7e66c"]]);
5406
5603
  export {
5604
+ FormTmplConfigController as A,
5407
5605
  BorderTD as B,
5606
+ MCDataUtil as C,
5408
5607
  DeviceLinkTmplUtil as D,
5409
5608
  FixedQuickFillModal as F,
5410
5609
  InstanceStatusValues as I,
@@ -5413,23 +5612,30 @@ export {
5413
5612
  RequiredQtyCalcRule as R,
5414
5613
  ScanParamType as S,
5415
5614
  _sfc_main$5 as _,
5416
- useStyles as a,
5417
- useValidator as b,
5418
- DocumentPaper as c,
5419
- DynamicTableAction as d,
5420
- MaterialConsumeTableController as e,
5421
- SubTableCore as f,
5422
- SubTableActionMenuTypeEnum as g,
5423
- getMenuByAction as h,
5424
- SubTableActionEnum as i,
5425
- getCopySubMenu as j,
5426
- getInsertSubMenu as k,
5427
- useMaterialBalance as l,
5428
- DeviceConnector as m,
5429
- DocumentLoading as n,
5430
- DynamicQuickFillModal as o,
5431
- FormTmplConfigController as p,
5432
- MCDataUtil as q,
5615
+ useTmplBom as a,
5616
+ useStyles as b,
5617
+ useValidator as c,
5618
+ DocumentPaper as d,
5619
+ DynamicTableAction as e,
5620
+ MaterialConsumeTableController as f,
5621
+ getObjectBomMaterialLotQuery as g,
5622
+ SubTableCore as h,
5623
+ SubTableActionMenuTypeEnum as i,
5624
+ getMenuByAction as j,
5625
+ SubTableActionEnum as k,
5626
+ getInsertSubMenu as l,
5627
+ resolveScanQty as m,
5628
+ getCopySubMenu as n,
5629
+ resolveScanParsedValue as o,
5630
+ resolveScanFillData as p,
5631
+ useMaterialBalance as q,
5632
+ resolveScanAdjustType as r,
5633
+ validate as s,
5634
+ toDateOnly as t,
5433
5635
  useFormTmplConfig as u,
5434
- validate as v
5636
+ validateObjectBomForScan as v,
5637
+ validateObjectBomQtyOnSubmit as w,
5638
+ DeviceConnector as x,
5639
+ DocumentLoading as y,
5640
+ DynamicQuickFillModal as z
5435
5641
  };