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