@gct-paas/excel 0.1.26 → 0.1.28-beta.0

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 (302) hide show
  1. package/dist/{VueVideoPlayer-0DuOfiQX.js → VueVideoPlayer-DoCV5anE.js} +2 -2
  2. package/dist/{agg-design-Bs7uvazc.js → agg-design-FWqhGZMN.js} +1 -1
  3. package/dist/{agg-props-Bp3BzB8p.js → agg-props-Demj2zwb.js} +1 -1
  4. package/dist/{agg-style-5rib-2BW.js → agg-style-0D2plP6P.js} +1 -1
  5. package/dist/{align-editor-DQ8dFN7Z.js → align-editor-BT_0oTzG.js} +1 -1
  6. package/dist/{attach-fields-editor-C96vYS5i.js → attach-fields-editor-Bh-SLSaJ.js} +5 -5
  7. package/dist/{barcode-design-GARKK2E6.js → barcode-design-B6DeTtec.js} +2 -2
  8. package/dist/base/index.es.js +437 -586
  9. package/dist/{base-font-editor-D1Yhc2dM.js → base-font-editor-rUy04_I5.js} +2 -2
  10. package/dist/{boolean-design-E8aTzvqE.js → boolean-design-s-0j811G.js} +2 -2
  11. package/dist/{boolean-props-DXxrp-m9.js → boolean-props-BKDCL1yv.js} +3 -3
  12. package/dist/{boolean-style-CL0DlbC0.js → boolean-style-z1WMMTXQ.js} +4 -4
  13. package/dist/{cell-upload-Mt9EhaFR.js → cell-upload-DIfLFlqF.js} +1 -1
  14. package/dist/{date-range-editor-CWD3tYMA.js → date-range-editor-Bl5qPmvu.js} +2 -2
  15. package/dist/{date-time-design-DxEvgEi8.js → date-time-design-BTNkgPAM.js} +1 -1
  16. package/dist/{date-time-props-B5Xtc7-X.js → date-time-props-DiVxg9n4.js} +3 -3
  17. package/dist/{date-time-style-CH-mslF5.js → date-time-style-yt5pO1dc.js} +1 -1
  18. package/dist/{decimal-design-DvIA4NX0.js → decimal-design-BW5UQRTH.js} +1 -1
  19. package/dist/{decimal-display-mode-DZwDd5fU.js → decimal-display-mode-BWR1rZ3-.js} +2 -2
  20. package/dist/{decimal-props-BKRzrJ-r.js → decimal-props-S3vHwaWf.js} +4 -4
  21. package/dist/{decimal-style-DMFs7IFs.js → decimal-style-6q9_KbIT.js} +1 -1
  22. package/dist/{default-value-editor.vue_vue_type_script_setup_true_name_default-value-editor_lang-BLCWBDOv.js → default-value-editor.vue_vue_type_script_setup_true_name_default-value-editor_lang-B51R6Kdt.js} +2 -2
  23. package/dist/{diagonal-design-COpzJE_o.js → diagonal-design-BKuv-KYn.js} +2 -2
  24. package/dist/{double-design-BTJtq1hk.js → double-design-CrnloQ6U.js} +1 -1
  25. package/dist/{double-props-Bq3vZziK.js → double-props-CIqRhF3C.js} +4 -4
  26. package/dist/{double-style-DiufxslF.js → double-style-BRXKv9Tt.js} +1 -1
  27. package/dist/{dynamic-table-action-Dqp3OJDg.js → dynamic-table-action-B3_wsebH.js} +1359 -1077
  28. package/dist/{dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-CvVlP70-.js → dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-_s66osEc.js} +3396 -621
  29. package/dist/{edit.utils-CXmmCnxE-W27Whv1y.js → edit.utils-CXmmCnxE-C1IiqVhe.js} +1 -1
  30. package/dist/{enum-design-BcF4g87b.js → enum-design-4iAQqQWj.js} +2 -2
  31. package/dist/{enum-props-C7JjTMv4.js → enum-props-BTNED9Yi.js} +3 -3
  32. package/dist/{enum-style-CyAkQvzE.js → enum-style-BKunBcCU.js} +3 -3
  33. package/dist/excel.css +1120 -797
  34. package/dist/{exceljs.min-D-ILZl-Z.js → exceljs.min-DqUfJ7Zu.js} +2 -2
  35. package/dist/{expression-design-CjzPxio0.js → expression-design-Avbzm2SR.js} +1 -1
  36. package/dist/{expression-props-mAVBd5Lq.js → expression-props-BJ2AaS83.js} +1 -1
  37. package/dist/{expression-style-CrRd3CZN.js → expression-style-Cf0ZciKB.js} +1 -1
  38. package/dist/{file-design-BvSmEEHz.js → file-design-DXTNk70M.js} +1 -1
  39. package/dist/{file-props-CmbLCylK.js → file-props-GieYTgUG.js} +2 -2
  40. package/dist/{file-style-ouUREdJB.js → file-style-CLDdPXPd.js} +1 -1
  41. package/dist/{font-editor-5O8-WS9U.js → font-editor-DFkc4KNc.js} +3 -3
  42. package/dist/{image-design-DOdX4Ejf.js → image-design-DWY2Pn2m.js} +2 -2
  43. package/dist/{image-design-D5Avl99X.js → image-design-J45gqUS9.js} +1 -1
  44. package/dist/{image-props-DS7B2haQ.js → image-props-DZmoqEbT.js} +1 -1
  45. package/dist/{image-style-BdC16P3Z.js → image-style-C41-zdmF.js} +1 -1
  46. package/dist/{index-CqvvTfDm.js → index-5k7C2AD1.js} +1 -1
  47. package/dist/{index-CZB6MFo2.js → index-B-UBLtsV.js} +1 -1
  48. package/dist/{index-tVnYGnyM.js → index-B3D6zOat.js} +1 -1
  49. package/dist/{index-DZWPjTfD.js → index-B9nlN0jW.js} +1 -1
  50. package/dist/{index--x-rjhUN.js → index-BHIdTmFi.js} +3697 -3053
  51. package/dist/{index-Bg7RbNAd.js → index-BNn5fobS.js} +1 -1
  52. package/dist/{index-DjO3xXoL.js → index-BlnMSgZL.js} +2 -2
  53. package/dist/{index-7Z0q-sUY.js → index-BsOmgpN3.js} +1 -1
  54. package/dist/{index-u0UnKD61.js → index-Bs_2N-BE.js} +1 -1
  55. package/dist/{index-Ul5I5n2Y.js → index-BtUdO868.js} +1 -1
  56. package/dist/{index-DeHhItHR.js → index-C0K1pWGN.js} +1 -1
  57. package/dist/{index-COPdP22U.js → index-C4hw1NhV.js} +1 -1
  58. package/dist/{index-Bs5CmUJ6.js → index-C6-vGm0H.js} +1 -1
  59. package/dist/{index-BA1e8Zw5.js → index-CR7wxW9-.js} +1 -1
  60. package/dist/{index-Bgz9h2Ur.js → index-CYKuotDL.js} +217 -98
  61. package/dist/{index-BGwmxIrV.js → index-Cir8zmM7.js} +1 -1
  62. package/dist/{index-nDINH7fF.js → index-D-uEhZUx.js} +5 -3
  63. package/dist/{index-DWlCnH_H.js → index-DIknXBmB.js} +2 -2
  64. package/dist/{index-DPFhljcW.js → index-DRfeEqsi.js} +12 -1
  65. package/dist/{index-CF4GPHX_.js → index-DXZ9-91Q.js} +1 -1
  66. package/dist/{index-DAVr0Puy.js → index-Dlcg-_u1.js} +1 -1
  67. package/dist/{index-B6YwjnNP.js → index-DpPM2hsI.js} +1 -1
  68. package/dist/{index-POh3kOtN.js → index-DsVq6bop.js} +1 -1
  69. package/dist/{index-CUDme4M_.js → index-DxfrB4yU.js} +2 -2
  70. package/dist/{index-OD0V6QZx.js → index-DyTI4fVG.js} +4 -2
  71. package/dist/{index-upoyI1QX.js → index-FJf8yRGg.js} +1 -1
  72. package/dist/{index-CO9M5kpu.js → index-Iri9iQ7A.js} +1 -1
  73. package/dist/{index-B4uW2dJ0.js → index-Izpo3y-u.js} +1 -1
  74. package/dist/{index-CMM4w3Dw.js → index-Kc67z3Sn.js} +1 -1
  75. package/dist/{index-mEVrSKb2.js → index-O2psifaU.js} +5 -3
  76. package/dist/{index-B9bcnmUU.js → index-ZKvvKhlF.js} +1 -1
  77. package/dist/{index-BqzGUi2w.js → index-s5kgaRm2.js} +1 -1
  78. package/dist/{index-BP7lVop7.js → index-vDKWJHdv.js} +1 -1
  79. package/dist/index.es.js +3 -3
  80. package/dist/{integer-design-XoAOklHI.js → integer-design-oIq4PZgB.js} +1 -1
  81. package/dist/{integer-props-UG7rgL98.js → integer-props-Dv0CFbj2.js} +4 -4
  82. package/dist/{integer-style-BwF6P-1M.js → integer-style-CQsFEa78.js} +1 -1
  83. package/dist/mb-render-13-1F66x.js +263 -0
  84. package/dist/{number-input-ex-BUhgQIz_.js → number-input-ex-b3jwWBec.js} +1 -1
  85. package/dist/{org-props-BYIR1Qja.js → org-props-CP6UEZUk.js} +2 -2
  86. package/dist/{org-style-DXX3gSuh.js → org-style-CVX9tnGL.js} +1 -1
  87. package/dist/{pagination-design-BVFW-spw.js → pagination-design-CzI3BVnu.js} +2 -2
  88. package/dist/paper-widget-design-DMIGXtG2.js +4 -0
  89. package/dist/{qrcode-design-CoFoYXe2.js → qrcode-design-eO4Bd2-V.js} +1 -1
  90. package/dist/{ref-autofill-editor-8-T3_HNa.js → ref-autofill-editor-DXDYy7g2.js} +7 -6
  91. package/dist/{ref-props-CkbU8Sr5.js → ref-props-Aiwbx2BA.js} +3 -3
  92. package/dist/{ref-style-BUqCIl-S.js → ref-style-BYC5yPHt.js} +1 -1
  93. package/dist/{regex-editor-BAfv4Tt4.js → regex-editor-DWglxD2y.js} +2 -2
  94. package/dist/{revo-grid.entry-RWcWTs8I.js → revo-grid.entry-DxhjfysT.js} +1 -1
  95. package/dist/{revogr-attribution_7.entry-BCSuWj1U.js → revogr-attribution_7.entry-ChJzXX9c.js} +3 -3
  96. package/dist/{revogr-clipboard_3.entry-BTpzs_Rr.js → revogr-clipboard_3.entry-CTfO-vHs.js} +2 -2
  97. package/dist/{revogr-data_4.entry-DYkSdHom.js → revogr-data_4.entry-DpsZq5Vu.js} +2 -2
  98. package/dist/{revogr-filter-panel.entry-DOqtLQay.js → revogr-filter-panel.entry-CkNGH07B.js} +1 -1
  99. package/dist/{select-render-type-editor.vue_vue_type_script_setup_true_lang-D26X3WBX.js → select-render-type-editor.vue_vue_type_script_setup_true_lang-D36XgznF.js} +2 -2
  100. package/dist/{serialnumber-design-Bx6oAxgA.js → serialnumber-design-cvNqTdU4.js} +1 -1
  101. package/dist/shared/index.es.js +29 -29
  102. package/dist/{signature-design-BYwB_lgz.js → signature-design-CxYVBP9N.js} +1 -1
  103. package/dist/{signature-props-SNM8PS89.js → signature-props-Cs3PONrq.js} +3 -3
  104. package/dist/{signature-style-BqZ2DAS6.js → signature-style-CAa92-pw.js} +1 -1
  105. package/dist/{single-field-drop-BwCKh5bM.js → single-field-drop-BXX5wlj_.js} +2 -2
  106. package/dist/{size-editor-DUazmEj_.js → size-editor-B4aRo4sR.js} +1 -1
  107. package/dist/src/assets/svgs/table/index.d.ts +38 -0
  108. package/dist/src/domain/index.d.ts +1 -0
  109. package/dist/src/domain/suite/suite-features.d.ts +14 -0
  110. package/dist/src/domain/table/business/check/check-table/index.d.ts +1 -0
  111. package/dist/src/domain/table/business/check/check-table/profile/index.d.ts +3 -0
  112. package/dist/src/domain/table/business/material/material-balance/index.d.ts +1 -0
  113. package/dist/src/domain/table/business/material/material-balance/profile/index.d.ts +3 -0
  114. package/dist/src/domain/table/business/material/material-consume/index.d.ts +1 -0
  115. package/dist/src/domain/table/business/material/material-consume/profile/index.d.ts +3 -0
  116. package/dist/src/domain/table/business/preprocess/pretreatment-list/index.d.ts +2 -0
  117. package/dist/src/domain/table/business/preprocess/pretreatment-list/profile/field-keys.d.ts +187 -0
  118. package/dist/src/domain/table/business/preprocess/pretreatment-list/profile/fields.d.ts +2 -0
  119. package/dist/src/domain/table/business/preprocess/pretreatment-list/profile/index.d.ts +3 -0
  120. package/dist/src/domain/table/business/preprocess/pretreatment-list/runtime/register-handlers.d.ts +1 -0
  121. package/dist/src/domain/table/business/preprocess/pretreatment-list/runtime/row-change-handlers.d.ts +26 -0
  122. package/dist/src/domain/table/business/sterilize/entrust-steril-batch-list/index.d.ts +1 -0
  123. package/dist/src/domain/table/business/sterilize/entrust-steril-batch-list/profile/index.d.ts +3 -0
  124. package/dist/src/domain/table/business/warehouse/device-part-consume/index.d.ts +2 -0
  125. package/dist/src/domain/table/business/warehouse/device-part-consume/profile/field-keys.d.ts +65 -0
  126. package/dist/src/domain/table/business/warehouse/device-part-consume/profile/fields.d.ts +2 -0
  127. package/dist/src/domain/table/business/warehouse/device-part-consume/profile/index.d.ts +3 -0
  128. package/dist/src/domain/table/business/warehouse/device-part-consume/runtime/register-handlers.d.ts +1 -0
  129. package/dist/src/domain/table/business/warehouse/device-part-consume/runtime/row-change-handlers.d.ts +6 -0
  130. package/dist/src/domain/table/business/warehouse/part-stocktake/index.d.ts +2 -0
  131. package/dist/src/domain/table/business/warehouse/part-stocktake/profile/field-keys.d.ts +70 -0
  132. package/dist/src/domain/table/business/warehouse/part-stocktake/profile/fields.d.ts +2 -0
  133. package/dist/src/domain/table/business/warehouse/part-stocktake/profile/index.d.ts +3 -0
  134. package/dist/src/domain/table/business/warehouse/part-stocktake/runtime/register-handlers.d.ts +1 -0
  135. package/dist/src/domain/table/business/warehouse/part-stocktake/runtime/row-change-handlers.d.ts +10 -0
  136. package/dist/src/domain/table/business/warehouse/warehouse-allocate/index.d.ts +2 -0
  137. package/dist/src/domain/table/business/warehouse/warehouse-allocate/profile/field-keys.d.ts +87 -0
  138. package/dist/src/domain/table/business/warehouse/warehouse-allocate/profile/fields.d.ts +2 -0
  139. package/dist/src/domain/table/business/warehouse/warehouse-allocate/profile/index.d.ts +3 -0
  140. package/dist/src/domain/table/business/warehouse/warehouse-allocate/runtime/register-handlers.d.ts +1 -0
  141. package/dist/src/domain/table/business/warehouse/warehouse-allocate/runtime/row-change-handlers.d.ts +7 -0
  142. package/dist/src/domain/table/business/warehouse/warehouse-in/index.d.ts +2 -0
  143. package/dist/src/domain/table/business/warehouse/warehouse-in/profile/field-keys.d.ts +39 -0
  144. package/dist/src/domain/table/business/warehouse/warehouse-in/profile/fields.d.ts +2 -0
  145. package/dist/src/domain/table/business/warehouse/warehouse-in/profile/index.d.ts +3 -0
  146. package/dist/src/domain/table/business/warehouse/warehouse-in/runtime/register-handlers.d.ts +1 -0
  147. package/dist/src/domain/table/business/warehouse/warehouse-in/runtime/row-change-handlers.d.ts +6 -0
  148. package/dist/src/domain/table/business/warehouse/warehouse-in-out/index.d.ts +1 -0
  149. package/dist/src/domain/table/business/warehouse/warehouse-in-out/profile/index.d.ts +3 -0
  150. package/dist/src/domain/table/business/warehouse/warehouse-inbound/index.d.ts +2 -0
  151. package/dist/src/domain/table/business/warehouse/warehouse-inbound/profile/field-keys.d.ts +33 -0
  152. package/dist/src/domain/table/business/warehouse/warehouse-inbound/profile/fields.d.ts +2 -0
  153. package/dist/src/domain/table/business/warehouse/warehouse-inbound/profile/index.d.ts +3 -0
  154. package/dist/src/domain/table/business/warehouse/warehouse-inbound/runtime/register-handlers.d.ts +1 -0
  155. package/dist/src/domain/table/business/warehouse/warehouse-inbound/runtime/row-change-handlers.d.ts +6 -0
  156. package/dist/src/domain/table/business/warehouse/warehouse-inventory/index.d.ts +2 -0
  157. package/dist/src/domain/table/business/warehouse/warehouse-inventory/profile/field-keys.d.ts +114 -0
  158. package/dist/src/domain/table/business/warehouse/warehouse-inventory/profile/fields.d.ts +2 -0
  159. package/dist/src/domain/table/business/warehouse/warehouse-inventory/profile/index.d.ts +3 -0
  160. package/dist/src/domain/table/business/warehouse/warehouse-inventory/runtime/register-handlers.d.ts +1 -0
  161. package/dist/src/domain/table/business/warehouse/warehouse-inventory/runtime/row-change-handlers.d.ts +11 -0
  162. package/dist/src/domain/table/business/warehouse/warehouse-out/index.d.ts +2 -0
  163. package/dist/src/domain/table/business/warehouse/warehouse-out/profile/field-keys.d.ts +84 -0
  164. package/dist/src/domain/table/business/warehouse/warehouse-out/profile/fields.d.ts +2 -0
  165. package/dist/src/domain/table/business/warehouse/warehouse-out/profile/index.d.ts +3 -0
  166. package/dist/src/domain/table/business/warehouse/warehouse-out/runtime/register-handlers.d.ts +1 -0
  167. package/dist/src/domain/table/business/warehouse/warehouse-out/runtime/row-change-handlers.d.ts +6 -0
  168. package/dist/src/domain/table/business/warehouse/warehouse-outbound/index.d.ts +2 -0
  169. package/dist/src/domain/table/business/warehouse/warehouse-outbound/profile/field-keys.d.ts +64 -0
  170. package/dist/src/domain/table/business/warehouse/warehouse-outbound/profile/fields.d.ts +2 -0
  171. package/dist/src/domain/table/business/warehouse/warehouse-outbound/profile/index.d.ts +3 -0
  172. package/dist/src/domain/table/business/warehouse/warehouse-outbound/runtime/register-handlers.d.ts +1 -0
  173. package/dist/src/domain/table/business/warehouse/warehouse-outbound/runtime/row-change-handlers.d.ts +6 -0
  174. package/dist/src/domain/table/data/dynamic-table/index.d.ts +1 -0
  175. package/dist/src/domain/table/data/dynamic-table/profile/index.d.ts +3 -0
  176. package/dist/src/domain/table/data/fixed-table/index.d.ts +1 -0
  177. package/dist/src/domain/table/data/fixed-table/profile/index.d.ts +3 -0
  178. package/dist/src/domain/table/data/two-d-table/index.d.ts +1 -0
  179. package/dist/src/domain/table/data/two-d-table/profile/index.d.ts +3 -0
  180. package/dist/src/domain/table/design/autofill-expander.d.ts +19 -0
  181. package/dist/src/domain/table/design/create-subtable.d.ts +14 -0
  182. package/dist/src/domain/table/design/hooks/on-field-attach.d.ts +13 -0
  183. package/dist/src/domain/table/design/index.d.ts +6 -0
  184. package/dist/src/domain/table/design/label.d.ts +3 -0
  185. package/dist/src/domain/table/design/panel-features.d.ts +16 -0
  186. package/dist/src/domain/table/design/panel-type.d.ts +6 -0
  187. package/dist/src/domain/table/design/ribbon-options.d.ts +38 -0
  188. package/dist/src/domain/table/design/sub-model-matcher.d.ts +10 -0
  189. package/dist/src/domain/table/index.d.ts +12 -0
  190. package/dist/src/domain/table/registry.d.ts +27 -0
  191. package/dist/src/domain/table/runtime/apply-profile.d.ts +16 -0
  192. package/dist/src/domain/table/runtime/runtime-handlers.d.ts +9 -0
  193. package/dist/src/domain/table/types.d.ts +137 -0
  194. package/dist/src/index.d.ts +2 -2
  195. package/dist/src/nocode-base/src/components/document-quick-fill/quick-fill.util.d.ts +0 -1
  196. package/dist/src/nocode-base/src/components/document-sub-table-action/type.d.ts +3 -1
  197. package/dist/src/nocode-base/src/constant/index.d.ts +18 -2
  198. package/dist/src/nocode-base/src/core/sub-table/allocate-table-core.d.ts +12 -7
  199. package/dist/src/nocode-base/src/core/sub-table/index.d.ts +1 -0
  200. package/dist/src/nocode-base/src/core/sub-table/pretreatment-list-table-core.d.ts +12 -5
  201. package/dist/src/nocode-base/src/core/sub-table/profile-driven-sub-table-core.d.ts +58 -0
  202. package/dist/src/nocode-base/src/core/sub-table/stocktake-table-core.d.ts +17 -19
  203. package/dist/src/nocode-base/src/core/sub-table/utils/pretreatment/field-keys.d.ts +2 -117
  204. package/dist/src/nocode-base/src/core/sub-table/utils/stocktake/field-keys.d.ts +2 -60
  205. package/dist/src/nocode-base/src/hooks/app-info/index.d.ts +4 -0
  206. package/dist/src/nocode-base/src/hooks/device-link/controller.d.ts +6 -0
  207. package/dist/src/nocode-base/src/hooks/device-link/types.d.ts +10 -0
  208. package/dist/src/nocode-base/src/hooks/form-model/form-model-controller.d.ts +6 -1
  209. package/dist/src/nocode-base/src/hooks/form-model/types.d.ts +5 -0
  210. package/dist/src/nocode-base/src/hooks/form-tmpl-config/form-tmpl-config-controller.d.ts +16 -0
  211. package/dist/src/nocode-base/src/hooks/material-consume/bom-validator.d.ts +140 -18
  212. package/dist/src/nocode-base/src/hooks/material-consume/index.d.ts +1 -0
  213. package/dist/src/nocode-base/src/hooks/material-consume/material-consume-group-merge.d.ts +20 -0
  214. package/dist/src/nocode-base/src/hooks/material-consume/material-consume-table-controller.d.ts +50 -8
  215. package/dist/src/nocode-base/src/hooks/material-consume/mc-render.d.ts +8 -0
  216. package/dist/src/nocode-base/src/hooks/material-consume/product-id-query.d.ts +31 -0
  217. package/dist/src/nocode-base/src/hooks/material-consume/scan-fill.d.ts +10 -0
  218. package/dist/src/nocode-base/src/hooks/material-consume/scan-validator.d.ts +192 -0
  219. package/dist/src/nocode-base/src/hooks/material-consume/service.d.ts +2 -0
  220. package/dist/src/nocode-base/src/hooks/material-consume/types.d.ts +9 -0
  221. package/dist/src/nocode-base/src/hooks/material-date/material-date.d.ts +44 -0
  222. package/dist/src/nocode-base/src/hooks/material-date/service.d.ts +4 -0
  223. package/dist/src/nocode-base/src/hooks/material-date/use-material-date.d.ts +2 -0
  224. package/dist/src/nocode-base/src/hooks/useDependency.d.ts +2 -3
  225. package/dist/src/nocode-base/src/interface/render.d.ts +3 -1
  226. package/dist/src/nocode-base/src/types/business/allocate.d.ts +8 -0
  227. package/dist/src/nocode-base/src/types/fields/i-trace.d.ts +4 -0
  228. package/dist/src/nocode-base/src/types/render/mc-render.d.ts +8 -0
  229. package/dist/src/nocode-base/src/types/widgets/i-paper.d.ts +16 -0
  230. package/dist/src/nocode-base/src/types/widgets/i-serialnumber.d.ts +4 -0
  231. package/dist/src/nocode-web-render/src/render/index.d.ts +2 -1
  232. package/dist/src/nocode-web-render/src/render/sub-table/common/multi-rows-modal.vue.d.ts +15 -0
  233. package/dist/src/nocode-web-render/src/render/sub-table/common/scan-modal.vue.d.ts +2 -3
  234. package/dist/src/nocode-web-render/src/render/sub-table/material-consume/mc-web-render.d.ts +4 -0
  235. package/dist/src/online-form/src/components/device/device-select.vue.d.ts +1 -1
  236. package/dist/src/online-form/src/views/__cell_widgets__/common/assoc-filter-editor/assoc-filter.util.d.ts +1 -1
  237. package/dist/src/online-form/src/views/__cell_widgets__/common/input-prop-editor/input-prop-editor.vue.d.ts +2 -0
  238. package/dist/src/online-form/src/views/designer/constants/index.d.ts +2 -0
  239. package/dist/src/online-form/src/views/designer/enums/index.d.ts +8 -1
  240. package/dist/src/online-form/src/views/designer/hooks/useAllSpreadSheets.d.ts +48 -0
  241. package/dist/src/online-form/src/views/designer/hooks/useSpreadSheet.d.ts +66 -17
  242. package/dist/src/online-form/src/views/designer/modules/panel/panel-data-init-config/common/add-ipaas/parameter-struct/json-expression-editor.vue.d.ts +1 -1
  243. package/dist/src/online-form/src/views/designer/modules/panel/panel-tmpl-config/ai-tmpl/ai-tmpl-card.vue.d.ts +12 -0
  244. package/dist/src/online-form/src/views/designer/modules/panel/panel-tmpl-config/ai-tmpl/ai-tmpl-editor.vue.d.ts +19 -2
  245. package/dist/src/online-form/src/views/designer/modules/panel/panel-tmpl-config/ai-tmpl/identify-param-card.vue.d.ts +10 -0
  246. package/dist/src/online-form/src/views/designer/modules/panel/sub-table/comps/repeating-sub-table-config.vue.d.ts +2 -0
  247. package/dist/src/online-form/src/views/designer/modules/panel/sub-table/comps/sub-table-panel-shell.vue.d.ts +24 -0
  248. package/dist/src/online-form/src/views/designer/modules/panel/sub-table/comps/use-dynamic-sub-table-panel.d.ts +1533 -0
  249. package/dist/src/online-form/src/views/designer/modules/panel/{material-consumption → sub-table/material-consumption}/bom-entry-editor.vue.d.ts +1 -1
  250. package/dist/src/online-form/src/views/designer/modules/panel/{material-consumption → sub-table/material-consumption}/bom-modal.vue.d.ts +1 -1
  251. package/dist/src/online-form/src/views/designer/modules/panel/{panel-check-table → sub-table/panel-check-table}/select-check-ds-modal.vue.d.ts +1 -1
  252. package/dist/src/online-form/src/views/designer/modules/toolkit/model-field/add-field-btn.vue.d.ts +2 -0
  253. package/dist/src/online-form/src/views/inline-cell/use-inline-icon-catalog.d.ts +5 -1
  254. package/dist/src/shared/components/Scrollbar/src/Scrollbar.vue.d.ts +1 -1
  255. package/dist/src/shared/components/Signature/logic/index.d.ts +4 -0
  256. package/dist/src/shared/enum/field-type.d.ts +17 -5
  257. package/dist/src/shared/enum/index.d.ts +4 -2
  258. package/dist/src/shared/enum/online-form.d.ts +14 -2
  259. package/dist/{text-design-Wz4yRq1g.js → text-design-DbDDDCTT.js} +2 -2
  260. package/dist/{text-design-DN3i2RFW.js → text-design-vFgsAOs6.js} +2 -2
  261. package/dist/{text-props-B00HIRMS.js → text-props-LQ8JxfCA.js} +4 -5
  262. package/dist/{text-style-fu30umvT.js → text-style-CKBIm6Y6.js} +1 -1
  263. package/dist/{throttle-Cpk1LoGk-Fx3LWSEd.js → throttle-Cpk1LoGk-CJfuMBhT.js} +1 -1
  264. package/dist/{timediff-design-B-4vNIoK.js → timediff-design-C7qKjT0h.js} +1 -1
  265. package/dist/{trace-design-DtHxTSsv.js → trace-design-DdHPN-JX.js} +2 -2
  266. package/dist/{trace-props-Rg7mqGt_.js → trace-props-BSRELXnc.js} +60 -48
  267. package/dist/{trace-style-mCgCCGMz.js → trace-style-BOx3LU4R.js} +1 -1
  268. package/dist/{user-props-DonrdBsi.js → user-props-DCy_CVdE.js} +2 -2
  269. package/dist/{user-style-CumTeI-A.js → user-style-BbXij2Ui.js} +1 -1
  270. package/dist/{value-editor.vue_vue_type_style_index_0_lang-DRQFluA7.js → value-editor.vue_vue_type_style_index_0_lang-DqIfRgzS.js} +2 -2
  271. package/dist/{version-select-DZOffw2U.js → version-select--5mTgIzw.js} +1 -1
  272. package/dist/web-render/index.es.js +6 -5
  273. package/dist/{widget-barcode-Djaec1i2.js → widget-barcode-BYZx9koE.js} +4 -4
  274. package/dist/{widget-diagonal-Dw5Q9iRl.js → widget-diagonal-CbEoMTV6.js} +3 -3
  275. package/dist/{widget-image-Dq6zxwLm.js → widget-image-Bgb0W9tX.js} +5 -5
  276. package/dist/{widget-line-Csab5i9z.js → widget-line-xBvHpkdt.js} +2 -2
  277. package/dist/{widget-pagination-BmsUSsKm.js → widget-pagination-BjH75g8_.js} +5 -5
  278. package/dist/{widget-power-DtPCy7UV.js → widget-power-Bvr05ltd.js} +3 -3
  279. package/dist/{widget-qrcode-BAMbK-3b.js → widget-qrcode-Bj-ntq_n.js} +3 -3
  280. package/dist/{widget-rangelimit-Bx9qfojs.js → widget-rangelimit-BHa420t4.js} +3 -3
  281. package/dist/{widget-serialnumber-Bz6EQZR_.js → widget-serialnumber-BoYlmag6.js} +1 -1
  282. package/dist/{widget-text-CkXtxU3r.js → widget-text-_Q96wqKl.js} +5 -5
  283. package/dist/{widget-timediff-wqTd7OZs.js → widget-timediff-DtoWALwY.js} +2 -2
  284. package/package.json +8 -7
  285. package/dist/mb-render-CRA1gDau.js +0 -449
  286. package/dist/paper-widget-design-DFOElS47.js +0 -4
  287. package/dist/src/online-form/src/views/designer/modules/panel/panel-material-balance-table.vue.d.ts +0 -2
  288. package/dist/src/online-form/src/views/designer/modules/panel/panel-material-stocktake-table.vue.d.ts +0 -2
  289. package/dist/src/online-form/src/views/designer/modules/panel/panel-pretreatment-table.vue.d.ts +0 -2
  290. package/dist/src/online-form/src/views/designer/modules/panel/panel-sterilize-batch-table.vue.d.ts +0 -2
  291. package/dist/src/online-form/src/views/designer/modules/panel/panel-tmpl-config/common/add-tmpl-btn.vue.d.ts +0 -7
  292. /package/dist/src/online-form/src/views/designer/modules/panel/{material-consumption → sub-table/material-consumption}/edit-parse-rule.vue.d.ts +0 -0
  293. /package/dist/src/online-form/src/views/designer/modules/panel/{material-consumption → sub-table/material-consumption}/panel-material-consumption-table.vue.d.ts +0 -0
  294. /package/dist/src/online-form/src/views/designer/modules/panel/{material-consumption → sub-table/material-consumption}/translate-span.vue.d.ts +0 -0
  295. /package/dist/src/online-form/src/views/designer/modules/panel/{material-consumption → sub-table/material-consumption}/use-product-translate.d.ts +0 -0
  296. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-check-table → sub-table/panel-check-table}/add-ds-btn.vue.d.ts +0 -0
  297. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-check-table → sub-table/panel-check-table}/right-list.vue.d.ts +0 -0
  298. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-check-table.vue.d.ts → sub-table/panel-check-table.vue.d.ts} +0 -0
  299. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-data-group-2d.vue.d.ts → sub-table/panel-data-group-2d.vue.d.ts} +0 -0
  300. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-data-group.vue.d.ts → sub-table/panel-data-group.vue.d.ts} +0 -0
  301. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-fixed-table.vue.d.ts → sub-table/panel-fixed-table.vue.d.ts} +0 -0
  302. /package/dist/src/online-form/src/views/designer/modules/panel/{panel-dynamic-table.vue.d.ts → sub-table/panel-repeating-sub-table.vue.d.ts} +0 -0
@@ -1,10 +1,10 @@
1
- import { computed, watch, toRaw, onUnmounted, markRaw, ref, toRef, reactive, inject, provide, defineComponent, openBlock, createElementBlock, mergeProps, unref, createElementVNode, normalizeClass, renderSlot, createCommentVNode, createVNode, toDisplayString, isVNode, h, onBeforeMount, resolveComponent, createBlock, withCtx, Fragment, renderList, createTextVNode, onMounted } from "vue";
2
- import { cloneDeep, has, isNil, merge, defaults, pickBy, mergeWith, omit, last, pick } from "lodash-es";
3
- import { e as ComponentTypeEnum, F as FIELD_TYPE, i as api, aW as ButtonTypeEnum, v as FormTypeEnum, aP as safeParseArray, ar as RenderModeEnum, aR as mergeByMultiKey, aV as BpmnSignatureTypeEnum, aQ as BpmnNodeTypeEnum, ac as useWidgetStaticAttrs, bG as assembleRules, bH as deleteFormRule, bI as setFormRule, aG as requestDisplayValidation, bJ as isReferenceOptionActive, bK as validateAllFields, bL as runValidation, bM as stockCheck, an as getParseRuleInfo, ao as getParseRuleValue, bN as materialCheck, ay as calcFillData, at as FormulaRuleFieldKeyEnum, bO as judgeUnique, g as SubTableType, ap as useCurrentPageFormState, X as Dependency_ENUM, R as ASSIGNMENTSTRATEGY_ENUM, aN as uuid2, a4 as DeviceLink, _ as _export_sfc, ak as NCB_PROVIDE, b8 as buildFormChangeDisplayRows, aS as getRowId, bE as resolveRowFormChangeMark, bD as resolveFormChangeRowUi, bq as isAnnLocationSelected, bF as setSelectMobileTdId, br as isFormChangeGhostRow, h as CellType, ae as setSelectAnnotationId, by as recordSubtableRowDelete, ba as deleteSubtableRow, bz as relocateDeletedRowsToEnd, bP as FRONT_ROW_KEY, aA as transformUtils, bp as insertSubtableRows, bx as recordSubtableRowAdd, u as useModal, bQ as q, bR as groupFixedTableRows, bS as QUICK_FILL_ALLOWED_FIELDS, bT as processQuickFillRows, bU as getIsGroupEmpty, bk as getSubTableQuickFillInfo } from "./dynamic-table-action.vue_vue_type_style_index_0_scoped_53d7e66c_lang-CvVlP70-.js";
4
- import { u as useFormModel, w as watchDebounced } from "./mb-render-CRA1gDau.js";
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";
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-_s66osEc.js";
5
4
  import dayjs from "dayjs";
6
5
  import { u as useNamespace } from "./use-namespace-BxkK4ofX.js";
7
6
  import { Modal, message } from "ant-design-vue";
7
+ import { u as useFormModel } from "./mb-render-13-1F66x.js";
8
8
  const InstanceStatusValues = {
9
9
  /** 作废状态 */
10
10
  ABANDON: "ABANDON",
@@ -74,587 +74,6 @@ function useStyles(widget, isArea = false) {
74
74
  });
75
75
  return { otherClass };
76
76
  }
77
- const commonUtils = {
78
- /** 列表转成树 */
79
- listTransformTree: (list) => {
80
- const cloneData = cloneDeep(list);
81
- const result = [];
82
- const map = /* @__PURE__ */ new Map();
83
- cloneData.forEach((item) => {
84
- map.set(item.id, { ...item, selectable: item.type === "DOC", children: [] });
85
- });
86
- cloneData.forEach((item) => {
87
- const node = map.get(item.id);
88
- if (item.rootNode) {
89
- result.push(node);
90
- } else {
91
- const parent = map.get(item.parentId);
92
- if (parent) {
93
- parent.children.push(node);
94
- }
95
- }
96
- });
97
- return result;
98
- },
99
- findFirstDoc: (tree, ofId) => {
100
- const cloneTree = cloneDeep(tree);
101
- const queue = [...cloneTree];
102
- while (queue.length > 0) {
103
- const node = queue.shift();
104
- if (node.type === "DOC" || !node.type) {
105
- if (ofId) {
106
- if (node.id === ofId || node.tmplId === ofId) {
107
- return node;
108
- }
109
- } else {
110
- return node;
111
- }
112
- }
113
- if (node.children && node.children.length > 0) {
114
- queue.push(...node.children);
115
- }
116
- }
117
- return null;
118
- },
119
- uuid2: (len, radix) => {
120
- const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
121
- let uuid = [], i;
122
- radix = radix || chars.length;
123
- if (len) {
124
- for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
125
- } else {
126
- let r;
127
- uuid[8] = uuid[13] = uuid[18] = uuid[23] = "-";
128
- uuid[14] = "4";
129
- for (i = 0; i < 36; i++) {
130
- if (!uuid[i]) {
131
- r = 0 | Math.random() * 16;
132
- uuid[i] = chars[i == 19 ? r & 3 | 8 : r];
133
- }
134
- }
135
- }
136
- return uuid.join("");
137
- },
138
- isEmptyValue: (value) => {
139
- return value === void 0 || value === null || typeof value === "string" && value.trim() === "" || Array.isArray(value) && value.length === 0;
140
- },
141
- get gctInstanceStatusTheme() {
142
- return {
143
- "gct-nocode-instance-status--stash": {
144
- textColor: "#F77E4A",
145
- background: "rgba(247,126,74,0.1)",
146
- iconBackground: "#FFC837",
147
- placeholder: $t("sys.edhr.formInsStatusEnum.STASH")
148
- },
149
- "gct-nocode-instance-status--partial-submit": {
150
- textColor: "#FFAA00",
151
- background: "rgba(255,170,0,0.1)",
152
- iconBackground: "#FFD666",
153
- placeholder: $t("sys.appDesigner.approval.button.PartialSubmit")
154
- },
155
- "gct-nocode-instance-status--finish": {
156
- textColor: "#309C41",
157
- background: "rgba(48,156,65,0.1)",
158
- iconBackground: "#76DA57",
159
- placeholder: $t("sys.bpmn.flowNodeInstStatus.COMPLETED")
160
- },
161
- "gct-nocode-instance-status--abnormal": {
162
- textColor: "#F54547",
163
- background: " rgba(245,69,71,0.1)",
164
- iconBackground: "#FF6776",
165
- placeholder: $t("sys.bpmn.flowNodeInstStatus.EXCEPTION")
166
- },
167
- "gct-nocode-instance-status--not-filled": {
168
- textColor: "#6D82B0",
169
- background: "#E6EEFF",
170
- iconBackground: "#B4C8F4",
171
- placeholder: $t("sys.edhr.instanceStatus2DhrEnum.UNFILLED")
172
- },
173
- "gct-nocode-instance-status--running": {
174
- textColor: "#13C2C2",
175
- background: "rgba(19,194,194,0.1)",
176
- iconBackground: "#13C2C2",
177
- placeholder: $t("sys.bpmn.bizNodeInstStatus.running")
178
- },
179
- "gct-nocode-instance-status--already-filled": {
180
- textColor: "#026AC8",
181
- background: " rgba(2,106,200,0.1)",
182
- iconBackground: "#026AC8",
183
- placeholder: $t("sys.edhr.instanceStatus2DhrEnum.FILLED")
184
- },
185
- "gct-nocode-instance-status--invalid": {
186
- textColor: "#737A87",
187
- background: "#E5E5E5",
188
- iconBackground: "#C3C3C3",
189
- placeholder: $t("sys.edhr.dhrLogType.ABANDON")
190
- },
191
- "gct-nocode-instance-status--archived": {
192
- textColor: "#dda200",
193
- background: "#faf3df",
194
- iconBackground: "#dda200",
195
- placeholder: $t("sys.edhr.recordBook.archived")
196
- },
197
- "gct-nocode-instance-status--tmpl": {
198
- textColor: "#742fb2",
199
- background: "#f9f2ff",
200
- iconBackground: "#742fb2",
201
- placeholder: $t("sys.appDesigner.template")
202
- },
203
- "gct-nocode-instance-status--in-audit": {
204
- textColor: "#FF52C5",
205
- background: "rgba(255,82,197, 0.1)",
206
- iconBackground: "#FF52C5",
207
- placeholder: $t("sys.edhr.instanceStatus2FormEnum.IN_AUDIT")
208
- }
209
- };
210
- }
211
- };
212
- function useOnlineFormActionButton() {
213
- const baseBtn = [
214
- {
215
- type: "Cancel",
216
- customTitle: $t("sys.cancelText"),
217
- title: $t("sys.cancelText"),
218
- enable: 1,
219
- buttonType: "builtin",
220
- isCustom: false
221
- }
222
- ];
223
- const processFormBtnGroup = [
224
- {
225
- type: ButtonTypeEnum.Return,
226
- title: $t("sys.appDesigner.approval.button.Return"),
227
- api: api.apaas.onlineForm.postProcessReturn
228
- },
229
- {
230
- type: ButtonTypeEnum.Reassign,
231
- title: $t("sys.appDesigner.approval.button.Reassign"),
232
- style: {
233
- type: "primary"
234
- },
235
- api: api.apaas.onlineForm.postProcessReassign
236
- },
237
- {
238
- type: ButtonTypeEnum.Save,
239
- title: $t("sys.saveText"),
240
- style: {
241
- type: "primary"
242
- },
243
- api: api.apaas.onlineForm.postProcessSave
244
- },
245
- {
246
- type: ButtonTypeEnum.PartialSubmit,
247
- title: $t("sys.appDesigner.approval.button.PartialSubmit"),
248
- style: {
249
- type: "primary"
250
- },
251
- api: api.apaas.onlineForm.postProcessPartialSubmit
252
- },
253
- {
254
- type: ButtonTypeEnum.Submit,
255
- title: $t("sys.submit"),
256
- style: {
257
- type: "primary"
258
- },
259
- api: api.apaas.onlineForm.postProcessSubmit
260
- },
261
- {
262
- type: ButtonTypeEnum.Approve,
263
- title: $t("sys.appDesigner.approval.button.Approve"),
264
- style: {
265
- type: "primary"
266
- },
267
- api: api.apaas.onlineForm.postProcessApprove
268
- },
269
- {
270
- type: ButtonTypeEnum.Qualified,
271
- title: $t("sys.appDesigner.approval.button.Qualified"),
272
- api: api.apaas.onlineForm.postProcessApproveQualification
273
- },
274
- {
275
- type: ButtonTypeEnum.Unqualified,
276
- title: $t("sys.appDesigner.approval.button.Unqualified"),
277
- api: api.apaas.onlineForm.postProcessApprove
278
- }
279
- ];
280
- const formChangeBtnGroup = [
281
- {
282
- type: ButtonTypeEnum.Return,
283
- title: $t("sys.appDesigner.approval.button.Return"),
284
- api: api.apaas.form.postChangeProcessReturn,
285
- medproApi: window.NocodeAdapter.apis?.postMedproFormChangeProcessReturn
286
- },
287
- {
288
- type: ButtonTypeEnum.Reassign,
289
- title: $t("sys.appDesigner.approval.button.Reassign"),
290
- style: {
291
- type: "primary"
292
- },
293
- api: api.apaas.form.postChangeProcessReassign,
294
- medproApi: window.NocodeAdapter.apis?.postMedproFormChangeProcessReassign
295
- },
296
- {
297
- type: ButtonTypeEnum.Approve,
298
- title: $t("sys.appDesigner.approval.button.Approve"),
299
- style: {
300
- type: "primary"
301
- },
302
- api: api.apaas.form.postChangeProcessApprove,
303
- medproApi: window.NocodeAdapter.apis?.postMedproFormChangeProcessApprove
304
- }
305
- ];
306
- function renderActionButton(showButtons, buttonConfig, options) {
307
- const { formType, inDrawer, isViewPage, isRecordFill, processOperation } = options || {};
308
- const _baseBtn = inDrawer && !isViewPage ? baseBtn.slice() : [];
309
- if (!formType || formType === FormTypeEnum.TEXT || formType === FormTypeEnum.VIEW) {
310
- return [];
311
- }
312
- if (options.isFormChangeApprovalPage) {
313
- const buttonMap = safeParseArray(buttonConfig).reduce((acc, current) => {
314
- acc[current.type] = current;
315
- return acc;
316
- }, {});
317
- return formChangeBtnGroup.filter((info) => showButtons.includes(info.type)).map((item) => {
318
- const btn = buttonMap?.[item.type];
319
- if (btn && btn.enable) {
320
- return {
321
- ...btn,
322
- style: {
323
- ...item.style,
324
- ...btn.style
325
- },
326
- buttonType: "builtin",
327
- customTitle: btn.alias || item.title || $t("sys.pageDesigner.button"),
328
- belongFormChangeApproval: true,
329
- api: options.isMedPro ? item.medproApi : item.api
330
- };
331
- }
332
- }).filter((i) => i);
333
- }
334
- if (formType === FormTypeEnum.BASE || formType === FormTypeEnum.FILE) {
335
- if (options.modeType === RenderModeEnum.ViewMode) {
336
- return [];
337
- }
338
- return _baseBtn.concat(
339
- mergeByMultiKey(safeParseArray(buttonConfig), safeParseArray(processOperation), {
340
- keyFields: ["type", "buttonType"]
341
- }).filter((btn) => {
342
- return Boolean(btn.enable) && (!isRecordFill || btn.buttonType === "builtin" && (btn.type === ButtonTypeEnum.Save || btn.type === ButtonTypeEnum.Submit));
343
- }).map((btn) => {
344
- const isSaveOrSubmit = btn.buttonType === "builtin" && [ButtonTypeEnum.Submit, ButtonTypeEnum.Save, ButtonTypeEnum.PartialSubmit].includes(
345
- btn.type
346
- );
347
- return {
348
- ...btn,
349
- ...isSaveOrSubmit && {
350
- style: {
351
- type: "primary",
352
- ...btn.style
353
- }
354
- },
355
- customTitle: btn.alias || btn.title || $t("sys.pageDesigner.button"),
356
- signatureType: btn.signatureType || BpmnSignatureTypeEnum.None,
357
- api: btn.type === ButtonTypeEnum.PartialSubmit ? api.apaas.onlineForm.postPartialSubmit : btn.type === ButtonTypeEnum.Save ? api.apaas.onlineForm.postStash : api.apaas.onlineForm.postBaseSubmit
358
- };
359
- }).sort((a, b) => a.buttonType === b.buttonType ? 0 : a.buttonType === "custom" ? 1 : -1)
360
- );
361
- }
362
- if (formType === FormTypeEnum.PROCESS && options.bpmnType !== BpmnNodeTypeEnum.BpmnEnd) {
363
- if (isViewPage || options.modeType === RenderModeEnum.ViewMode) {
364
- return [];
365
- }
366
- const mergedBtns = mergeByMultiKey(
367
- safeParseArray(buttonConfig),
368
- safeParseArray(processOperation)
369
- );
370
- const custonBuiltinBtns = mergedBtns.filter((e) => e.isCustomBuiltin);
371
- const buttonMap = mergedBtns.reduce((acc, current) => {
372
- acc[current.type] = current;
373
- return acc;
374
- }, {});
375
- const customButton = Object.values(buttonMap).filter(
376
- (btn) => btn.enable && has(btn, "isCustom") && btn.isCustom && showButtons.includes(btn.type)
377
- ).map((item) => {
378
- const btn = buttonMap?.[item.type];
379
- return {
380
- ...btn,
381
- buttonType: "custom",
382
- customTitle: btn.alias || item.title || $t("sys.pageDesigner.button"),
383
- api: api.apaas.onlineForm.postProcessJump
384
- };
385
- });
386
- return _baseBtn.concat(customButton).concat(
387
- // 流程表单内置按钮
388
- processFormBtnGroup.filter((info) => showButtons.includes(info.type)).map((item) => {
389
- const btn = buttonMap?.[item.type];
390
- if (btn && btn.enable && !btn.isCustom) {
391
- return {
392
- ...btn,
393
- style: {
394
- ...item.style,
395
- ...btn.style
396
- },
397
- buttonType: "builtin",
398
- customTitle: btn.alias || item.title || $t("sys.pageDesigner.button"),
399
- api: item.api
400
- };
401
- }
402
- }).filter((i) => i)
403
- ).concat(
404
- custonBuiltinBtns.filter((e) => showButtons.includes(e.type)).map((e) => {
405
- const btn = buttonMap?.[e.type];
406
- const processBtn = processFormBtnGroup.find((f) => f.type === e.sourceType) || {};
407
- if (btn && btn.enable && btn.isCustomBuiltin) {
408
- return {
409
- ...btn,
410
- style: {
411
- ...processBtn.style,
412
- ...btn.style
413
- },
414
- buttonType: "builtin",
415
- cusBuiltinType: btn.type,
416
- type: btn.sourceType,
417
- customTitle: btn.alias || processBtn.title || $t("sys.pageDesigner.button"),
418
- api: processBtn.api
419
- };
420
- }
421
- }).filter((i) => i)
422
- );
423
- }
424
- return _baseBtn;
425
- }
426
- const autoSaveButtonMap = {
427
- [FormTypeEnum.BASE]: {
428
- type: ButtonTypeEnum.Save,
429
- title: $t("sys.saveText"),
430
- customTitle: $t("sys.saveText"),
431
- buttonType: "builtin",
432
- api: api.apaas.onlineForm.postStash
433
- },
434
- [FormTypeEnum.PROCESS]: {
435
- type: ButtonTypeEnum.Save,
436
- title: $t("sys.saveText"),
437
- customTitle: $t("sys.saveText"),
438
- buttonType: "builtin",
439
- api: api.apaas.onlineForm.postProcessSave
440
- }
441
- };
442
- return {
443
- renderActionButton,
444
- autoSaveButtonMap
445
- };
446
- }
447
- const useOnlineFormTransformField2Component = (fieldType) => {
448
- return {
449
- [FIELD_TYPE.TEXT]: {
450
- cmpKey: ComponentTypeEnum.Input
451
- },
452
- [FIELD_TYPE.LONG_TEXT]: {
453
- cmpKey: ComponentTypeEnum.Textarea
454
- },
455
- [FIELD_TYPE.INTEGER]: {
456
- cmpKey: ComponentTypeEnum.Inputnumber
457
- },
458
- [FIELD_TYPE.LONG]: {
459
- cmpKey: ComponentTypeEnum.Inputnumber
460
- },
461
- [FIELD_TYPE.DOUBLE]: {
462
- cmpKey: ComponentTypeEnum.InputDouble
463
- },
464
- [FIELD_TYPE.DECIMAL]: {
465
- cmpKey: ComponentTypeEnum.Inputnumber
466
- },
467
- [FIELD_TYPE.BOOLEAN]: {
468
- cmpKey: ComponentTypeEnum.Switch
469
- },
470
- [FIELD_TYPE.SERIAL]: {
471
- cmpKey: ComponentTypeEnum.Input
472
- },
473
- [FIELD_TYPE.IMAGE]: {
474
- cmpKey: ComponentTypeEnum.UploadImage
475
- },
476
- [FIELD_TYPE.SIGNATURE]: {
477
- cmpKey: ComponentTypeEnum.Sign
478
- },
479
- [FIELD_TYPE.ATTACHMENT]: {
480
- cmpKey: ComponentTypeEnum.UploadFile
481
- },
482
- [FIELD_TYPE.USER]: {
483
- cmpKey: ComponentTypeEnum.Userpicker
484
- },
485
- [FIELD_TYPE.USER_MULTI]: {
486
- cmpKey: ComponentTypeEnum.Userpicker
487
- },
488
- [FIELD_TYPE.ORG]: {
489
- cmpKey: ComponentTypeEnum.Department
490
- },
491
- [FIELD_TYPE.ORG_MULTI]: {
492
- cmpKey: ComponentTypeEnum.Department
493
- },
494
- [FIELD_TYPE.ENUM]: {
495
- cmpKey: ComponentTypeEnum.EnumSelect
496
- },
497
- [FIELD_TYPE.ENUM_MULTI]: {
498
- cmpKey: ComponentTypeEnum.EnumSelect
499
- },
500
- [FIELD_TYPE.OPTION]: {
501
- cmpKey: ComponentTypeEnum.EnumSelect
502
- },
503
- [FIELD_TYPE.OPTION_MULTI]: {
504
- cmpKey: ComponentTypeEnum.EnumSelect
505
- },
506
- [FIELD_TYPE.REF]: {
507
- cmpKey: ComponentTypeEnum.Select
508
- },
509
- [FIELD_TYPE.REF_MULTI]: {
510
- cmpKey: ComponentTypeEnum.Select
511
- },
512
- [FIELD_TYPE.MODEL_RELATION]: {
513
- cmpKey: ComponentTypeEnum.Select
514
- },
515
- [FIELD_TYPE.WAREHOUSE]: {
516
- cmpKey: ComponentTypeEnum.Select
517
- },
518
- [FIELD_TYPE.LOCATION]: {
519
- cmpKey: ComponentTypeEnum.Select
520
- },
521
- [FIELD_TYPE.DATE]: {
522
- cmpKey: ComponentTypeEnum.Datepicker
523
- },
524
- [FIELD_TYPE.DATE_TIME]: {
525
- cmpKey: ComponentTypeEnum.DateTimepicker
526
- },
527
- [FIELD_TYPE.TIME]: {
528
- cmpKey: ComponentTypeEnum.Timepicker
529
- },
530
- [FIELD_TYPE.EXPRESSION]: {
531
- cmpKey: ComponentTypeEnum.EXPRESSION
532
- },
533
- [FIELD_TYPE.AGG]: {
534
- cmpKey: ComponentTypeEnum.AGG
535
- },
536
- [FIELD_TYPE.MATERIAL_NO]: {
537
- cmpKey: ComponentTypeEnum.Trace
538
- },
539
- [FIELD_TYPE.STERILIZE_LOT]: {
540
- cmpKey: ComponentTypeEnum.Trace
541
- },
542
- [FIELD_TYPE.MATERIAL_LOT]: {
543
- cmpKey: ComponentTypeEnum.Trace
544
- },
545
- [FIELD_TYPE.RELATED_LOT_NO]: {
546
- cmpKey: ComponentTypeEnum.Trace
547
- },
548
- [FIELD_TYPE.PRODUCT]: {
549
- cmpKey: ComponentTypeEnum.Trace
550
- },
551
- [FIELD_TYPE.DEVICE]: {
552
- cmpKey: ComponentTypeEnum.Trace
553
- },
554
- [FIELD_TYPE.MFG_ORDER]: {
555
- cmpKey: ComponentTypeEnum.Trace
556
- },
557
- [FIELD_TYPE.RECORD_NO]: {
558
- cmpKey: ComponentTypeEnum.Trace
559
- },
560
- [FIELD_TYPE.TRACE_DATE]: {
561
- cmpKey: ComponentTypeEnum.Trace
562
- },
563
- [FIELD_TYPE.ORDER_NO]: {
564
- cmpKey: ComponentTypeEnum.Trace
565
- },
566
- [FIELD_TYPE.EXTERNAL_REF_NO]: {
567
- cmpKey: ComponentTypeEnum.Trace
568
- },
569
- [FIELD_TYPE.SHOPFLOOR]: {
570
- cmpKey: ComponentTypeEnum.Trace
571
- },
572
- [FIELD_TYPE.ROUTING_OPERATION]: {
573
- cmpKey: ComponentTypeEnum.Select
574
- },
575
- [FIELD_TYPE.GOOD_QTY]: {
576
- cmpKey: ComponentTypeEnum.InputDouble
577
- },
578
- [FIELD_TYPE.NOT_GOOD_QTY]: {
579
- cmpKey: ComponentTypeEnum.InputDouble
580
- },
581
- [FIELD_TYPE.REPORT_START_TIME]: {
582
- cmpKey: ComponentTypeEnum.DateTimepicker
583
- },
584
- [FIELD_TYPE.REPORT_END_TIME]: {
585
- cmpKey: ComponentTypeEnum.DateTimepicker
586
- },
587
- [FIELD_TYPE.WORK_HOURS]: {
588
- cmpKey: ComponentTypeEnum.Inputnumber
589
- },
590
- [FIELD_TYPE.PRODUCTION_DATE]: {
591
- cmpKey: ComponentTypeEnum.Datepicker
592
- },
593
- [FIELD_TYPE.REPORTER]: {
594
- cmpKey: ComponentTypeEnum.Sign
595
- },
596
- [FIELD_TYPE.NOT_GOOD_REASON]: {
597
- cmpKey: ComponentTypeEnum.Select
598
- },
599
- [FIELD_TYPE.NOT_GOOD_GROUP]: {
600
- cmpKey: ComponentTypeEnum.Select
601
- },
602
- [FIELD_TYPE.SCRAP_REASON]: {
603
- cmpKey: ComponentTypeEnum.Select
604
- },
605
- [FIELD_TYPE.SCRAP_GROUP]: {
606
- cmpKey: ComponentTypeEnum.Select
607
- },
608
- [FIELD_TYPE.SCRAP_QTY]: {
609
- cmpKey: ComponentTypeEnum.InputDouble
610
- },
611
- [FIELD_TYPE.SCRAP_MATERIAL]: {
612
- cmpKey: ComponentTypeEnum.Trace
613
- },
614
- [FIELD_TYPE.SCRAP_MATERIAL_NO]: {
615
- cmpKey: ComponentTypeEnum.Trace
616
- },
617
- [FIELD_TYPE.DESTRUCTIVE_TEST_QTY]: {
618
- cmpKey: ComponentTypeEnum.InputDouble
619
- },
620
- [FIELD_TYPE.PRODUCT_CHECK_QTY]: {
621
- cmpKey: ComponentTypeEnum.InputDouble
622
- },
623
- [FIELD_TYPE.MATERIAL_CHECK_QTY]: {
624
- cmpKey: ComponentTypeEnum.InputDouble
625
- },
626
- [FIELD_TYPE.QTY_REQUIRED]: {
627
- cmpKey: ComponentTypeEnum.InputDouble
628
- },
629
- [FIELD_TYPE.QTY_CONSUMED]: {
630
- cmpKey: ComponentTypeEnum.InputDouble
631
- },
632
- [FIELD_TYPE.QTY]: {
633
- cmpKey: ComponentTypeEnum.InputDouble
634
- },
635
- [FIELD_TYPE.DEVICE_REF]: {
636
- cmpKey: ComponentTypeEnum.Select
637
- },
638
- [FIELD_TYPE.DEVICE_REF_MULTI]: {
639
- cmpKey: ComponentTypeEnum.Select
640
- },
641
- [FIELD_TYPE.WAREHOUSE_RECEIPT_NO]: {
642
- cmpKey: ComponentTypeEnum.Input
643
- },
644
- [FIELD_TYPE.WAREHOUSE_RECEIPT_DATE]: {
645
- cmpKey: ComponentTypeEnum.Datepicker
646
- },
647
- [FIELD_TYPE.WAREHOUSE_MANAGER]: {
648
- cmpKey: ComponentTypeEnum.Sign
649
- },
650
- [FIELD_TYPE.OF_INST_NUM]: {
651
- cmpKey: ComponentTypeEnum.Inputnumber
652
- },
653
- [FIELD_TYPE.E_SOP]: {
654
- cmpKey: ComponentTypeEnum.Trace
655
- }
656
- }[fieldType];
657
- };
658
77
  const constantRequiredStyles = {
659
78
  "--required-border-color": "#ffb0ae",
660
79
  "--required-border-hover-color": "rgb(255, 31, 31, 0.86)",
@@ -904,13 +323,13 @@ const validate = async (formData, paper, uniqueId) => {
904
323
  };
905
324
  };
906
325
  class BomEntryValidator {
907
- constructor(bomEntry, enableSequenceLoading, materialNoNum, historyData, mainMaterialNo, mcPattern) {
326
+ constructor(bomEntry, enableSequenceLoading, getMaterialNoNum, historyData, mainMaterialNo, noBomMode) {
908
327
  this.bomEntry = bomEntry;
909
328
  this.enableSequenceLoading = enableSequenceLoading;
910
- this.materialNoNum = materialNoNum;
329
+ this.getMaterialNoNum = getMaterialNoNum;
911
330
  this.historyData = historyData;
912
331
  this.mainMaterialNo = mainMaterialNo;
913
- this.mcPattern = mcPattern;
332
+ this.noBomMode = noBomMode;
914
333
  this.productIds.push(this.bomEntry.product_id_);
915
334
  this.productCodes[this.bomEntry.product_id_] = this.bomEntry.product_code_;
916
335
  if (this.bomEntry.substitute_material_enabled_ && this.bomEntry.substitute_material_entries_) {
@@ -920,26 +339,31 @@ class BomEntryValidator {
920
339
  });
921
340
  }
922
341
  this.hasConsumed = this.calcQtyConsumed(this.historyData);
923
- this.total = this.materialNoNum * this.bomEntry.qty_required_;
924
342
  }
925
343
  bomEntry;
926
344
  enableSequenceLoading;
927
- materialNoNum;
345
+ getMaterialNoNum;
928
346
  historyData;
929
347
  mainMaterialNo;
930
- mcPattern;
348
+ noBomMode;
931
349
  /** 该明细使用到的产品的id集合 */
932
350
  productIds = [];
933
351
  /** 物料和code的映射 */
934
352
  productCodes = {};
935
353
  /** 历史数据中已经消耗的 */
936
354
  hasConsumed = 0;
937
- /** 需求总量 */
938
- total = 0;
939
355
  /** 剩于可消耗数量 */
940
356
  get remainingNum() {
941
357
  return this.total - this.hasConsumed;
942
358
  }
359
+ /** 批次/生产数量(用时读取,避免构造快照过期) */
360
+ get materialNoNum() {
361
+ return Number(this.getMaterialNoNum()) || 0;
362
+ }
363
+ /** 需求总量 = 数量倍数 × BOM 单位用量 */
364
+ get total() {
365
+ return this.materialNoNum * this.bomEntry.qty_required_;
366
+ }
943
367
  /**
944
368
  * 翻译物料的code
945
369
  * @param productId
@@ -956,6 +380,38 @@ class BomEntryValidator {
956
380
  filterGroupData(arr) {
957
381
  return arr.filter((i) => this.productIds.includes(i.product_id_));
958
382
  }
383
+ /** 行是否属于本 BOM 组(优先 bom_entry_id_,避免跨组 product_id_ 误判) */
384
+ isRowInGroup(row) {
385
+ if (row.deleted_) return false;
386
+ if (row.bom_entry_id_) return row.bom_entry_id_ === this.bomEntry.id_;
387
+ if (row.product_id_) return this.productIds.includes(row.product_id_);
388
+ return false;
389
+ }
390
+ /** 组内已选中的物料(整批替代;不排除当前行) */
391
+ getGroupExistingProductId(tableData) {
392
+ for (const row of tableData) {
393
+ if (row.deleted_) continue;
394
+ if (!this.isRowInGroup(row)) continue;
395
+ if (row.product_id_) return row.product_id_;
396
+ }
397
+ return void 0;
398
+ }
399
+ /**
400
+ * 本组 product_id_ 下拉可选范围
401
+ * - 未开替代料:仅主料
402
+ * - 整批替代:组内已有 → 锁定该物料;否则主料+替代料
403
+ * - 混用等:主料+替代料
404
+ */
405
+ getSelectableProductIds(tableData) {
406
+ if (!this.bomEntry.substitute_material_enabled_) {
407
+ return [this.bomEntry.product_id_];
408
+ }
409
+ if (this.bomEntry.substitute_policy_ === "only_one") {
410
+ const existing = this.getGroupExistingProductId(tableData);
411
+ if (existing) return [existing];
412
+ }
413
+ return this.productIds;
414
+ }
959
415
  validateSubstitute(arr) {
960
416
  const groupData = this.filterGroupData(arr);
961
417
  if (!this.bomEntry.substitute_material_enabled_) {
@@ -966,7 +422,7 @@ class BomEntryValidator {
966
422
  } else if (this.bomEntry.substitute_policy_ === "only_one") {
967
423
  const idSet = new Set(groupData.map((i) => i.product_id_));
968
424
  if (idSet.size > 1) {
969
- throw new Error($t("sys.edhr.mcTable.notAllowMixSubstituteMaterial"));
425
+ throw new Error($t("整批替代,不允许混用"));
970
426
  }
971
427
  }
972
428
  }
@@ -995,6 +451,64 @@ class BomEntryValidator {
995
451
  throw new Error(errorMsg);
996
452
  }
997
453
  }
454
+ /**
455
+ * 通用校验 3(带即将写入的行):组内已有行 + row 的批次去重后,是否超过混批次数。
456
+ * - 非按批次 / 未开混批校验 / row 不属于本组 → 直接通过
457
+ * - 排除空物料;空批次不计入
458
+ */
459
+ validateLotMixingWithRow(row, arr) {
460
+ if (this.bomEntry.type_ !== "by_lot") {
461
+ return;
462
+ }
463
+ if (!this.bomEntry.lot_mixing_enabled_) {
464
+ return;
465
+ }
466
+ if (!row.product_id_ || !this.productIds.includes(row.product_id_)) {
467
+ return;
468
+ }
469
+ const lots = /* @__PURE__ */ new Set();
470
+ this.filterGroupData(arr).forEach((i) => {
471
+ if (i.product_id_ && i.material_no_) {
472
+ lots.add(i.material_no_);
473
+ }
474
+ });
475
+ if (row.material_no_) {
476
+ lots.add(row.material_no_);
477
+ }
478
+ const maxTimes = this.bomEntry.lot_mixing_times_;
479
+ if (lots.size > maxTimes) {
480
+ throw new Error(`超过允许的混批次数:${maxTimes}`);
481
+ }
482
+ }
483
+ /** 指定物料批次:material_no_ 须在 specified_material_entries_ 的 name_ 范围内 */
484
+ validateSpecifiedMaterialNo(row) {
485
+ if (!this.bomEntry.specified_material_no_enabled_) {
486
+ return;
487
+ }
488
+ if (this.bomEntry.type_ === "view") {
489
+ return;
490
+ }
491
+ const lot = row.material_no_;
492
+ if (!lot) {
493
+ return;
494
+ }
495
+ const allowed = (this.bomEntry.specified_material_entries_ ?? []).map((e) => e.name_).filter(Boolean);
496
+ if (!allowed.includes(lot)) {
497
+ throw new Error(`${lot},不在指定物料批次范围内`);
498
+ }
499
+ }
500
+ /** 整组指定批次校验:组内每一行有批次值的都检查 */
501
+ validateSpecifiedMaterialNoForGroup(arr) {
502
+ if (!this.bomEntry.specified_material_no_enabled_) {
503
+ return;
504
+ }
505
+ arr.forEach((row) => {
506
+ if (row.deleted_ || !this.isRowInGroup(row) || !row.material_no_) {
507
+ return;
508
+ }
509
+ this.validateSpecifiedMaterialNo(row);
510
+ });
511
+ }
998
512
  /**
999
513
  * 校验数量
1000
514
  * @param arr
@@ -1073,6 +587,49 @@ class BomEntryValidator {
1073
587
  const min = await getValue(this.bomEntry.min_value_);
1074
588
  return { max, min };
1075
589
  }
590
+ /**
591
+ * 通用校验 5:本组上料数量是否满足 qty_validation_rule_。
592
+ * 前置假设:必填、替代料、混批等已由调用方完成。
593
+ * @param sequential 是否按顺序上料;eq 规则在非顺序模式下允许少上
594
+ */
595
+ async validateGroupQty(arr, sequential = this.enableSequenceLoading, groupNo) {
596
+ const entry = this.bomEntry;
597
+ if (!entry.qty_validation_enabled_ || entry.type_ === "view") {
598
+ return;
599
+ }
600
+ const loaded = this.calcQtyConsumed(arr);
601
+ const required = this.remainingNum;
602
+ const diff = loaded - required;
603
+ const rule = entry.qty_validation_rule_;
604
+ const fail = (msg) => {
605
+ const prefix = groupNo != null && groupNo > 0 ? $t("sys.groupQtyErrorPrefix", { groupNo }) : "";
606
+ throw new Error(`${prefix}${msg}`);
607
+ };
608
+ switch (rule) {
609
+ case "eq":
610
+ if (sequential) {
611
+ if (diff !== 0) fail($t("sys.qtyValidationRule.eq"));
612
+ } else {
613
+ if (loaded > required) fail($t("sys.qtyValidationRule.lte"));
614
+ }
615
+ break;
616
+ case "gte":
617
+ if (diff < 0) fail($t("sys.qtyValidationRule.gte"));
618
+ break;
619
+ case "lte":
620
+ if (diff > 0) fail($t("sys.qtyValidationRule.lte"));
621
+ break;
622
+ case "bounds": {
623
+ const groupData = this.filterGroupData(arr);
624
+ const consumeSum = loaded + this.hasConsumed;
625
+ const { min, max } = await this.calcCustomNumberLimit(groupData[0]);
626
+ if (min !== void 0 && consumeSum < min || max !== void 0 && consumeSum > max) {
627
+ fail($t("sys.qtyValidationRule.bounds", { min, max }));
628
+ }
629
+ break;
630
+ }
631
+ }
632
+ }
1076
633
  /**
1077
634
  * 按顺序投料用
1078
635
  * 检查数据中的当前明细的填报是否已经完成
@@ -1126,31 +683,35 @@ class BomEntryValidator {
1126
683
  }
1127
684
  }
1128
685
  class BomEntriesValidator {
1129
- constructor(entries, enableSequenceLoading, materialNoNum, historyData, mainMaterialNo, mcPattern) {
686
+ constructor(entries, enableSequenceLoading, getMaterialNoNum, historyData, mainMaterialNo, noBomMode) {
1130
687
  this.entries = entries;
1131
688
  this.enableSequenceLoading = enableSequenceLoading;
1132
- this.materialNoNum = materialNoNum;
689
+ this.getMaterialNoNum = getMaterialNoNum;
1133
690
  this.historyData = historyData;
1134
691
  this.mainMaterialNo = mainMaterialNo;
1135
- this.mcPattern = mcPattern;
692
+ this.noBomMode = noBomMode;
1136
693
  this.bomEntryValidators = entries.map(
1137
694
  (i) => new BomEntryValidator(
1138
695
  i,
1139
696
  enableSequenceLoading,
1140
- materialNoNum,
697
+ getMaterialNoNum,
1141
698
  historyData,
1142
699
  mainMaterialNo,
1143
- mcPattern
700
+ noBomMode
1144
701
  )
1145
702
  );
1146
703
  }
1147
704
  entries;
1148
705
  enableSequenceLoading;
1149
- materialNoNum;
706
+ getMaterialNoNum;
1150
707
  historyData;
1151
708
  mainMaterialNo;
1152
- mcPattern;
709
+ noBomMode;
1153
710
  bomEntryValidators;
711
+ /** 当前批次/生产数量 */
712
+ get materialNoNum() {
713
+ return Number(this.getMaterialNoNum()) || 0;
714
+ }
1154
715
  /**
1155
716
  * 翻译物料的code
1156
717
  * @param productId
@@ -1173,6 +734,119 @@ class BomEntriesValidator {
1173
734
  findUtilByProductId(productId) {
1174
735
  return this.bomEntryValidators.find((i) => i.productIds.includes(productId));
1175
736
  }
737
+ /** 编辑行所属组 id;空物料且无 bom_entry_id_ 时返回 null */
738
+ getRowGroupId(row) {
739
+ if (row.bom_entry_id_) return row.bom_entry_id_;
740
+ if (row.product_id_) {
741
+ const util = this.findUtilByProductId(row.product_id_);
742
+ return util?.bomEntry.id_ ?? null;
743
+ }
744
+ return null;
745
+ }
746
+ /**
747
+ * 是否有正在编辑的组。
748
+ * 一组可多行同时 !is_confirmed_;正常应只有一组。
749
+ * @returns 有编辑行且只落在一组 → true;无编辑行 → false;跨多组编辑 → 抛错
750
+ */
751
+ hasEditingGroup(arr) {
752
+ const editRows = arr.filter((i) => !i.is_confirmed_ && !i.deleted_);
753
+ if (!editRows.length) return false;
754
+ const groupIds = /* @__PURE__ */ new Set();
755
+ for (const row of editRows) {
756
+ const id = this.getRowGroupId(row);
757
+ if (id) groupIds.add(id);
758
+ }
759
+ if (groupIds.size === 0) return true;
760
+ if (groupIds.size > 1) {
761
+ throw new Error("同时只能有一组处于编辑态");
762
+ }
763
+ return true;
764
+ }
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
+ /**
775
+ * 行 → BOM 明细在 bomEntryValidators 中的下标,找不到返回 -1
776
+ */
777
+ resolveEntryIndex(row) {
778
+ if (row.product_id_) {
779
+ const i = this.bomEntryValidators.findIndex((v) => v.productIds.includes(row.product_id_));
780
+ if (i >= 0) return i;
781
+ }
782
+ return row.bom_entry_id_ ? this.bomEntryValidators.findIndex((v) => v.bomEntry.id_ === row.bom_entry_id_) : -1;
783
+ }
784
+ /**
785
+ * 行所属组在序号列中的 groupOrderIndex(0-based;-1 未绑 BOM 组)
786
+ * 与 material-consume-table 序号列逻辑一致
787
+ */
788
+ resolveGroupOrderIndex(row, arr) {
789
+ const entryIdx = this.resolveEntryIndex(row);
790
+ if (this.enableSequenceLoading) {
791
+ return entryIdx;
792
+ }
793
+ if (entryIdx < 0) {
794
+ return -1;
795
+ }
796
+ return this.resolveEntryOrderInTable(entryIdx, arr);
797
+ }
798
+ /** 已知 BomEntryValidator 时算 groupOrderIndex */
799
+ resolveGroupOrderIndexByUtil(util, arr) {
800
+ return this.resolveGroupOrderIndex(
801
+ { bom_entry_id_: util.bomEntry.id_ },
802
+ arr
803
+ );
804
+ }
805
+ /** 非顺序上料:BOM 组在表中首次出现的顺序(0-based) */
806
+ resolveEntryOrderInTable(entryIdx, arr) {
807
+ const seen = [];
808
+ for (const r of arr) {
809
+ if (r.deleted_) continue;
810
+ const idx = this.resolveEntryIndex(r);
811
+ if (idx < 0 || seen.includes(idx)) continue;
812
+ seen.push(idx);
813
+ }
814
+ return seen.indexOf(entryIdx);
815
+ }
816
+ /**
817
+ * 定位顺序上料时的当前编辑组对应 BOM 明细。
818
+ * 编辑行无物料时,用前后组夹出范围,取 (prev, next) 开区间起点。
819
+ */
820
+ findSequenceBomEntry(arr) {
821
+ const editRows = arr.filter((i) => !i.is_confirmed_ && !i.deleted_);
822
+ if (!editRows.length) return;
823
+ const hit = editRows.find((i) => i.product_id_) ?? editRows.find((i) => i.bom_entry_id_);
824
+ if (hit?.product_id_) return this.findUtilByProductId(hit.product_id_);
825
+ if (hit?.bom_entry_id_) {
826
+ return this.bomEntryValidators.find((v) => v.bomEntry.id_ === hit.bom_entry_id_);
827
+ }
828
+ const from = arr.indexOf(editRows[0]);
829
+ const to = arr.indexOf(editRows[editRows.length - 1]);
830
+ let prev = -1;
831
+ let next = this.bomEntryValidators.length;
832
+ for (let i = from - 1; i >= 0; i--) {
833
+ const idx = this.resolveEntryIndex(arr[i]);
834
+ if (idx >= 0) {
835
+ prev = idx;
836
+ break;
837
+ }
838
+ }
839
+ for (let i = to + 1; i < arr.length; i++) {
840
+ const idx = this.resolveEntryIndex(arr[i]);
841
+ if (idx >= 0) {
842
+ next = idx;
843
+ break;
844
+ }
845
+ }
846
+ const cur = prev + 1;
847
+ if (cur >= next || cur >= this.bomEntryValidators.length) return;
848
+ return this.bomEntryValidators[cur];
849
+ }
1176
850
  /**
1177
851
  * 检验是否符合顺序投料的顺序要求
1178
852
  * @param row 当前编辑的行
@@ -1183,21 +857,168 @@ class BomEntriesValidator {
1183
857
  if (!this.enableSequenceLoading) {
1184
858
  return;
1185
859
  }
1186
- const util = row ? this.findUtilByProductId(row.product_id_) : void 0;
1187
- for (const item of this.bomEntryValidators) {
1188
- if (item === util) {
1189
- break;
1190
- } else {
1191
- await item.validateHasCompleted(arr);
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
+ /** 表中是否已有该 BOM 组(有物料行或带 bom_entry_id_ 的空行) */
867
+ groupExistsInTable(arr, util) {
868
+ return arr.some((row) => isRowInBomGroup(row, util));
869
+ }
870
+ /**
871
+ * 按 BOM 顺序计算 target 组应插入的下标:
872
+ * 插到表中「第一个 BOM 下标更大的组」之前;没有则表末。
873
+ */
874
+ resolveBomOrderInsertIndex(arr, target) {
875
+ const targetIdx = this.bomEntryValidators.indexOf(target);
876
+ if (targetIdx < 0) return arr.length;
877
+ for (let i = 0; i < arr.length; i++) {
878
+ const row = arr[i];
879
+ if (row.deleted_) continue;
880
+ const idx = this.resolveEntryIndex(row);
881
+ if (idx > targetIdx) return i;
882
+ }
883
+ return arr.length;
884
+ }
885
+ /**
886
+ * 组装扫码填充计划:切组/建组标记 + 相对 arr 的下标。
887
+ * needInsert 时优先填 groupInsertIndex 占位行,勿再直接用 member/append 下标(会错位)。
888
+ */
889
+ buildScanFillPlan(arr, current, target) {
890
+ const memberIndexes = [];
891
+ const emptyProductIndexes = [];
892
+ const emptyLotIndexes = [];
893
+ const byLot = target.bomEntry.type_ === "by_lot";
894
+ let currentLast = -1;
895
+ arr.forEach((row, idx) => {
896
+ if (isRowInBomGroup(row, current)) currentLast = idx;
897
+ if (!isRowInBomGroup(row, target)) return;
898
+ if (!row.product_id_) {
899
+ emptyProductIndexes.push(idx);
900
+ return;
1192
901
  }
902
+ memberIndexes.push(idx);
903
+ if (byLot && !row.material_no_) emptyLotIndexes.push(idx);
904
+ });
905
+ const needInsert = !this.groupExistsInTable(arr, target);
906
+ const last2 = memberIndexes[memberIndexes.length - 1];
907
+ let groupInsertIndex = -1;
908
+ if (needInsert) {
909
+ groupInsertIndex = current !== target && currentLast >= 0 ? currentLast + 1 : this.resolveBomOrderInsertIndex(arr, target);
1193
910
  }
911
+ return {
912
+ target,
913
+ current,
914
+ needSwitch: current !== target,
915
+ needInsert,
916
+ groupInsertIndex,
917
+ memberIndexes,
918
+ emptyProductIndexes,
919
+ emptyLotIndexes,
920
+ appendIndex: last2 !== void 0 ? last2 + 1 : arr.length
921
+ };
922
+ }
923
+ /**
924
+ * 通用校验 2:物料是否允许写入目标组(不改动原 validateSubstitute)
925
+ */
926
+ assertGroupSubstitute(util, productId, arr) {
927
+ const entry = util.bomEntry;
928
+ if (entry.type_ === "view" || !entry.substitute_material_enabled_) {
929
+ if (productId !== entry.product_id_) {
930
+ throw new Error("匹配不到对应物料,请按规则上料或新增物料");
931
+ }
932
+ return;
933
+ }
934
+ if (!util.productIds.includes(productId)) {
935
+ throw new Error("匹配不到对应物料,请按规则上料或新增物料");
936
+ }
937
+ util.validateSubstitute([
938
+ ...arr,
939
+ { product_id_: productId, is_confirmed_: false, expiration_date_: "" }
940
+ ]);
941
+ }
942
+ /**
943
+ * 扫码定位目标组 + 通用校验 2,返回填充计划(切组/建组/下标)。
944
+ * 不改表数据。
945
+ */
946
+ validateSequenceScan(row, arr) {
947
+ const productId = row.product_id_;
948
+ const finish = (current2, target) => {
949
+ this.assertGroupSubstitute(target, productId, arr);
950
+ return this.buildScanFillPlan(arr, current2, target);
951
+ };
952
+ if (!this.enableSequenceLoading) {
953
+ const target = this.findUtilByProductId(productId);
954
+ if (!target) throw new Error("匹配不到对应物料,请按规则上料或新增物料");
955
+ return finish(target, target);
956
+ }
957
+ const current = this.findSequenceBomEntry(arr);
958
+ if (!current) {
959
+ const target = this.findUtilByProductId(productId);
960
+ if (!target) throw new Error("匹配不到对应物料,请按规则上料或新增物料");
961
+ if (this.groupExistsInTable(arr, target)) {
962
+ throw new Error("请勿重复上料");
963
+ }
964
+ return finish(target, target);
965
+ }
966
+ if (current.productIds.includes(productId)) return finish(current, current);
967
+ const currentIdx = this.bomEntryValidators.indexOf(current);
968
+ for (let i = 0; i < currentIdx; i++) {
969
+ const prev = this.bomEntryValidators[i];
970
+ if (!prev.productIds.includes(productId)) continue;
971
+ throw new Error(this.groupExistsInTable(arr, prev) ? "请勿重复上料" : $t("请按顺序上料"));
972
+ }
973
+ for (let i = currentIdx + 1; i < this.bomEntryValidators.length; i++) {
974
+ const next = this.bomEntryValidators[i];
975
+ const exists = this.groupExistsInTable(arr, next);
976
+ const optional = !next.bomEntry.force_loading_enabled_;
977
+ const hit = next.productIds.includes(productId);
978
+ if (optional && !exists) {
979
+ if (hit) return finish(current, next);
980
+ continue;
981
+ }
982
+ if (!hit) throw new Error($t("请按顺序上料"));
983
+ return finish(current, next);
984
+ }
985
+ throw new Error($t("请按顺序上料"));
986
+ }
987
+ /**
988
+ * 单组整组校验(提交编辑态组 / 切组前复用)
989
+ */
990
+ async validateGroup(arr, util) {
991
+ const rows = arr.filter(
992
+ (r) => !r.deleted_ && r.product_id_ && (util.productIds.includes(r.product_id_) || r.bom_entry_id_ === util.bomEntry.id_)
993
+ );
994
+ if (!rows.length) throw new Error($t("sys.edhr.mcTable.materialEmptyError"));
995
+ rows.forEach((row) => {
996
+ 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
+ });
1003
+ util.validateSubstitute(arr);
1004
+ util.validateLotMixing(arr);
1005
+ util.validateSpecifiedMaterialNoForGroup(arr);
1006
+ const orderIndex = this.resolveGroupOrderIndexByUtil(util, arr);
1007
+ const groupNo = orderIndex >= 0 ? orderIndex + 1 : void 0;
1008
+ await util.validateGroupQty(arr, this.enableSequenceLoading, groupNo);
1009
+ }
1010
+ /**
1011
+ * 切组前校验当前编辑组:BOM 内 + 必填、有效期、替代料、混批、数量校验
1012
+ */
1013
+ async validateCurrentGroupForSwitch(arr, current) {
1014
+ await this.validateGroup(arr, current);
1194
1015
  }
1195
1016
  /**
1196
1017
  * 校验物料是否在bom里被使用
1197
1018
  * @param row 单行的数据
1198
1019
  */
1199
1020
  validateInBom(row) {
1200
- if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD) {
1021
+ if (this.noBomMode) {
1201
1022
  return;
1202
1023
  }
1203
1024
  if (!row.product_id_) {
@@ -1205,12 +1026,7 @@ class BomEntriesValidator {
1205
1026
  }
1206
1027
  const util = this.findUtilByProductId(row.product_id_);
1207
1028
  if (!util) {
1208
- const name = row.product_id__lb_ ? JSON.parse(row.product_id__lb_).join(",") : "";
1209
- throw new Error(
1210
- $t("sys.edhr.mcTable.productNotDefine", {
1211
- product: name
1212
- })
1213
- );
1029
+ throw new Error($t("匹配不到对应物料,请按规则上料或新增物料"));
1214
1030
  }
1215
1031
  }
1216
1032
  /**
@@ -1257,6 +1073,13 @@ class BomEntriesValidator {
1257
1073
  i.validateLotMixing(arr);
1258
1074
  });
1259
1075
  }
1076
+ /**
1077
+ * 通用校验 3(扫码/写入前):用 row + 表内同行组数据对比混批次数,不改动原 validateLotMixing
1078
+ */
1079
+ validateLotMixingWithRow(row, arr) {
1080
+ const util = this.findUtilByProductId(row.product_id_);
1081
+ util?.validateLotMixingWithRow(row, arr);
1082
+ }
1260
1083
  /**
1261
1084
  * 校验数量
1262
1085
  * @param arr
@@ -1293,15 +1116,26 @@ class BomEntriesValidator {
1293
1116
  }
1294
1117
  }
1295
1118
  /**
1296
- * 检查扫描数据是否可以插入
1119
+ * 检查扫描数据是否可以插入,通过后返回填充计划(记录模式无 plan)
1120
+ */
1121
+ async validateScanCanInsert(row, arr) {
1122
+ if (this.noBomMode) {
1123
+ return;
1124
+ }
1125
+ this.validateInBom(row);
1126
+ const plan = this.validateSequenceScan(row, arr);
1127
+ plan.target.validateSpecifiedMaterialNo(row);
1128
+ plan.target.validateLotMixingWithRow(row, arr);
1129
+ return plan;
1130
+ }
1131
+ /**
1132
+ * 校验当前编辑行的数据
1297
1133
  * @param arr
1134
+ * @returns
1298
1135
  */
1299
- async validateScanCanInsert(arr) {
1136
+ async validateEditRow(arr) {
1300
1137
  const editRow = arr.find((i) => !i.is_confirmed_);
1301
- if (!editRow) {
1302
- throw new Error($t("sys.edhr.mcTable.noEditingRow"));
1303
- }
1304
- if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD) {
1138
+ if (!editRow || this.noBomMode) {
1305
1139
  return;
1306
1140
  }
1307
1141
  this.validateInBom(editRow);
@@ -1309,6 +1143,45 @@ class BomEntriesValidator {
1309
1143
  this.validateSubstitute(arr);
1310
1144
  this.validateLotMixing(arr);
1311
1145
  }
1146
+ /**
1147
+ * 顺序上料提交:表中最后一组之前,必须上料组不能缺失(仅结构/顺序,不校验数量)
1148
+ */
1149
+ assertSubmitSequenceOrder(arr) {
1150
+ const lastPresentIdx = this.bomEntryValidators.reduce(
1151
+ (max, util, i) => this.groupExistsInTable(arr, util) ? i : max,
1152
+ -1
1153
+ );
1154
+ if (lastPresentIdx < 0) {
1155
+ return;
1156
+ }
1157
+ for (let i = 0; i <= lastPresentIdx; i++) {
1158
+ const util = this.bomEntryValidators[i];
1159
+ if (util.bomEntry.force_loading_enabled_ && !this.groupExistsInTable(arr, util)) {
1160
+ throw new Error(`物料${util.bomEntry.product_code_}为必须上料,请完成该组上料`);
1161
+ }
1162
+ }
1163
+ }
1164
+ /**
1165
+ * 提交整表校验:必须上料组须存在;顺序上料校验组序;表中存在的组走整组校验(不含库存)
1166
+ */
1167
+ async validateAllRows(arr) {
1168
+ if (this.noBomMode) {
1169
+ return;
1170
+ }
1171
+ for (const util of this.bomEntryValidators) {
1172
+ if (util.bomEntry.force_loading_enabled_ && !this.groupExistsInTable(arr, util)) {
1173
+ throw new Error(`物料${util.bomEntry.product_code_}为必须上料,请完成该组上料`);
1174
+ }
1175
+ }
1176
+ if (this.enableSequenceLoading) {
1177
+ this.assertSubmitSequenceOrder(arr);
1178
+ }
1179
+ for (const util of this.bomEntryValidators) {
1180
+ if (this.groupExistsInTable(arr, util)) {
1181
+ await this.validateGroup(arr, util);
1182
+ }
1183
+ }
1184
+ }
1312
1185
  /**
1313
1186
  * 把扫描数据按情况插入到数组的位置,返回新数组
1314
1187
  * @param row
@@ -1360,7 +1233,317 @@ class BomEntriesValidator {
1360
1233
  return Array.from(result).map((i) => i.split(":").pop());
1361
1234
  }
1362
1235
  }
1363
- const calculate$1 = (...args) => window.NocodeAdapter.utils?.formulaCalculate?.(...args);
1236
+ function isRowInBomGroup(row, util) {
1237
+ return util.isRowInGroup(row);
1238
+ }
1239
+ function setGroupEditState(table, util, editing) {
1240
+ table.forEach((r) => {
1241
+ if (isRowInBomGroup(r, util)) {
1242
+ r.is_confirmed_ = !editing;
1243
+ }
1244
+ });
1245
+ }
1246
+ var ScanParamType = /* @__PURE__ */ ((ScanParamType2) => {
1247
+ ScanParamType2["Lot"] = "lot";
1248
+ ScanParamType2["UniqueCode"] = "uniqueCode";
1249
+ return ScanParamType2;
1250
+ })(ScanParamType || {});
1251
+ var RequiredQtyCalcRule = /* @__PURE__ */ ((RequiredQtyCalcRule2) => {
1252
+ RequiredQtyCalcRule2["LotQty"] = "lotQty";
1253
+ RequiredQtyCalcRule2["ProductQty"] = "productQty";
1254
+ return RequiredQtyCalcRule2;
1255
+ })(RequiredQtyCalcRule || {});
1256
+ async function applyScanFillPlan(arr, scanRow, plan, options) {
1257
+ const table = cloneDeep(arr);
1258
+ if (!plan) {
1259
+ fillNoBomRow(table, scanRow);
1260
+ return table;
1261
+ }
1262
+ if (plan.needSwitch) {
1263
+ await options?.validateCurrentGroupForSwitch?.(table, plan.current);
1264
+ }
1265
+ const fillAt = plan.needInsert ? insertEmptyGroupRow(table, plan) : void 0;
1266
+ if (plan.needSwitch) {
1267
+ applyGroupEditState(table, plan);
1268
+ }
1269
+ fillTargetGroup(table, scanRow, plan, fillAt);
1270
+ return table;
1271
+ }
1272
+ function writeScanFields(target, scanRow, bomEntryId) {
1273
+ const targetRec = target;
1274
+ const frontKey = targetRec[FRONT_ROW_KEY];
1275
+ const id_ = targetRec.id_;
1276
+ Object.assign(target, cloneDeep(scanRow));
1277
+ if (frontKey != null && String(frontKey).trim() !== "") {
1278
+ targetRec[FRONT_ROW_KEY] = frontKey;
1279
+ }
1280
+ if (id_ != null) {
1281
+ targetRec.id_ = id_;
1282
+ }
1283
+ if (bomEntryId) target.bom_entry_id_ = bomEntryId;
1284
+ target.is_confirmed_ = false;
1285
+ }
1286
+ function fillNoBomRow(table, scanRow) {
1287
+ const emptyIdx = table.findIndex((r) => !r.deleted_ && !r.product_id_);
1288
+ if (emptyIdx >= 0) {
1289
+ writeScanFields(table[emptyIdx], scanRow);
1290
+ return;
1291
+ }
1292
+ const row = { is_confirmed_: false, expiration_date_: "" };
1293
+ ensureFrontRowKey(row);
1294
+ writeScanFields(row, scanRow);
1295
+ table.push(row);
1296
+ }
1297
+ function insertEmptyGroupRow(table, plan) {
1298
+ const empty = {
1299
+ bom_entry_id_: plan.target.bomEntry.id_,
1300
+ is_confirmed_: false,
1301
+ expiration_date_: ""
1302
+ };
1303
+ ensureFrontRowKey(empty);
1304
+ table.splice(plan.groupInsertIndex, 0, empty);
1305
+ return plan.groupInsertIndex;
1306
+ }
1307
+ function applyGroupEditState(table, plan) {
1308
+ setGroupEditState(table, plan.current, false);
1309
+ setGroupEditState(table, plan.target, true);
1310
+ }
1311
+ function fillTargetGroup(table, scanRow, plan, fillAt) {
1312
+ const bomId = plan.target.bomEntry.id_;
1313
+ if (fillAt !== void 0) {
1314
+ writeScanFields(table[fillAt], scanRow, bomId);
1315
+ return;
1316
+ }
1317
+ if (plan.emptyProductIndexes.length) {
1318
+ writeScanFields(table[plan.emptyProductIndexes[0]], scanRow, bomId);
1319
+ return;
1320
+ }
1321
+ const action = resolveInGroupFill(scanRow, table, plan);
1322
+ if (action.type === "fill") {
1323
+ writeScanFields(table[action.index], scanRow, bomId);
1324
+ return;
1325
+ }
1326
+ const nr = { is_confirmed_: false, expiration_date_: "" };
1327
+ ensureFrontRowKey(nr);
1328
+ writeScanFields(nr, scanRow, bomId);
1329
+ table.splice(plan.appendIndex, 0, nr);
1330
+ }
1331
+ function resolveInGroupFill(scanRow, table, plan) {
1332
+ const { type_ } = plan.target.bomEntry;
1333
+ const sameIndexes = plan.memberIndexes.filter(
1334
+ (i) => table[i]?.product_id_ === scanRow.product_id_
1335
+ );
1336
+ if (sameIndexes.length) {
1337
+ if (type_ === "view") return { type: "append" };
1338
+ const emptyKey = type_ === "by_lot" ? "material_no_" : type_ === "by_number" ? "qty_" : null;
1339
+ if (emptyKey) {
1340
+ const fillIdx = sameIndexes.find((i) => !table[i]?.[emptyKey]);
1341
+ return fillIdx !== void 0 ? { type: "fill", index: fillIdx } : { type: "append" };
1342
+ }
1343
+ }
1344
+ const hasOtherProduct = plan.memberIndexes.some((i) => {
1345
+ const id = table[i]?.product_id_;
1346
+ return id && id !== scanRow.product_id_;
1347
+ });
1348
+ if (hasOtherProduct) return { type: "append" };
1349
+ throw new Error("匹配不到对应物料,请按规则上料或新增物料");
1350
+ }
1351
+ const EMPTY_PRODUCT_VERSION_ID = "__mc_no_selectable_product__";
1352
+ const EMPTY_LOT_NAME = "__mc_no_selectable_lot__";
1353
+ function isEmptyProductQuery(query) {
1354
+ const ids = query?.["id_.in"];
1355
+ return ids?.length === 1 && ids[0] === EMPTY_PRODUCT_VERSION_ID;
1356
+ }
1357
+ function buildProductIdQuery(options) {
1358
+ const { skipFilter, validator, tableData, row, rowIndex, enableSequenceLoading } = options;
1359
+ if (skipFilter) return void 0;
1360
+ const entryIdx = validator.resolveEntryIndex(row);
1361
+ if (entryIdx >= 0) {
1362
+ return toQuery(resolveGroupProductIds(validator, entryIdx, tableData));
1363
+ }
1364
+ if (enableSequenceLoading && rowIndex != null && rowIndex >= 0) {
1365
+ const indexes = resolveSequentialCandidateEntryIndexes(validator, tableData, rowIndex, row);
1366
+ if (indexes.length === 1) {
1367
+ return toQuery(resolveGroupProductIds(validator, indexes[0], tableData));
1368
+ }
1369
+ return toQuery(resolveUnassignedMaterialVersionIds(validator, tableData, row, rowIndex, true));
1370
+ }
1371
+ return toQuery(resolveUnassignedMaterialVersionIds(validator, tableData, row, void 0, false));
1372
+ }
1373
+ function buildMaterialNoQuery(options) {
1374
+ const { row, skipFilter, validator } = options;
1375
+ let baseQuery;
1376
+ if (row.product_id_) {
1377
+ baseQuery = {
1378
+ "product_id_.versionIn": [row.product_id_.split(":").pop()]
1379
+ };
1380
+ } else {
1381
+ const productQuery = buildProductIdQuery(options);
1382
+ if (!productQuery || isEmptyProductQuery(productQuery)) {
1383
+ baseQuery = { "product_id_.versionIn": [EMPTY_PRODUCT_VERSION_ID] };
1384
+ } else {
1385
+ const versionIds = productQuery["id_.in"].filter((id) => Boolean(id));
1386
+ baseQuery = { "product_id_.versionIn": versionIds };
1387
+ }
1388
+ }
1389
+ if (skipFilter) {
1390
+ return baseQuery;
1391
+ }
1392
+ const entryIdx = validator.resolveEntryIndex(row);
1393
+ if (entryIdx < 0) {
1394
+ return baseQuery;
1395
+ }
1396
+ const entry = validator.bomEntryValidators[entryIdx].bomEntry;
1397
+ if (!entry.specified_material_no_enabled_) {
1398
+ return baseQuery;
1399
+ }
1400
+ const names = (entry.specified_material_entries_ ?? []).map((e) => e.name_).filter(Boolean);
1401
+ return {
1402
+ ...baseQuery,
1403
+ "name_.in": names.length ? names : [EMPTY_LOT_NAME]
1404
+ };
1405
+ }
1406
+ function toVersionIds(ids) {
1407
+ return ids.map((id) => id.split(":").pop());
1408
+ }
1409
+ function toQuery(ids) {
1410
+ if (!ids.length) {
1411
+ return { "id_.in": [EMPTY_PRODUCT_VERSION_ID] };
1412
+ }
1413
+ return { "id_.in": toVersionIds(ids) };
1414
+ }
1415
+ function resolveKnownGroupEntryIndexes(validator, tableData, excludeRow) {
1416
+ const seen = /* @__PURE__ */ new Set();
1417
+ for (const tableRow of tableData) {
1418
+ if (tableRow.deleted_ || tableRow === excludeRow) continue;
1419
+ const idx = validator.resolveEntryIndex(tableRow);
1420
+ if (idx >= 0) seen.add(idx);
1421
+ }
1422
+ return Array.from(seen);
1423
+ }
1424
+ function resolveSequentialBounds(validator, tableData, rowIndex, excludeRow) {
1425
+ let prev = -1;
1426
+ let next = validator.bomEntryValidators.length;
1427
+ for (let i = rowIndex - 1; i >= 0; i--) {
1428
+ const tableRow = tableData[i];
1429
+ if (!tableRow || tableRow.deleted_ || tableRow === excludeRow) continue;
1430
+ const idx = validator.resolveEntryIndex(tableRow);
1431
+ if (idx >= 0) {
1432
+ prev = idx;
1433
+ break;
1434
+ }
1435
+ }
1436
+ for (let i = rowIndex + 1; i < tableData.length; i++) {
1437
+ const tableRow = tableData[i];
1438
+ if (!tableRow || tableRow.deleted_ || tableRow === excludeRow) continue;
1439
+ const idx = validator.resolveEntryIndex(tableRow);
1440
+ if (idx >= 0) {
1441
+ next = idx;
1442
+ break;
1443
+ }
1444
+ }
1445
+ return { prev, next };
1446
+ }
1447
+ function resolveSequentialCandidateEntryIndexes(validator, tableData, rowIndex, excludeRow) {
1448
+ const { prev, next } = resolveSequentialBounds(validator, tableData, rowIndex, excludeRow);
1449
+ const indexes = [];
1450
+ for (let i = prev + 1; i < next; i++) {
1451
+ indexes.push(i);
1452
+ }
1453
+ return indexes;
1454
+ }
1455
+ function resolveMaterialVersionIdsByEntryIndexes(validator, entryIndexes) {
1456
+ const result = /* @__PURE__ */ new Set();
1457
+ for (const idx of entryIndexes) {
1458
+ validator.bomEntryValidators[idx]?.productIds.forEach((id) => {
1459
+ result.add(id.split(":").pop());
1460
+ });
1461
+ }
1462
+ return Array.from(result);
1463
+ }
1464
+ function resolveGroupProductIds(validator, entryIdx, tableData) {
1465
+ const util = validator.bomEntryValidators[entryIdx];
1466
+ if (!util) return [];
1467
+ return util.getSelectableProductIds(tableData);
1468
+ }
1469
+ function resolveUnassignedMaterialVersionIds(validator, tableData, excludeRow, rowIndex, enableSequenceLoading = false) {
1470
+ const allIndexes = validator.bomEntryValidators.map((_, i) => i);
1471
+ const knownGroupIndexes = resolveKnownGroupEntryIndexes(validator, tableData, excludeRow);
1472
+ let candidateGroupIndexes;
1473
+ if (enableSequenceLoading && rowIndex != null && rowIndex >= 0) {
1474
+ const intervalIndexes = resolveSequentialCandidateEntryIndexes(
1475
+ validator,
1476
+ tableData,
1477
+ rowIndex,
1478
+ excludeRow
1479
+ );
1480
+ candidateGroupIndexes = intervalIndexes.filter((i) => !knownGroupIndexes.includes(i));
1481
+ } else {
1482
+ candidateGroupIndexes = allIndexes.filter((i) => !knownGroupIndexes.includes(i));
1483
+ }
1484
+ if (!candidateGroupIndexes.length) {
1485
+ return [];
1486
+ }
1487
+ return resolveMaterialVersionIdsByEntryIndexes(validator, candidateGroupIndexes);
1488
+ }
1489
+ const GROUP_MERGE_FIELDS = /* @__PURE__ */ new Set([
1490
+ "qty_required_",
1491
+ "qty_consumed_total_"
1492
+ ]);
1493
+ function isGroupMergeCell(tdInfo) {
1494
+ if (tdInfo.cellHidden || !tdInfo.cellWidget?.props) return false;
1495
+ const props = tdInfo.cellWidget.props;
1496
+ if (props.type === "serialnumber") return true;
1497
+ const field = props.field;
1498
+ return !!field && GROUP_MERGE_FIELDS.has(field);
1499
+ }
1500
+ function getGroupMergeKey(row, validator) {
1501
+ const entryIdx = validator.resolveEntryIndex(row);
1502
+ if (entryIdx >= 0) {
1503
+ return `bom:${validator.bomEntryValidators[entryIdx].bomEntry.id_}`;
1504
+ }
1505
+ if (row.bom_entry_id_) {
1506
+ return `bom:${row.bom_entry_id_}`;
1507
+ }
1508
+ return `row:${getRowId(row)}`;
1509
+ }
1510
+ function calcGroupRowSpans(rows, validator) {
1511
+ if (!rows.length) return [];
1512
+ const keys = rows.map((row) => getGroupMergeKey(row, validator));
1513
+ const spans = Array(rows.length).fill(1);
1514
+ for (let i = 0; i < keys.length; ) {
1515
+ let j = i + 1;
1516
+ while (j < keys.length && keys[j] === keys[i]) j++;
1517
+ const size = j - i;
1518
+ spans[i] = size;
1519
+ for (let k = i + 1; k < j; k++) {
1520
+ spans[k] = 0;
1521
+ }
1522
+ i = j;
1523
+ }
1524
+ return spans;
1525
+ }
1526
+ function calcGroupQtyConsumedTotal(entryIdx, tableData, validator) {
1527
+ if (entryIdx < 0) return 0;
1528
+ return tableData.reduce((sum, row) => {
1529
+ return validator.resolveEntryIndex(row) === entryIdx ? sum + (row.qty_ ?? 0) : sum;
1530
+ }, 0);
1531
+ }
1532
+ function syncGroupQtyConsumedTotals(tableData, validator) {
1533
+ const totals = /* @__PURE__ */ new Map();
1534
+ tableData.forEach((row) => {
1535
+ const entryIdx = validator.resolveEntryIndex(row);
1536
+ if (entryIdx < 0) {
1537
+ row.qty_consumed_total_ = void 0;
1538
+ return;
1539
+ }
1540
+ if (!totals.has(entryIdx)) {
1541
+ totals.set(entryIdx, calcGroupQtyConsumedTotal(entryIdx, tableData, validator));
1542
+ }
1543
+ row.qty_consumed_total_ = totals.get(entryIdx);
1544
+ });
1545
+ }
1546
+ const calculate = (...args) => window.NocodeAdapter.utils?.formulaCalculate?.(...args);
1364
1547
  class MCDataUtil {
1365
1548
  static allFields = [
1366
1549
  "product_id_",
@@ -1372,7 +1555,8 @@ class MCDataUtil {
1372
1555
  "expiration_date_",
1373
1556
  "qty_required_uom_id_",
1374
1557
  "qty_uom_id_",
1375
- "qty_transfer_"
1558
+ "qty_transfer_",
1559
+ "qty_consumed_total_"
1376
1560
  ];
1377
1561
  static editMCTable(row, data) {
1378
1562
  if (!row._MCTABLE) {
@@ -1434,10 +1618,10 @@ class MaterialConsumeTableController {
1434
1618
  this.bomEntriesValidator = new BomEntriesValidator(
1435
1619
  this.actualBomEntries,
1436
1620
  this.enableSequenceLoading,
1437
- this.materialNoNum,
1621
+ () => this.materialNoNum,
1438
1622
  this.tmplBomController.historyData,
1439
1623
  this.tmplBomController.materialNo,
1440
- this.mcPattern
1624
+ this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_
1441
1625
  );
1442
1626
  }
1443
1627
  tmplBomController;
@@ -1465,8 +1649,18 @@ class MaterialConsumeTableController {
1465
1649
  unitConversionRules = [];
1466
1650
  /** 主表 formState(由组件 setup 注入),用于读取主表字段值 */
1467
1651
  mainFormState = ref({});
1468
- /** 批次数量 */
1652
+ /** 表单数据状态(由组件 setup 注入):未填报 / STASH / SUBMIT */
1653
+ dataStatus;
1654
+ /** 表单是否已暂存或提交(已处理过则不再跑初始化) */
1655
+ get isDataProcessed() {
1656
+ return ["STASH", "SUBMIT"].includes(this.dataStatus ?? "");
1657
+ }
1658
+ /** 批次数量或生产数量 */
1469
1659
  get materialNoNum() {
1660
+ const { required_qty_calc_rule_, product_qty_field_ } = this.tmplBom;
1661
+ if (required_qty_calc_rule_ === RequiredQtyCalcRule.ProductQty) {
1662
+ return product_qty_field_ ? this.mainFormState.value[product_qty_field_] : 0;
1663
+ }
1470
1664
  return this.tmplBomController.materialNoNum;
1471
1665
  }
1472
1666
  /** 物料消耗模式(自身没有配置的话取环境的默认值) */
@@ -1565,25 +1759,51 @@ class MaterialConsumeTableController {
1565
1759
  * 根据bom明细构造子表数据(初始化时)
1566
1760
  */
1567
1761
  calcFormState() {
1568
- if (this.tmplBom.material_loading_model_enabled_) ;
1569
- else if (this.isPersonalBom || this.tmplBom.bom_init_enabled_) {
1570
- return this.tmplBom.entries_.map((i) => {
1762
+ if (this.tmplBom.bom_init_enabled_) {
1763
+ return this.actualBomEntries.map((i) => {
1571
1764
  return {
1572
1765
  product_id_: i.product_id_,
1573
- qty_required_: i.qty_required_ * this.materialNoNum
1574
- // routing_operation_id_: this.tmplBomController.operationId,
1766
+ qty_required_: i.qty_required_ * this.materialNoNum,
1767
+ bom_entry_id_: i.id_
1575
1768
  };
1576
1769
  });
1577
1770
  }
1578
1771
  }
1772
+ /**
1773
+ * 未填报时初始化消耗表行数据
1774
+ * @param defaultData 子表行默认值(含工序等)
1775
+ */
1776
+ initTableData(defaultData) {
1777
+ if (this.isDataProcessed) return;
1778
+ const rows = this.calcFormState();
1779
+ if (!rows?.length) return;
1780
+ const tableRows = transformUtils.transformSourceData2SubTable(
1781
+ rows,
1782
+ {},
1783
+ defaultData
1784
+ );
1785
+ tableRows.forEach((row, i) => {
1786
+ ensureFrontRowKey(row);
1787
+ if (i === 0) {
1788
+ MCDataUtil.setRowEditing(row, true);
1789
+ } else {
1790
+ MCDataUtil.setRowEditing(row, !this.enableSequenceLoading);
1791
+ }
1792
+ });
1793
+ this.actualTableData = tableRows;
1794
+ }
1579
1795
  /**
1580
1796
  * 根据数据计算需要禁用的字段
1581
1797
  * @param row
1582
1798
  * @return {*}
1583
1799
  */
1584
1800
  calcDisabledFields(row) {
1585
- const disabledKeys = ["qty_consumed_"];
1586
- const isRecordPattern = this.mcPattern === MaterialConsumptionPatternEnum.RECORD;
1801
+ const disabledKeys = [
1802
+ "qty_consumed_",
1803
+ "sort_num_",
1804
+ "qty_consumed_total_"
1805
+ ];
1806
+ const isRecordPattern = this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_;
1587
1807
  if (!isRecordPattern) {
1588
1808
  disabledKeys.push("qty_required_");
1589
1809
  }
@@ -1600,13 +1820,38 @@ class MaterialConsumeTableController {
1600
1820
  * @return {*}
1601
1821
  */
1602
1822
  getProductQuery() {
1603
- if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD) {
1823
+ if (this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_) {
1604
1824
  return void 0;
1605
1825
  }
1606
1826
  return {
1607
1827
  "id_.in": this.bomEntriesValidator.getAllMaterialIds()
1608
1828
  };
1609
1829
  }
1830
+ /**
1831
+ * 行级 product_id_ / material_no_ 查询共用入参
1832
+ */
1833
+ buildProductQueryOptions(row, rowIndex) {
1834
+ return {
1835
+ validator: this.bomEntriesValidator,
1836
+ tableData: this.actualTableData,
1837
+ row,
1838
+ rowIndex,
1839
+ enableSequenceLoading: this.enableSequenceLoading,
1840
+ skipFilter: this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_
1841
+ };
1842
+ }
1843
+ /**
1844
+ * 行级 product_id_ 下拉过滤(覆盖全局 id_.in)
1845
+ */
1846
+ getProductQueryForRow(row, rowIndex) {
1847
+ return buildProductIdQuery(this.buildProductQueryOptions(row, rowIndex));
1848
+ }
1849
+ /**
1850
+ * 行级 material_no_ 批次过滤:有物料按物料;无物料与 product_id_ 可选范围一致
1851
+ */
1852
+ getMaterialNoQueryForRow(row, rowIndex) {
1853
+ return buildMaterialNoQuery(this.buildProductQueryOptions(row, rowIndex));
1854
+ }
1610
1855
  /**
1611
1856
  * 是否是第一行且物料是空行
1612
1857
  * @return {*}
@@ -1614,17 +1859,32 @@ class MaterialConsumeTableController {
1614
1859
  isFirstBlankRow() {
1615
1860
  return this.actualTableData.length === 1 && !this.actualTableData[0].product_id_;
1616
1861
  }
1862
+ /**
1863
+ * 是否有正在编辑的组。
1864
+ * 一组可多行同时为编辑态;同时只能有一组处于编辑态。
1865
+ */
1866
+ hasEditingGroup(showMessage = true) {
1867
+ try {
1868
+ const hasEditing = this.bomEntriesValidator.hasEditingGroup(this.actualTableData);
1869
+ if (hasEditing && showMessage) {
1870
+ this.error($t("sys.edhr.mcTable.onlyOneEditingRow"));
1871
+ }
1872
+ return hasEditing;
1873
+ } catch (e) {
1874
+ if (showMessage && e?.message) {
1875
+ this.error(e.message);
1876
+ }
1877
+ return true;
1878
+ }
1879
+ }
1617
1880
  /**
1618
1881
  * 解析扫码的数据
1619
1882
  * 并判断是否能存入表中,返回对象则表示可以存入
1620
1883
  * @param str
1621
1884
  */
1622
- async parseScanStr(str) {
1623
- if (!this.isFirstBlankRow() && this.hasEditingRow()) {
1624
- return;
1625
- }
1626
- const isRecordPattern = this.mcPattern === MaterialConsumptionPatternEnum.RECORD;
1627
- const data = getParseRuleValue(str, this.scanRules);
1885
+ async parseScanStr(data, transformedData) {
1886
+ await this.bomEntriesValidator.hasEditingGroup(this.actualTableData);
1887
+ const isRecordPattern = this.mcPattern === MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_;
1628
1888
  console.log("parseScanStr", data);
1629
1889
  const arr = await materialCheck({
1630
1890
  material_no_: data.materialCode,
@@ -1633,54 +1893,50 @@ class MaterialConsumeTableController {
1633
1893
  validate_: data.expiration,
1634
1894
  // 记录模式传null,后台就不校验了
1635
1895
  bom_entries_: isRecordPattern ? null : this.actualBomEntries,
1636
- operation_id_: this.tmplBomController.operationId
1896
+ operation_id_: this.tmplBomController.operationId,
1897
+ unique_code_: data.uniqueCode,
1898
+ // 不开启条码解析时,参数配置的唯一码
1899
+ bar_code_enabled_: !this.tmplBom.disable_barcode_parsing_
1637
1900
  }) || (isRecordPattern ? [{ productionIdentificationName: data.lot }] : null);
1638
1901
  if (!arr) {
1639
- this.error($t("sys.edhr.mcTable.notInBom"));
1902
+ this.error("匹配不到对应物料,请按规则上料或新增物料");
1640
1903
  return;
1641
1904
  }
1642
1905
  let materialData = arr[0];
1643
- if (arr.length > 1 && !isRecordPattern) {
1644
- const ids = this.actualTableData.map((i) => i.product_id_);
1645
- const find = arr.find((j) => ids.includes(j.materialId));
1646
- if (!find) {
1647
- throw new Error($t("sys.edhr.mcTable.noMatchMaterial"));
1906
+ if (arr.length > 1) {
1907
+ const selected = await MaterialConsumeTableController.render.openMultiRowsModal({
1908
+ rows: arr
1909
+ });
1910
+ if (!selected) {
1911
+ return;
1648
1912
  }
1649
- materialData = find;
1913
+ materialData = selected;
1914
+ } else if (materialData?.productionIdentificationIsLocked) {
1915
+ const msg = await getLotLockedReason(materialData.productionIdentificationId);
1916
+ this.error(msg);
1917
+ return;
1650
1918
  }
1651
1919
  const row = {
1652
1920
  product_id_: materialData.materialId,
1653
1921
  material_no_: materialData.productionIdentificationName,
1654
1922
  qty_: data.qty,
1655
- is_confirmed_: false
1923
+ is_confirmed_: false,
1924
+ expiration_date_: data.expiration
1656
1925
  };
1657
1926
  if (isRecordPattern && !row.product_id_) {
1658
1927
  row._scanFallback = true;
1659
1928
  }
1660
- if (this.scanRuleProps?.fillMapArr?.length) {
1661
- const fillData = calcFillData(data, this.scanRuleProps.fillMapArr);
1662
- console.log("fillData", fillData);
1663
- Object.assign(row, fillData);
1664
- }
1665
- if (data.expiration) {
1666
- row.expiration_date_ = dayjs(data.expiration).format("YYYY-MM-DD");
1667
- }
1929
+ Object.assign(row, transformedData);
1668
1930
  this.setDefaultValue(row);
1669
1931
  try {
1670
- const newArr = this.bomEntriesValidator.mergeRowInArr(row, this.actualTableData);
1671
- await this.bomEntriesValidator.validateScanCanInsert(newArr);
1672
- if (this.isOnlyEmptyRow()) {
1673
- const firstRow = this.actualTableData[0];
1674
- defaults(row, firstRow);
1675
- }
1676
- this.tableDataRef.value = newArr;
1677
- const editingRow = this.actualTableData.find((i) => !i.is_confirmed_);
1678
- if (editingRow && row.product_id_) {
1679
- this.confirm(editingRow);
1680
- }
1932
+ const plan = await this.bomEntriesValidator.validateScanCanInsert(row, this.actualTableData);
1933
+ this.tableDataRef.value = await applyScanFillPlan(this.actualTableData, row, plan, {
1934
+ validateCurrentGroupForSwitch: (table, current) => this.bomEntriesValidator.validateCurrentGroupForSwitch(table, current)
1935
+ });
1936
+ this.updateDerivedQtyFields();
1681
1937
  } catch (e) {
1682
1938
  console.error(e);
1683
- if (e.message) {
1939
+ if (e?.message) {
1684
1940
  this.error(e.message);
1685
1941
  }
1686
1942
  }
@@ -1695,25 +1951,27 @@ class MaterialConsumeTableController {
1695
1951
  if (this.isScanOpen) {
1696
1952
  return;
1697
1953
  }
1698
- console.log("open-------", this);
1699
- if (!this.tmplBom.disable_barcode_parsing_ && !this.scanRuleInfo || this.tmplBom.disable_barcode_parsing_ && !this.scanParamType) {
1700
- this.error($t("sys.edhr.mcTable.scanRuleNotFound"));
1701
- return;
1702
- }
1703
1954
  const { title } = opts;
1704
1955
  this.isScanOpen = true;
1705
1956
  await MaterialConsumeTableController.render.openScanModal({
1706
1957
  title,
1707
1958
  subModelKey: this.widget.props.modelKey,
1708
1959
  formModelController: this.formModelController,
1709
- scanRules: this.scanRuleProps,
1710
- scanParam: this.scanParamType,
1711
- onScan: async ({ str }) => {
1712
- console.log("onScan", str);
1960
+ scanRules: !this.tmplBom.disable_barcode_parsing_ ? this.scanRuleProps : void 0,
1961
+ scanParam: this.tmplBom.disable_barcode_parsing_ ? this.scanParamType : void 0,
1962
+ onScan: async ({ str, parsedValue, transformedData }) => {
1963
+ console.log("onScan", str, parsedValue);
1713
1964
  if (!str) {
1714
1965
  return;
1715
1966
  }
1716
- await this.parseScanStr(str);
1967
+ try {
1968
+ await this.validateExpiration({ expiration_date_: parsedValue.expiration });
1969
+ await this.parseScanStr(parsedValue, transformedData);
1970
+ } catch (e) {
1971
+ if (e?.message) {
1972
+ this.error(e.message);
1973
+ }
1974
+ }
1717
1975
  }
1718
1976
  });
1719
1977
  this.isScanOpen = false;
@@ -1726,7 +1984,7 @@ class MaterialConsumeTableController {
1726
1984
  if (!this.actualBomEntries) {
1727
1985
  return;
1728
1986
  }
1729
- await MaterialConsumeTableController.render.openBomModal({
1987
+ await MaterialConsumeTableController.render?.openBomModal({
1730
1988
  bomList: this.actualBomEntries,
1731
1989
  onSubstitute: async () => {
1732
1990
  console.log("一键导入数据逻辑");
@@ -1743,22 +2001,41 @@ class MaterialConsumeTableController {
1743
2001
  this.formModelController = opts.formModelController;
1744
2002
  this.unitConversionRules = opts.unitConversionRules ?? [];
1745
2003
  this.mainFormState = opts.mainFormState ?? ref({});
1746
- console.log("setup", this.tableDataRef);
2004
+ this.dataStatus = opts.dataStatus;
2005
+ this.initTableData(opts.defaultRowData);
1747
2006
  if (this.actualTableData.length === 1) {
1748
2007
  const firstRow = this.actualTableData[0];
1749
2008
  if (!firstRow.product_id_) {
1750
2009
  MCDataUtil.setRowEditing(firstRow, true);
1751
2010
  }
1752
2011
  }
2012
+ watch(
2013
+ () => this.materialNoNum,
2014
+ () => this.syncQtyRequiredFromBom(),
2015
+ { immediate: true }
2016
+ );
1753
2017
  onUnmounted(() => {
1754
2018
  MaterialConsumeTableController.render.destroyAllModals();
1755
2019
  });
1756
2020
  }
2021
+ /**
2022
+ * 按当前 materialNoNum 回写各行 qty_required_(校验侧 total 已通过 getter 实时读取)
2023
+ */
2024
+ syncQtyRequiredFromBom() {
2025
+ this.actualTableData.forEach((row) => {
2026
+ if (!row.product_id_) return;
2027
+ const util = this.bomEntriesValidator.findUtilByProductId(row.product_id_);
2028
+ if (util) {
2029
+ row.qty_required_ = util.total;
2030
+ }
2031
+ });
2032
+ this.updateDerivedQtyFields();
2033
+ }
1757
2034
  /** 校验有效期 */
1758
2035
  validateExpiration(row) {
1759
2036
  if (row.expiration_date_) {
1760
2037
  if (dayjs(row.expiration_date_).endOf("day").isBefore(dayjs())) {
1761
- throw new Error($t("sys.edhr.mcTable.expirationError"));
2038
+ throw new Error($t("sys.expirationDateErrorTip"));
1762
2039
  }
1763
2040
  }
1764
2041
  }
@@ -1798,7 +2075,7 @@ class MaterialConsumeTableController {
1798
2075
  return acc;
1799
2076
  }, {});
1800
2077
  try {
1801
- const res = await calculate$1(formulaContent, formData);
2078
+ const res = await calculate(formulaContent, formData);
1802
2079
  Object.assign(row, {
1803
2080
  qty_transfer_: res,
1804
2081
  qty_transfer_uom_id_: targetUnitId,
@@ -1875,14 +2152,12 @@ class MaterialConsumeTableController {
1875
2152
  return;
1876
2153
  }
1877
2154
  let errorObj;
1878
- const hasEditing = this.hasEditingRow(false);
1879
- if (hasEditing) {
1880
- errorObj = this.calcErrorObj($t("sys.edhr.mcTable.hasEditingRow"));
1881
- }
1882
2155
  try {
1883
- this.bomEntriesValidator.validateSequenceLoading(void 0, this.actualTableData);
2156
+ if (this.mcPattern !== MaterialConsumptionPatternEnum.RECORD && !this.tmplBom.personal_bom_enabled_) {
2157
+ await this.bomEntriesValidator.validateAllRows(this.actualTableData);
2158
+ }
1884
2159
  } catch (e) {
1885
- if (e.message) {
2160
+ if (e?.message) {
1886
2161
  errorObj = this.calcErrorObj(e.message);
1887
2162
  }
1888
2163
  }
@@ -1900,19 +2175,36 @@ class MaterialConsumeTableController {
1900
2175
  return hasEditing;
1901
2176
  }
1902
2177
  /**
1903
- * 选中行开启编辑
2178
+ * 选中行开启编辑(顺序上料:校验当前编辑组后整组切换;非顺序上料:始终编辑态,无需操作)
1904
2179
  * @param row
1905
2180
  */
1906
- editRow(row) {
1907
- if (this.hasEditingRow()) {
2181
+ async editRow(row) {
2182
+ if (!this.enableSequenceLoading) {
2183
+ return;
2184
+ }
2185
+ const entryIdx = this.bomEntriesValidator.resolveEntryIndex(row);
2186
+ const targetUtil = entryIdx >= 0 ? this.bomEntriesValidator.bomEntryValidators[entryIdx] : void 0;
2187
+ if (!targetUtil) {
2188
+ MCDataUtil.setRowEditing(row, true);
1908
2189
  return;
1909
2190
  }
1910
- const isLast = this.actualTableData[this.actualTableData.length - 1] === row;
1911
- if (this.enableSequenceLoading && !isLast) {
1912
- this.error($t("sys.edhr.mcTable.onlyLastRowCanEdit"));
2191
+ const targetRows = this.actualTableData.filter((r) => isRowInBomGroup(r, targetUtil));
2192
+ if (targetRows.length && targetRows.every((r) => !r.is_confirmed_)) {
1913
2193
  return;
1914
2194
  }
1915
- MCDataUtil.setRowEditing(row, true);
2195
+ const current = this.bomEntriesValidator.findSequenceBomEntry(this.actualTableData);
2196
+ if (current && current !== targetUtil) {
2197
+ try {
2198
+ await this.bomEntriesValidator.validateCurrentGroupForSwitch(this.actualTableData, current);
2199
+ } catch (e) {
2200
+ if (e?.message) {
2201
+ this.error(e.message);
2202
+ }
2203
+ return;
2204
+ }
2205
+ setGroupEditState(this.actualTableData, current, false);
2206
+ }
2207
+ setGroupEditState(this.actualTableData, targetUtil, true);
1916
2208
  }
1917
2209
  /**
1918
2210
  * 更新整个数组的所有行的已消耗数量
@@ -1930,8 +2222,7 @@ class MaterialConsumeTableController {
1930
2222
  const beforeArr = this.actualTableData.slice(0, index + 1);
1931
2223
  if (util) {
1932
2224
  total += util.hasConsumed;
1933
- const filterGroupData = util.filterGroupData(beforeArr);
1934
- filterGroupData.forEach((i) => {
2225
+ util.filterGroupData(beforeArr).forEach((i) => {
1935
2226
  total += i.qty_ ?? 0;
1936
2227
  });
1937
2228
  row.qty_consumed_ = total;
@@ -1941,6 +2232,19 @@ class MaterialConsumeTableController {
1941
2232
  modifySingleRow(index);
1942
2233
  }
1943
2234
  }
2235
+ /**
2236
+ * 组级:更新 qty_consumed_total_(同组 qty_ 之和)
2237
+ */
2238
+ updateGroupQtyConsumedTotal() {
2239
+ syncGroupQtyConsumedTotals(this.actualTableData, this.bomEntriesValidator);
2240
+ }
2241
+ /**
2242
+ * qty 相关派生字段统一入口(改 qty_ / 扫码 / 删行 等都走这里)
2243
+ */
2244
+ updateDerivedQtyFields() {
2245
+ this.updateRowConsumed();
2246
+ this.updateGroupQtyConsumedTotal();
2247
+ }
1944
2248
  /**
1945
2249
  * 设置默认值,如工序,需求数量/已消耗数量
1946
2250
  * @param row
@@ -1962,7 +2266,7 @@ class MaterialConsumeTableController {
1962
2266
  * 统一处理表格内部的字段的值变更
1963
2267
  * @param opts
1964
2268
  */
1965
- handleChange(opts) {
2269
+ async handleChange(opts) {
1966
2270
  const { field, row, value, option } = opts;
1967
2271
  console.log("handleChange", opts);
1968
2272
  if (field === "product_id_") {
@@ -1975,11 +2279,18 @@ class MaterialConsumeTableController {
1975
2279
  row.qty_required_ = void 0;
1976
2280
  this.setDefaultValue(row);
1977
2281
  } else if (field === "material_no_") {
2282
+ if (option?.is_locked_) {
2283
+ row.material_no_ = void 0;
2284
+ row.material_no__id_ = void 0;
2285
+ const msg = await getLotLockedReason(option.id_);
2286
+ this.error(msg);
2287
+ return;
2288
+ }
1978
2289
  row.product_id_ = option.product_id_;
1979
2290
  row.expiration_date_ = option.validate_;
1980
2291
  this.setDefaultValue(row);
1981
2292
  } else if (field === "qty_") {
1982
- this.updateRowConsumed();
2293
+ this.updateDerivedQtyFields();
1983
2294
  }
1984
2295
  }
1985
2296
  }
@@ -2034,6 +2345,7 @@ var SubTableActionEnum = /* @__PURE__ */ ((SubTableActionEnum2) => {
2034
2345
  SubTableActionEnum2["VIEW_BOM"] = "VIEW_BOM";
2035
2346
  SubTableActionEnum2["CHANGE_PARSE_RULE"] = "CHANGE_PARSE_RULE";
2036
2347
  SubTableActionEnum2["RowEdit"] = "rowEdit";
2348
+ SubTableActionEnum2["Insert1GroupAfter"] = "insert1GroupAfter";
2037
2349
  return SubTableActionEnum2;
2038
2350
  })(SubTableActionEnum || {});
2039
2351
  var SubTableActionMenuTypeEnum = /* @__PURE__ */ ((SubTableActionMenuTypeEnum2) => {
@@ -2081,6 +2393,12 @@ function getMenuByAction(type) {
2081
2393
  label: "加一行",
2082
2394
  icon: "icon-jiayihang"
2083
2395
  },
2396
+ [SubTableActionEnum.Insert1GroupAfter]: {
2397
+ type: SubTableActionMenuTypeEnum.ACTION,
2398
+ key: SubTableActionEnum.Insert1GroupAfter,
2399
+ label: "加一组",
2400
+ icon: "icon-jiayihang"
2401
+ },
2084
2402
  [SubTableActionEnum.CopyRowAfter]: {
2085
2403
  type: SubTableActionMenuTypeEnum.ACTION,
2086
2404
  key: SubTableActionEnum.CopyRowAfter,
@@ -2532,161 +2850,8 @@ class SubTableCore {
2532
2850
  console.log(this.ctx.widget.props.tableTitle, "处理表单按钮点击事件", params);
2533
2851
  }
2534
2852
  }
2535
- const identify = (...args) => window.NocodeAdapter.utils?.formulaIdentify?.(...args) ?? [];
2536
- const calculate = (...args) => window.NocodeAdapter.utils?.formulaCalculate?.(...args);
2537
- function useDependency(widget, props) {
2538
- const { field, isFieldModel, fieldLink, subModelKey, newSpecificConfig } = widget.props;
2539
- const fieldWidget = ref(subModelKey ? cloneDeep(props.widget) : props.widget);
2540
- watch(
2541
- () => props.widget.props,
2542
- (newProps) => {
2543
- Object.assign(fieldWidget.value.props, newProps);
2544
- }
2545
- );
2546
- const { currentPageFormState } = useCurrentPageFormState();
2547
- const targetFieldId = field ? isFieldModel ? fieldLink : field : "";
2548
- const configDependency = widget.props.componentDependency?.configDependency || {};
2549
- const readonly_expression = configDependency[Dependency_ENUM.READONLY]?.expression;
2550
- const readonly_value = configDependency[Dependency_ENUM.READONLY]?.value;
2551
- if (readonly_value && readonly_expression) {
2552
- insetDep(
2553
- {
2554
- expression: readonly_expression,
2555
- formState: currentPageFormState.value
2556
- },
2557
- (res) => {
2558
- fieldWidget.value.props.field_readonly = !!res;
2559
- }
2560
- );
2561
- }
2562
- const field_required = widget.props?.newSpecificConfig?.newRequired;
2563
- const required_expression = configDependency[Dependency_ENUM.REQUIRED]?.expression;
2564
- const required_value = configDependency[Dependency_ENUM.REQUIRED]?.value;
2565
- if (!field_required && required_value && required_expression) {
2566
- insetDep(
2567
- {
2568
- expression: required_expression,
2569
- formState: currentPageFormState.value
2570
- },
2571
- (res) => {
2572
- fieldWidget.value.props.required = !!res;
2573
- }
2574
- );
2575
- }
2576
- if (field_required) {
2577
- fieldWidget.value.props.required = true;
2578
- }
2579
- const field_disabled = widget.props.disabled;
2580
- const disabled_expression = configDependency[Dependency_ENUM.DISABLED]?.expression;
2581
- const disabled_value = configDependency[Dependency_ENUM.DISABLED]?.value;
2582
- if (!field_disabled && disabled_value && disabled_expression) {
2583
- insetDep(
2584
- {
2585
- expression: disabled_expression,
2586
- formState: currentPageFormState.value
2587
- },
2588
- (res) => {
2589
- fieldWidget.value.props.disabled = !!res;
2590
- }
2591
- );
2592
- }
2593
- const assignment_expression = configDependency[Dependency_ENUM.ASSIGNMENT]?.expression;
2594
- const strategy = configDependency[Dependency_ENUM.ASSIGNMENT]?.strategy;
2595
- if (assignment_expression) {
2596
- insetDep(
2597
- {
2598
- expression: assignment_expression,
2599
- formState: currentPageFormState.value
2600
- },
2601
- (res) => {
2602
- const formattedValue = formatDateCompliance(res, newSpecificConfig?.mappingType);
2603
- props.formData[field] = formattedValue;
2604
- }
2605
- );
2606
- }
2607
- if (!props.formData._OPCT) {
2608
- props.formData._OPCT = { _DICT: {} };
2609
- }
2610
- const formRowData = toRef(() => {
2611
- if (isFieldModel) {
2612
- return props.formData._OPCT;
2613
- }
2614
- return props.formData;
2615
- });
2616
- const value = computed({
2617
- get() {
2618
- if (targetFieldId) {
2619
- return formRowData.value[targetFieldId];
2620
- }
2621
- return "";
2622
- },
2623
- set(val) {
2624
- if (targetFieldId && !!assignment_expression && strategy === ASSIGNMENTSTRATEGY_ENUM.alwaysCover)
2625
- return;
2626
- formRowData.value[targetFieldId] = val;
2627
- }
2628
- });
2629
- function insetDep({ expression, formState }, callback) {
2630
- if (!expression || expression === "true") {
2631
- callback(true);
2632
- return;
2633
- }
2634
- const identifyArgs = identify(expression);
2635
- const cacheFormFields = computed(() => {
2636
- return identifyArgs.reduce((total, i) => {
2637
- const value2 = i.startsWith("_.") ? props.formData[i.slice(2)] : formState[i];
2638
- total[i] = value2;
2639
- return total;
2640
- }, {});
2641
- });
2642
- watchDebounced(
2643
- cacheFormFields,
2644
- () => {
2645
- calculate(expression, cacheFormFields.value).then(callback);
2646
- },
2647
- {
2648
- debounce: 200,
2649
- immediate: true,
2650
- deep: true
2651
- }
2652
- );
2653
- }
2654
- return { value, formRowData, targetFieldId, fieldWidget };
2655
- }
2656
- function formatDateCompliance(value, fieldTypeVal) {
2657
- if (!value) {
2658
- return value === 0 || value === false ? value : null;
2659
- }
2660
- const valueStr = String(value).trim();
2661
- if (fieldTypeVal === FIELD_TYPE.DATE) {
2662
- const dateMatch = valueStr.match(/^(\d{4}-\d{2}-\d{2})/);
2663
- if (!dateMatch) {
2664
- return "";
2665
- }
2666
- return dateMatch[1];
2667
- }
2668
- if (fieldTypeVal === FIELD_TYPE.DATE_TIME) {
2669
- if (/^\d{4}-\d{2}-\d{2}$/.test(valueStr)) {
2670
- return `${valueStr} 00:00:00`;
2671
- }
2672
- if (/^\d{4}-\d{2}-\d{2}\s\d{1,2}:\d{2}:\d{2}$/.test(valueStr)) {
2673
- return valueStr;
2674
- }
2675
- if (/^\d{4}-\d{2}-\d{2}\s\d{1,2}:\d{2}$/.test(valueStr)) {
2676
- return `${valueStr}:00`;
2677
- }
2678
- return "";
2679
- }
2680
- if (fieldTypeVal === FIELD_TYPE.TIME) {
2681
- const timeMatch = valueStr.match(/(\d{1,2}:\d{2}(?::\d{2})?)/);
2682
- if (timeMatch) {
2683
- return timeMatch[1];
2684
- }
2685
- return "";
2686
- }
2687
- return value;
2688
- }
2689
2853
  class DeviceLinkTmplUtil {
2854
+ static DEFAULT_RECOMMENDED_PROMPT = "任务:图片OCR文字提取\n规则:不虚构内容,找不到数据返回空,仅输出提取结果\n结果填充至${目标字段}\n填写提取规则:";
2690
2855
  /**
2691
2856
  * 创建模板数据
2692
2857
  * @param type
@@ -2699,8 +2864,19 @@ class DeviceLinkTmplUtil {
2699
2864
  };
2700
2865
  if (type === DeviceLink.TmplTypeEnum.AI_OCR) {
2701
2866
  Object.assign(tmpl, {
2867
+ name: "",
2868
+ deviceName: "",
2869
+ modelPrecision: void 0,
2870
+ enableAdvancedConfig: false,
2871
+ promptMode: "RECOMMENDED",
2872
+ recommendedPrompt: this.DEFAULT_RECOMMENDED_PROMPT,
2873
+ enableDenoise: false,
2874
+ enableContrast: false,
2875
+ enableBinarize: false,
2876
+ extraPrompt: "",
2702
2877
  identifyParams: [
2703
2878
  {
2879
+ id: uuid2(16),
2704
2880
  prompt: void 0,
2705
2881
  formField: void 0
2706
2882
  }
@@ -2711,6 +2887,30 @@ class DeviceLinkTmplUtil {
2711
2887
  }
2712
2888
  return tmpl;
2713
2889
  }
2890
+ /**
2891
+ * 补齐 OCR 模板新增字段,并保持历史配置的原有行为。
2892
+ * 历史模板没有提示词模式时按原来的普通模式处理。
2893
+ */
2894
+ static normalizeAIOcrTmpl(tmpl) {
2895
+ const hasAdvancedConfig = !!tmpl.enableDenoise || !!tmpl.enableContrast || !!tmpl.enableBinarize;
2896
+ const identifyParams = tmpl.identifyParams?.length ? tmpl.identifyParams : [{ prompt: void 0, formField: void 0 }];
2897
+ return {
2898
+ ...tmpl,
2899
+ name: tmpl.name ?? "",
2900
+ deviceName: tmpl.deviceName ?? "",
2901
+ enableAdvancedConfig: tmpl.enableAdvancedConfig ?? hasAdvancedConfig,
2902
+ promptMode: tmpl.promptMode ?? "NORMAL",
2903
+ recommendedPrompt: tmpl.recommendedPrompt ?? this.DEFAULT_RECOMMENDED_PROMPT,
2904
+ enableDenoise: tmpl.enableDenoise ?? false,
2905
+ enableContrast: tmpl.enableContrast ?? false,
2906
+ enableBinarize: tmpl.enableBinarize ?? false,
2907
+ extraPrompt: tmpl.extraPrompt ?? "",
2908
+ identifyParams: identifyParams.map((item) => ({
2909
+ ...item,
2910
+ id: item.id || uuid2(16)
2911
+ }))
2912
+ };
2913
+ }
2714
2914
  /**
2715
2915
  * 计算完整的提示词
2716
2916
  * @static
@@ -2718,13 +2918,20 @@ class DeviceLinkTmplUtil {
2718
2918
  * @return {*}
2719
2919
  */
2720
2920
  static calcEntirePrompt(tmpl) {
2721
- const paramsStr = tmpl.identifyParams?.map((item) => {
2722
- return `图中${item.prompt}绑定${item.formField?.split(".")[1]}字段`;
2723
- }).join(",");
2724
- const jsonObj = tmpl.identifyParams?.reduce((acc, cur) => {
2725
- acc[cur.formField?.split(".")[1]] = {
2726
- value: null
2727
- };
2921
+ if (tmpl.promptMode === "RECOMMENDED") {
2922
+ return tmpl.recommendedPrompt ?? this.DEFAULT_RECOMMENDED_PROMPT;
2923
+ }
2924
+ const validParams = (tmpl.identifyParams || []).map((item) => ({
2925
+ prompt: item.prompt?.trim(),
2926
+ fieldKey: item.formField?.split(".").at(-1)
2927
+ })).filter(
2928
+ (item) => Boolean(item.prompt && item.fieldKey)
2929
+ );
2930
+ const paramsStr = validParams.map((item) => `图中${item.prompt}绑定${item.fieldKey}字段`).join(",");
2931
+ const jsonObj = validParams.reduce((acc, item) => {
2932
+ if (!Object.prototype.hasOwnProperty.call(acc, item.fieldKey)) {
2933
+ acc[item.fieldKey] = { value: null };
2934
+ }
2728
2935
  return acc;
2729
2936
  }, {});
2730
2937
  const result = `这是一台${tmpl.deviceName ?? ""}设备/仪器图片,${paramsStr},请识别图片中的读数,以
@@ -2878,6 +3085,7 @@ class DeviceConnector {
2878
3085
  }
2879
3086
  }
2880
3087
  }
3088
+ const OCR_MODEL_PRECISION_ENUM_KEY = "enu_model_precision";
2881
3089
  class FormTmplConfigController {
2882
3090
  /** 为了方便挂载到 word 中去 */
2883
3091
  TmplUtil = DeviceLinkTmplUtil;
@@ -2891,7 +3099,8 @@ class FormTmplConfigController {
2891
3099
  tmpls: [],
2892
3100
  runningTmpls: [],
2893
3101
  IOTPermission: false,
2894
- OCRPermission: false
3102
+ OCRPermission: false,
3103
+ OCRModelPrecisionOptions: []
2895
3104
  });
2896
3105
  /** 表单模板id */
2897
3106
  tmplId = "";
@@ -2904,6 +3113,22 @@ class FormTmplConfigController {
2904
3113
  this.state.IOTPermission = await api.platform.license.getModuleAuth({ module: "IOT" }) || false;
2905
3114
  this.state.OCRPermission = await api.apaas.onlineFormTmpl.getIsOcrGranted() || false;
2906
3115
  }
3116
+ /**
3117
+ * 从枚举模型加载 OCR 模型精度,避免前端硬编码枚举值。
3118
+ */
3119
+ async refreshOcrModelPrecisionOptions() {
3120
+ try {
3121
+ const result = await api.apaas.designerCommon.getEnumModelFieldList({
3122
+ enumModelKey: OCR_MODEL_PRECISION_ENUM_KEY,
3123
+ pageNo: 1,
3124
+ pageSize: 100
3125
+ });
3126
+ this.state.OCRModelPrecisionOptions = (result?.records || []).filter((item) => item.text && item.value).map((item) => ({ label: item.text, value: item.value }));
3127
+ } catch {
3128
+ this.state.OCRModelPrecisionOptions = [];
3129
+ }
3130
+ return this.state.OCRModelPrecisionOptions;
3131
+ }
2907
3132
  /**
2908
3133
  * 初始化
2909
3134
  *
@@ -2925,7 +3150,12 @@ class FormTmplConfigController {
2925
3150
  setConfigStr(configStr) {
2926
3151
  console.log("配置信息", configStr);
2927
3152
  const config = configStr ? JSON.parse(configStr) : {};
2928
- this.state.tmpls = config.tmpls || [];
3153
+ this.state.tmpls = (config.tmpls || []).map((tmpl) => {
3154
+ if (tmpl.type === DeviceLink.TmplTypeEnum.AI_OCR) {
3155
+ return this.TmplUtil.normalizeAIOcrTmpl(tmpl);
3156
+ }
3157
+ return tmpl;
3158
+ });
2929
3159
  }
2930
3160
  getConfigStr() {
2931
3161
  const cloneTmpls = cloneDeep(this.state.tmpls);
@@ -3007,12 +3237,12 @@ function useFormTmplConfig() {
3007
3237
  injectController
3008
3238
  };
3009
3239
  }
3010
- const _hoisted_1$6 = ["data-merge", "data-fill-direction"];
3240
+ const _hoisted_1$5 = ["data-merge", "data-fill-direction"];
3011
3241
  const _hoisted_2$1 = {
3012
3242
  key: 0,
3013
3243
  class: "absolute z-9 top-1/2 right-0 w-0 h-0 -translate-y-4"
3014
3244
  };
3015
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3245
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3016
3246
  __name: "border-td",
3017
3247
  props: {
3018
3248
  border: {},
@@ -3078,24 +3308,24 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3078
3308
  _ctx.$slots.tableAction ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
3079
3309
  renderSlot(_ctx.$slots, "tableAction", {}, void 0, true)
3080
3310
  ])) : createCommentVNode("", true)
3081
- ], 16, _hoisted_1$6);
3311
+ ], 16, _hoisted_1$5);
3082
3312
  };
3083
3313
  }
3084
3314
  });
3085
- const BorderTD = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__scopeId", "data-v-5f774f44"]]);
3086
- const _sfc_main$7 = {};
3087
- const _hoisted_1$5 = { class: "nocode-loading" };
3315
+ const BorderTD = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-5f774f44"]]);
3316
+ const _sfc_main$6 = {};
3317
+ const _hoisted_1$4 = { class: "nocode-loading" };
3088
3318
  function _sfc_render(_ctx, _cache) {
3089
- return openBlock(), createElementBlock("div", _hoisted_1$5, [..._cache[0] || (_cache[0] = [
3319
+ return openBlock(), createElementBlock("div", _hoisted_1$4, [..._cache[0] || (_cache[0] = [
3090
3320
  createElementVNode("div", { class: "nocode-shape shape-1" }, null, -1),
3091
3321
  createElementVNode("div", { class: "nocode-shape shape-2" }, null, -1),
3092
3322
  createElementVNode("div", { class: "nocode-shape shape-3" }, null, -1),
3093
3323
  createElementVNode("div", { class: "nocode-shape shape-4" }, null, -1)
3094
3324
  ])]);
3095
3325
  }
3096
- const DocumentLoading = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["render", _sfc_render], ["__scopeId", "data-v-d8b64b7b"]]);
3326
+ const DocumentLoading = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render], ["__scopeId", "data-v-d8b64b7b"]]);
3097
3327
  const _imports_0 = "data:image/png;base64,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";
3098
- const _hoisted_1$4 = { class: "nocode-document-layout-wrapper" };
3328
+ const _hoisted_1$3 = { class: "nocode-document-layout-wrapper" };
3099
3329
  const _hoisted_2 = {
3100
3330
  key: 0,
3101
3331
  class: "nocode-common-loading-warp"
@@ -3109,7 +3339,7 @@ const _hoisted_4 = {
3109
3339
  class: "nocode-common-loading-warp"
3110
3340
  };
3111
3341
  const _hoisted_5 = { class: "w200px text-center color-[#666]" };
3112
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
3342
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
3113
3343
  __name: "document-layout",
3114
3344
  props: {
3115
3345
  loading: { type: Boolean },
@@ -3117,7 +3347,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
3117
3347
  },
3118
3348
  setup(__props) {
3119
3349
  return (_ctx, _cache) => {
3120
- return openBlock(), createElementBlock("div", _hoisted_1$4, [
3350
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [
3121
3351
  __props.loading ? (openBlock(), createElementBlock("div", _hoisted_2, [
3122
3352
  createVNode(DocumentLoading)
3123
3353
  ])) : __props.hasData ? (openBlock(), createElementBlock("div", _hoisted_3, [
@@ -3708,53 +3938,6 @@ var MaterialConsumeActionType = /* @__PURE__ */ ((MaterialConsumeActionType2) =>
3708
3938
  MaterialConsumeActionType2["CHANGE_PARSE_RULE"] = "CHANGE_PARSE_RULE";
3709
3939
  return MaterialConsumeActionType2;
3710
3940
  })(MaterialConsumeActionType || {});
3711
- const _hoisted_1$3 = {
3712
- key: 0,
3713
- class: "material-consume-action-bar"
3714
- };
3715
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
3716
- __name: "material-consume-action",
3717
- props: {
3718
- showBom: { type: Boolean, default: false },
3719
- showScanBtn: { type: Boolean, default: false },
3720
- showConfirmBtn: { type: Boolean, default: true },
3721
- rowData: {}
3722
- },
3723
- emits: ["doAction"],
3724
- setup(__props, { emit: __emit }) {
3725
- const props = __props;
3726
- const emit = __emit;
3727
- const isEditing = computed(() => {
3728
- return !props.rowData.is_confirmed_;
3729
- });
3730
- const AllMenus = Object.values(MaterialConsumeActionType).map((e) => ({
3731
- key: e,
3732
- label: $t(`sys.edhr.materialConsumeAction.${e}`)
3733
- }));
3734
- computed(() => {
3735
- return AllMenus.filter((e) => {
3736
- if (e.key === MaterialConsumeActionType.CONFIRM) {
3737
- return false;
3738
- }
3739
- return true;
3740
- });
3741
- });
3742
- const handleConfirm = () => {
3743
- emit("doAction", MaterialConsumeActionType.CONFIRM, props.rowData);
3744
- };
3745
- return (_ctx, _cache) => {
3746
- return __props.showConfirmBtn && isEditing.value ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
3747
- createElementVNode("div", {
3748
- class: "sub-table-btn btn-confirm",
3749
- onClick: handleConfirm
3750
- }, [..._cache[0] || (_cache[0] = [
3751
- createElementVNode("i", { class: "iconfont icon-tijiao1" }, null, -1)
3752
- ])])
3753
- ])) : createCommentVNode("", true);
3754
- };
3755
- }
3756
- });
3757
- const MaterialConsumeAction = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-18b5f02d"]]);
3758
3941
  const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3759
3942
  name: "NocodeMaterialConsumeTable",
3760
3943
  props: {
@@ -3808,6 +3991,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3808
3991
  const {
3809
3992
  currentPageFormState
3810
3993
  } = useCurrentPageFormState();
3994
+ const selfInfoList = inject(NCB_PROVIDE.FORM_INST_LIST, []);
3811
3995
  provide(NCB_PROVIDE.MATERIAL_CONSUME_TABLE_CONTROLLER, tableController);
3812
3996
  const {
3813
3997
  field = "",
@@ -3828,12 +4012,21 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3828
4012
  updateCalcCallback?.(dataRelationShip?.uniqueId);
3829
4013
  }
3830
4014
  });
4015
+ const currentSelfInfo = selfInfoList?.find((item) => item?.id === dataRelationShip?.key || item?.uniqueId === dataRelationShip?.uniqueId) ?? selfInfoList?.[0];
4016
+ const currentFieldDefaultData = computed(() => {
4017
+ return defaultDataMap?.[dataRelationShip?.uniqueId ?? ""] ?? {};
4018
+ });
3831
4019
  tableController.setup({
3832
4020
  tableDataRef: modelValue,
3833
4021
  widget: props.widget,
3834
4022
  formModelController,
3835
4023
  unitConversionRules,
3836
- mainFormState: currentPageFormState
4024
+ mainFormState: currentPageFormState,
4025
+ dataStatus: currentSelfInfo?.dataStatus,
4026
+ defaultRowData: renderUtils.getDefaultValueInfo({
4027
+ defaultDataMap: currentFieldDefaultData.value,
4028
+ key: field
4029
+ })
3837
4030
  });
3838
4031
  const dataInfo = computed(() => {
3839
4032
  const visibleToRealIndexMap = {};
@@ -3852,8 +4045,9 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3852
4045
  visibleToRealIndexMap
3853
4046
  };
3854
4047
  });
3855
- const currentFieldDefaultData = computed(() => {
3856
- return defaultDataMap?.[dataRelationShip?.uniqueId ?? ""] ?? {};
4048
+ const groupRowSpans = computed(() => {
4049
+ if (dynamicIds.length !== 1) return [];
4050
+ return calcGroupRowSpans(dataInfo.value.tableData, tableController.bomEntriesValidator);
3857
4051
  });
3858
4052
  const isFormChange = computed(() => {
3859
4053
  return dataRelationShip?.formChangeStatus;
@@ -3864,66 +4058,103 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3864
4058
  }
3865
4059
  return showDisplayStatus.value === "edit-component";
3866
4060
  });
4061
+ const markRowDeleted = (row) => {
4062
+ if (row.id_ || row.group_ && row._2DTABLE_?.some((item) => item.id_)) {
4063
+ row.deleted_ = true;
4064
+ } else {
4065
+ row.tempDeleted = true;
4066
+ }
4067
+ };
4068
+ const deleteRowAt = (row, index) => {
4069
+ recordSubtableRowDelete(dataRelationShip, field, row);
4070
+ deleteSubtableRow(field, index);
4071
+ markRowDeleted(row);
4072
+ };
3867
4073
  const handleDeleteRow = (rowData, dataIdx) => {
3868
- recordSubtableRowDelete(dataRelationShip, field, rowData);
3869
- deleteSubtableRow(field, props.start + dataIdx);
3870
- if (rowData.id_ || rowData.group_ && rowData._2DTABLE_?.some((item) => item.id_)) {
3871
- rowData.deleted_ = true;
3872
- modelValue.value = relocateDeletedRowsToEnd(modelValue.value);
4074
+ const groupId = rowData.is_confirmed_ ? rowData.bom_entry_id_ : void 0;
4075
+ if (groupId) {
4076
+ for (let index = modelValue.value.length - 1; index >= 0; index--) {
4077
+ const row = modelValue.value[index];
4078
+ if (row.deleted_ || row.bom_entry_id_ !== groupId) continue;
4079
+ deleteRowAt(row, index);
4080
+ }
3873
4081
  } else {
3874
- rowData.tempDeleted = true;
3875
- modelValue.value = modelValue.value.filter((d) => !d.tempDeleted);
4082
+ const visibleIndex = props.start + dataIdx;
4083
+ const realIndex = dataInfo.value.visibleToRealIndexMap[visibleIndex] ?? visibleIndex;
4084
+ deleteRowAt(rowData, realIndex);
3876
4085
  }
3877
- modelValue.value = [...modelValue.value];
4086
+ modelValue.value = relocateDeletedRowsToEnd(modelValue.value.filter((d) => !d.tempDeleted));
3878
4087
  };
3879
- const handleAddRow = ({
4088
+ const createDefaultRows = (rowNum, quickFillDatas, patch) => {
4089
+ return Array.from({
4090
+ length: rowNum
4091
+ }, (_, i) => {
4092
+ const row = transformUtils.addSubTableRowItem({
4093
+ defaultData: currentFieldDefaultData.value,
4094
+ quickFillData: quickFillDatas?.[i],
4095
+ subFieldId: field,
4096
+ isRowSubTable2d,
4097
+ childInitRowLen
4098
+ });
4099
+ row.is_confirmed_ = false;
4100
+ patch?.(row);
4101
+ return row;
4102
+ });
4103
+ };
4104
+ const insertRowsAt = (insertIndex, rows) => {
4105
+ if (!rows.length) return;
4106
+ insertSubtableRows(field, insertIndex, rows.length);
4107
+ modelValue.value.splice(insertIndex, 0, ...rows);
4108
+ modelValue.value = relocateDeletedRowsToEnd(modelValue.value);
4109
+ recordSubtableRowAdd(dataRelationShip, field, rows);
4110
+ updateCalcCallback?.(dataRelationShip?.uniqueId);
4111
+ };
4112
+ const resolveRealIndex = (index) => dataInfo.value.visibleToRealIndexMap[props.start + index];
4113
+ const handleAddRowForGroup = ({
3880
4114
  index,
3881
- position = "after",
3882
- rowNum = 1,
3883
- actionType,
3884
4115
  rowData,
4116
+ rowNum = 1,
3885
4117
  quickFillDatas
3886
4118
  }) => {
3887
- if (!isFormChange.value && tableController.hasEditingRow()) {
3888
- return;
3889
- }
3890
- const newRowsData = actionType === "copyRow" ? [cloneDeep(omit(rowData, ["id_", FRONT_ROW_KEY]))] : Array.from({
3891
- length: rowNum
3892
- }, (_, index2) => transformUtils.addSubTableRowItem({
3893
- defaultData: currentFieldDefaultData.value,
3894
- quickFillData: quickFillDatas?.[index2],
3895
- subFieldId: field,
3896
- isRowSubTable2d,
3897
- childInitRowLen
4119
+ insertRowsAt(resolveRealIndex(index) + 1, createDefaultRows(rowNum, quickFillDatas, (r) => {
4120
+ if (rowData.bom_entry_id_) r.bom_entry_id_ = rowData.bom_entry_id_;
3898
4121
  }));
3899
- newRowsData.forEach((rowData2) => {
3900
- rowData2.is_confirmed_ = false;
3901
- });
3902
- const visibleIndex = props.start + index;
3903
- const realIndex = dataInfo.value.visibleToRealIndexMap[visibleIndex];
3904
- let insertIndex = 0;
3905
- switch (position) {
3906
- case "before":
3907
- insertIndex = realIndex;
3908
- break;
3909
- case "after":
3910
- insertIndex = realIndex + 1;
3911
- break;
3912
- case "last":
3913
- insertIndex = modelValue.value.length;
3914
- break;
3915
- }
3916
- if (actionType === "currentRow") {
3917
- const firstData = newRowsData.shift();
3918
- merge(rowData, omit(firstData, ["id_", FRONT_ROW_KEY]));
4122
+ };
4123
+ const handleAddGroup = async ({
4124
+ index,
4125
+ rowData,
4126
+ quickFillDatas
4127
+ }) => {
4128
+ const {
4129
+ bomEntriesValidator,
4130
+ enableSequenceLoading,
4131
+ actualTableData,
4132
+ error
4133
+ } = tableController;
4134
+ if (enableSequenceLoading) {
4135
+ const editing = bomEntriesValidator.findSequenceBomEntry(actualTableData);
4136
+ if (editing) {
4137
+ try {
4138
+ await bomEntriesValidator.validateCurrentGroupForSwitch(actualTableData, editing);
4139
+ setGroupEditState(actualTableData, editing, false);
4140
+ } catch (e) {
4141
+ if (e?.message) error(e.message);
4142
+ return;
4143
+ }
4144
+ }
3919
4145
  }
3920
- if (newRowsData.length > 0) {
3921
- insertSubtableRows(field, insertIndex, newRowsData.length);
3922
- modelValue.value.splice(insertIndex, 0, ...newRowsData);
3923
- modelValue.value = relocateDeletedRowsToEnd(modelValue.value);
3924
- recordSubtableRowAdd(dataRelationShip, field, newRowsData);
4146
+ const entryIdx = bomEntriesValidator.resolveEntryIndex(rowData);
4147
+ const util = entryIdx >= 0 ? bomEntriesValidator.bomEntryValidators[entryIdx] : void 0;
4148
+ let groupLast = -1;
4149
+ if (util) {
4150
+ modelValue.value.forEach((r, i) => {
4151
+ if (isRowInBomGroup(r, util)) {
4152
+ groupLast = i;
4153
+ }
4154
+ });
3925
4155
  }
3926
- updateCalcCallback?.(dataRelationShip?.uniqueId);
4156
+ if (groupLast < 0) groupLast = resolveRealIndex(index);
4157
+ insertRowsAt(groupLast + 1, createDefaultRows(1, quickFillDatas));
3927
4158
  };
3928
4159
  const handleAction = (action, rowData) => {
3929
4160
  switch (action) {
@@ -3943,7 +4174,13 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3943
4174
  break;
3944
4175
  }
3945
4176
  };
3946
- const getNewTdInfo = (tdInfo, rowData) => {
4177
+ const getNewTdInfo = (tdInfo, rowData, rowIndex) => {
4178
+ if (!tdInfo.cellHidden && tdInfo.cellWidget?.props?.type === "serialnumber") {
4179
+ const cloneData2 = cloneDeep(tdInfo);
4180
+ cloneData2.cellWidget.props.groupSerialnumber = true;
4181
+ cloneData2.cellWidget.props.groupOrderIndex = tableController.bomEntriesValidator.resolveGroupOrderIndex(rowData, tableController.actualTableData);
4182
+ return cloneData2;
4183
+ }
3947
4184
  if (tdInfo.cellHidden || !tdInfo?.cellWidget?.props?.field) {
3948
4185
  return tdInfo;
3949
4186
  }
@@ -3955,11 +4192,20 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3955
4192
  if (tdInfo.cellWidget.props.field === "material_no_") {
3956
4193
  cloneData.cellWidget.props.newSpecificConfig.newOptions = [];
3957
4194
  merge(cloneData.cellWidget.props.newSpecificConfig, {
3958
- newQueryData: {
3959
- "product_id_.versionIn": rowData.product_id_ ? [rowData.product_id_.split(":").pop()] : null
3960
- }
4195
+ newQueryData: tableController.getMaterialNoQueryForRow(rowData, rowIndex)
3961
4196
  });
3962
4197
  }
4198
+ if (fieldKey === "product_id_") {
4199
+ cloneData.cellWidget.props.needWatchOpen = true;
4200
+ const rowQuery = tableController.getProductQueryForRow(rowData, rowIndex);
4201
+ if (rowQuery) {
4202
+ cloneData.cellWidget.props.newSpecificConfig.newOptions = [];
4203
+ cloneData.cellWidget.props.newSpecificConfig.newQueryData = {
4204
+ ...cloneData.cellWidget.props.newSpecificConfig?.newQueryData ?? {},
4205
+ ...rowQuery
4206
+ };
4207
+ }
4208
+ }
3963
4209
  if (fieldKey === "qty_uom_id_" || fieldKey === "qty_required_uom_id_") {
3964
4210
  cloneData.cellWidget.props.quickSearchField = ["name_.like", "code_.like"];
3965
4211
  cloneData.cellWidget.props.quickSearchExp = "OR(name_.like,code_.like)";
@@ -3979,70 +4225,89 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
3979
4225
  }
3980
4226
  return cloneData;
3981
4227
  };
3982
- const handleMenuClick = (rowData, dataIdx) => ({
4228
+ const handleMenuClick = (rowData, dataIdx) => async ({
3983
4229
  key,
3984
4230
  actionValue
3985
4231
  }) => {
3986
4232
  switch (key) {
3987
4233
  case "rowEdit":
3988
- tableController.editRow(rowData);
3989
- break;
3990
- case "insertRowBefore":
3991
- handleAddRow({
3992
- index: dataIdx,
3993
- position: "before",
3994
- rowNum: actionValue?.upRowNum || 1,
3995
- quickFillDatas: actionValue?.data,
3996
- actionType: "prevRow",
3997
- rowData
3998
- });
4234
+ await tableController.editRow(rowData);
3999
4235
  break;
4236
+ // case 'insertRowBefore':
4237
+ // handleAddRow({
4238
+ // index: dataIdx,
4239
+ // position: 'before',
4240
+ // rowNum: actionValue?.upRowNum || 1,
4241
+ // quickFillDatas: actionValue?.data,
4242
+ // actionType: 'prevRow',
4243
+ // rowData,
4244
+ // });
4245
+ // break;
4000
4246
  case "insert1RowAfter":
4001
4247
  case "insertRowAfter":
4002
- handleAddRow({
4003
- index: dataIdx,
4004
- position: "after",
4005
- rowNum: actionValue?.downRowNum || 1,
4006
- quickFillDatas: actionValue?.data,
4007
- actionType: "nextRow",
4008
- rowData
4009
- });
4010
- break;
4011
- case "insertRowCurrent":
4012
- handleAddRow({
4013
- index: dataIdx,
4014
- position: "after",
4015
- rowNum: actionValue?.downRowNum || 1,
4016
- quickFillDatas: actionValue?.data,
4017
- actionType: "currentRow",
4018
- rowData
4019
- });
4020
- break;
4021
- case "copyRowAfter":
4022
- handleAddRow({
4248
+ handleAddRowForGroup({
4023
4249
  index: dataIdx,
4024
- position: "after",
4025
4250
  rowNum: actionValue?.downRowNum || 1,
4026
4251
  quickFillDatas: actionValue?.data,
4027
- actionType: "copyRow",
4028
4252
  rowData
4029
4253
  });
4030
- tableController.updateRowConsumed();
4031
4254
  break;
4032
- case "copyRow2Last":
4033
- handleAddRow({
4255
+ case "insert1GroupAfter":
4256
+ handleAddGroup({
4034
4257
  index: dataIdx,
4035
- position: "last",
4036
4258
  rowNum: actionValue?.downRowNum || 1,
4037
4259
  quickFillDatas: actionValue?.data,
4038
- actionType: "copyRow",
4039
4260
  rowData
4040
4261
  });
4041
- tableController.updateRowConsumed();
4042
4262
  break;
4263
+ // case 'insertRowCurrent':
4264
+ // handleAddRow({
4265
+ // index: dataIdx,
4266
+ // position: 'after',
4267
+ // rowNum: actionValue?.downRowNum || 1,
4268
+ // quickFillDatas: actionValue?.data,
4269
+ // actionType: 'currentRow',
4270
+ // rowData,
4271
+ // });
4272
+ // break;
4273
+ // case 'copyRowAfter':
4274
+ // handleAddRow({
4275
+ // index: dataIdx,
4276
+ // position: 'after',
4277
+ // rowNum: actionValue?.downRowNum || 1,
4278
+ // quickFillDatas: actionValue?.data,
4279
+ // actionType: 'copyRow',
4280
+ // rowData,
4281
+ // });
4282
+ // // 更新计算已消耗数量
4283
+ // tableController.updateRowConsumed();
4284
+ // break;
4285
+ // case 'copyRow2Last':
4286
+ // handleAddRow({
4287
+ // index: dataIdx,
4288
+ // position: 'last',
4289
+ // rowNum: actionValue?.downRowNum || 1,
4290
+ // quickFillDatas: actionValue?.data,
4291
+ // actionType: 'copyRow',
4292
+ // rowData,
4293
+ // });
4294
+ // // 更新计算已消耗数量
4295
+ // tableController.updateRowConsumed();
4296
+ // break;
4043
4297
  case "deleteRowCurrent":
4044
- handleDeleteRow(rowData, dataIdx);
4045
- tableController.updateRowConsumed();
4298
+ Modal.confirm({
4299
+ width: 316,
4300
+ centered: true,
4301
+ class: "confirm-before-delete-modal",
4302
+ icon: h("i", {
4303
+ class: "iconfont icon-jinggao"
4304
+ }),
4305
+ content: "是否确认删除?",
4306
+ onOk() {
4307
+ handleDeleteRow(rowData, dataIdx);
4308
+ tableController.updateDerivedQtyFields();
4309
+ }
4310
+ });
4046
4311
  break;
4047
4312
  default:
4048
4313
  handleAction(key, rowData);
@@ -4054,39 +4319,66 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4054
4319
  showScanBtn,
4055
4320
  showEditBtn,
4056
4321
  dataIdx,
4057
- dynHeight
4322
+ dynHeight,
4323
+ showInsert1RowBtn
4058
4324
  }) => {
4059
- const menus = [{
4060
- type: SubTableActionMenuTypeEnum.SUBTITLE,
4061
- label: "业务操作"
4062
- }, showScanBtn ? getMenuByAction(SubTableActionEnum.SCAN) : void 0, tableController.actualBomEntries?.length ? getMenuByAction(SubTableActionEnum.VIEW_BOM) : void 0, getMenuByAction(SubTableActionEnum.CHANGE_PARSE_RULE), {
4063
- type: SubTableActionMenuTypeEnum.DIVIDER
4064
- }, {
4065
- type: SubTableActionMenuTypeEnum.SUBTITLE,
4066
- label: "行编辑"
4067
- }, showEditBtn ? getMenuByAction(SubTableActionEnum.RowEdit) : void 0, getMenuByAction(SubTableActionEnum.Insert1RowAfter), getCopySubMenu(), ...showDelBtn ? [{
4068
- type: SubTableActionMenuTypeEnum.DIVIDER
4069
- }, getMenuByAction(SubTableActionEnum.DeleteRowCurrent)] : []].filter(Boolean);
4325
+ const menus = [
4326
+ {
4327
+ type: SubTableActionMenuTypeEnum.SUBTITLE,
4328
+ label: "业务操作"
4329
+ },
4330
+ showScanBtn ? getMenuByAction(SubTableActionEnum.SCAN) : void 0,
4331
+ // tableController.actualBomEntries?.length
4332
+ // ? getMenuByAction(SubTableActionEnum.VIEW_BOM)
4333
+ // : undefined,
4334
+ // getMenuByAction(SubTableActionEnum.CHANGE_PARSE_RULE),
4335
+ {
4336
+ type: SubTableActionMenuTypeEnum.DIVIDER
4337
+ },
4338
+ {
4339
+ type: SubTableActionMenuTypeEnum.SUBTITLE,
4340
+ label: "行编辑"
4341
+ },
4342
+ showEditBtn ? getMenuByAction(SubTableActionEnum.RowEdit) : void 0,
4343
+ showInsert1RowBtn ? getMenuByAction(SubTableActionEnum.Insert1RowAfter) : void 0,
4344
+ getMenuByAction(SubTableActionEnum.Insert1GroupAfter),
4345
+ // getCopySubMenu(),
4346
+ ...showDelBtn ? [{
4347
+ type: SubTableActionMenuTypeEnum.DIVIDER
4348
+ }, getMenuByAction(SubTableActionEnum.DeleteRowCurrent)] : []
4349
+ ].filter(Boolean);
4350
+ const realRowIndex = dataIdx !== -1 ? resolveRealIndex(dataIdx) : void 0;
4070
4351
  return createVNode("tr", {
4071
4352
  "key": trKey,
4072
4353
  "height": dynHeight || trData.props.height
4073
4354
  }, [trData.nextIds.map((tdId) => {
4074
- const tdInfo = getNewTdInfo(props.widgetCenter[tdId], rowData);
4355
+ const rawTdInfo = props.widgetCenter[tdId];
4356
+ if (dataIdx !== -1 && groupRowSpans.value.length && isGroupMergeCell(rawTdInfo) && groupRowSpans.value[dataIdx] === 0) {
4357
+ return null;
4358
+ }
4359
+ const tdInfo = getNewTdInfo(rawTdInfo, rowData, realRowIndex);
4360
+ const groupRowspan = dataIdx !== -1 && groupRowSpans.value.length && isGroupMergeCell(tdInfo) && groupRowSpans.value[dataIdx] > 1 ? groupRowSpans.value[dataIdx] : void 0;
4075
4361
  const tdAttrs = {
4076
4362
  key: tdId,
4077
4363
  id: tdId,
4078
4364
  hidden: tdInfo.cellHidden,
4079
4365
  borderAttrs: tdInfo.props.sourceBorderAttrs,
4080
- autoMerge: tdInfo.fillDirection === "x" ? tdInfo.xAutoMerge : tdInfo.autoMerge,
4366
+ autoMerge: groupRowspan ? false : tdInfo.fillDirection === "x" ? tdInfo.xAutoMerge : tdInfo.autoMerge,
4081
4367
  fillDirection: tdInfo.fillDirection,
4082
4368
  ...pick(tdInfo.props, ["rowspan", "colspan", "class"])
4083
4369
  };
4370
+ if (groupRowspan) {
4371
+ tdAttrs.rowspan = groupRowspan;
4372
+ }
4084
4373
  const realTdAttrInfo = props.subInfo.mergeBlock?.[tdId];
4085
4374
  if (realTdAttrInfo) {
4086
4375
  Object.assign(tdAttrs, {
4087
4376
  ...pick(realTdAttrInfo, ["rowspan", "colspan", "borderAttrs"]),
4088
4377
  hidden: false
4089
4378
  });
4379
+ if (groupRowspan) {
4380
+ tdAttrs.rowspan = groupRowspan;
4381
+ }
4090
4382
  }
4091
4383
  if (tdInfo.cellValueType) {
4092
4384
  if (props.isMobile) {
@@ -4130,6 +4422,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4130
4422
  "isEmpty": true
4131
4423
  }), null);
4132
4424
  }
4425
+ return null;
4133
4426
  }), showAction.value && showActionMenu && createVNode("div", {
4134
4427
  "class": "sub-table-action-bar"
4135
4428
  }, [slots.subAction?.({
@@ -4137,11 +4430,7 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4137
4430
  subTableFieldId: field,
4138
4431
  mobileTdIdGroups: dataRelationShip?.mobileTdIdGroups,
4139
4432
  handleMenuClick: handleMenuClick(rowData, dataIdx)
4140
- }), createVNode(MaterialConsumeAction, {
4141
- "showConfirmBtn": !isFormChange.value,
4142
- "rowData": rowData,
4143
- "onDoAction": handleAction
4144
- }, null)])]);
4433
+ })])]);
4145
4434
  };
4146
4435
  return () => createVNode("div", {
4147
4436
  "class": "cmp-sub-table"
@@ -4154,7 +4443,6 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4154
4443
  "width": cw
4155
4444
  }, null))]), createVNode("tbody", null, [props.subInfo.containerIds.map((trId) => {
4156
4445
  const trInfo = props.widgetCenter[trId];
4157
- console.log("trInfo", trInfo);
4158
4446
  if (trInfo.props.identifier !== "dynamicTr") {
4159
4447
  const dynHeight = props.subInfo.dynamicRowHeights?.[trId];
4160
4448
  return renderTr2Td(trId, trInfo, realFormState.value, {
@@ -4165,17 +4453,16 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4165
4453
  });
4166
4454
  }
4167
4455
  if (trId === lastDynamicId) {
4168
- const lastDataIdx = dataInfo.value.tableData.length - 1;
4456
+ dataInfo.value.tableData.length - 1;
4169
4457
  return dataInfo.value.tableData.map((data, dataIdx) => {
4170
4458
  const stableRowKey = getRowId(data);
4171
4459
  return dynamicIds.map((rowId, rowIdx) => {
4172
4460
  const isLastDynRow = rowIdx === lastDynRowIdx;
4173
- const isLast = dataIdx === lastDataIdx && isLastDynRow;
4174
- const showDelBtn = dataInfo.value.hasSubData && isLastDynRow && // 开启了顺序投料时,只有最后一行可以删除
4175
- (tableController.enableSequenceLoading ? isLast : true);
4176
- const showScanBtn = isLast;
4461
+ const showDelBtn = dataInfo.value.hasSubData && isLastDynRow;
4462
+ const showScanBtn = isLastDynRow;
4177
4463
  const showActionMenu = isLastDynRow;
4178
- const showEditBtn = !isFormChange.value && (tableController.enableSequenceLoading ? isLast : true) && data.is_confirmed_;
4464
+ const showEditBtn = !isFormChange.value && data.is_confirmed_;
4465
+ const showInsert1RowBtn = !isFormChange.value && !data.is_confirmed_;
4179
4466
  const row = props.widgetCenter[rowId];
4180
4467
  const dynHeight = props.subInfo.dynamicRowHeights?.[rowId]?.[dataIdx];
4181
4468
  return renderTr2Td(`${stableRowKey}_${rowIdx}`, row, data, {
@@ -4184,7 +4471,8 @@ const MaterialConsumeTable = /* @__PURE__ */ defineComponent({
4184
4471
  showScanBtn,
4185
4472
  showEditBtn,
4186
4473
  dataIdx,
4187
- dynHeight
4474
+ dynHeight,
4475
+ showInsert1RowBtn
4188
4476
  });
4189
4477
  });
4190
4478
  });
@@ -4350,7 +4638,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4350
4638
  show: props.showEditBtn,
4351
4639
  type: "action",
4352
4640
  key: SubTableActionEnum.RowEdit,
4353
- label: "重新编辑当前行",
4641
+ label: "编辑",
4354
4642
  icon: "icon-zhongxinbianjidangqianhang"
4355
4643
  },
4356
4644
  {
@@ -4553,7 +4841,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4553
4841
  };
4554
4842
  }
4555
4843
  });
4556
- const SubTableAction = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-e0624e4c"]]);
4844
+ const SubTableAction = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-01ca4702"]]);
4557
4845
  const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4558
4846
  __name: "fixed-table-action",
4559
4847
  props: {
@@ -4666,12 +4954,7 @@ const DocumentPaper = /* @__PURE__ */ defineComponent({
4666
4954
  const subTableCoreFactory = computed(() => subTableCoreFactoryMap.value?.[props.basicInfo?.uniqueId]);
4667
4955
  const filledFixedTableKeys = ref([]);
4668
4956
  const fixedTables = computed(() => {
4669
- const info = props.selfInfoList?.[0];
4670
- if (!info) {
4671
- return [];
4672
- }
4673
- const designer = JSON.parse(info.designerJson || "{}");
4674
- return designer.sheets?.[0]?.paper?.fixedTables || designer.fixedTables || [];
4957
+ return props.widgetCenter.paper?.props.fixedTables || [];
4675
4958
  });
4676
4959
  const fixedTableInfoMap = computed(() => {
4677
4960
  const {
@@ -5126,28 +5409,27 @@ export {
5126
5409
  FixedQuickFillModal as F,
5127
5410
  InstanceStatusValues as I,
5128
5411
  MaterialConsumptionPatternEnum as M,
5129
- SubTableCore as S,
5130
- _sfc_main$6 as _,
5131
- useFormTmplConfig as a,
5132
- useStyles as b,
5133
- useDependency as c,
5134
- useValidator as d,
5135
- DocumentPaper as e,
5136
- DynamicTableAction as f,
5137
- MaterialConsumeTableController as g,
5138
- SubTableActionMenuTypeEnum as h,
5139
- getMenuByAction as i,
5140
- SubTableActionEnum as j,
5141
- getCopySubMenu as k,
5142
- getInsertSubMenu as l,
5143
- useMaterialBalance as m,
5144
- commonUtils as n,
5145
- DeviceConnector as o,
5146
- DocumentLoading as p,
5147
- DynamicQuickFillModal as q,
5148
- FormTmplConfigController as r,
5149
- MCDataUtil as s,
5150
- useOnlineFormActionButton as t,
5151
- useOnlineFormTransformField2Component as u,
5412
+ OCR_MODEL_PRECISION_ENUM_KEY as O,
5413
+ RequiredQtyCalcRule as R,
5414
+ ScanParamType as S,
5415
+ _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,
5433
+ useFormTmplConfig as u,
5152
5434
  validate as v
5153
5435
  };