This commit is contained in:
zlwu committed 2026-07-21 15:23:59 +08:00
1 parent 417d6c9c51
commit c8fe0cdc20
102 files changed
+19847 -12224

No files matched your search

File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+127 -129
View File
@@ -1,11 +1,11 @@
# Graph Report - src (2026-07-16)
# Graph Report - src (2026-07-17)
## Corpus Check
- Large corpus: 881 files · ~587,199 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
- Large corpus: 883 files · ~589,944 words. Semantic extraction will be expensive (many Claude tokens). Consider running on a subfolder, or use --no-semantic to run AST-only.
## Summary
- 3025 nodes · 4249 edges · 59 communities detected
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 956 edges (avg confidence: 0.8)
- 3054 nodes · 4284 edges · 59 communities detected
- Extraction: 78% EXTRACTED · 22% INFERRED · 0% AMBIGUOUS · INFERRED: 962 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Community Hubs (Navigation)
@@ -45,35 +45,35 @@
- [[_COMMUNITY_Community 33|Community 33]]
- [[_COMMUNITY_Community 34|Community 34]]
- [[_COMMUNITY_Community 35|Community 35]]
- [[_COMMUNITY_Community 37|Community 37]]
- [[_COMMUNITY_Community 36|Community 36]]
- [[_COMMUNITY_Community 38|Community 38]]
- [[_COMMUNITY_Community 39|Community 39]]
- [[_COMMUNITY_Community 40|Community 40]]
- [[_COMMUNITY_Community 42|Community 42]]
- [[_COMMUNITY_Community 43|Community 43]]
- [[_COMMUNITY_Community 41|Community 41]]
- [[_COMMUNITY_Community 44|Community 44]]
- [[_COMMUNITY_Community 46|Community 46]]
- [[_COMMUNITY_Community 47|Community 47]]
- [[_COMMUNITY_Community 49|Community 49]]
- [[_COMMUNITY_Community 48|Community 48]]
- [[_COMMUNITY_Community 50|Community 50]]
- [[_COMMUNITY_Community 51|Community 51]]
- [[_COMMUNITY_Community 52|Community 52]]
- [[_COMMUNITY_Community 53|Community 53]]
- [[_COMMUNITY_Community 54|Community 54]]
- [[_COMMUNITY_Community 55|Community 55]]
- [[_COMMUNITY_Community 57|Community 57]]
- [[_COMMUNITY_Community 58|Community 58]]
- [[_COMMUNITY_Community 60|Community 60]]
- [[_COMMUNITY_Community 65|Community 65]]
- [[_COMMUNITY_Community 67|Community 67]]
- [[_COMMUNITY_Community 68|Community 68]]
- [[_COMMUNITY_Community 78|Community 78]]
- [[_COMMUNITY_Community 77|Community 77]]
- [[_COMMUNITY_Community 79|Community 79]]
- [[_COMMUNITY_Community 80|Community 80]]
- [[_COMMUNITY_Community 81|Community 81]]
## God Nodes (most connected - your core abstractions)
1. `get()` - 292 edges
2. `push()` - 92 edges
3. `WebSocketClient` - 26 edges
4. `emit()` - 26 edges
1. `get()` - 291 edges
2. `push()` - 93 edges
3. `emit()` - 28 edges
4. `WebSocketClient` - 26 edges
5. `set()` - 20 edges
6. `handleDynamicRoutes()` - 18 edges
7. `parseProtocolStandardImportText()` - 17 edges
@@ -82,208 +82,212 @@
10. `TableCache` - 14 edges
## Surprising Connections (you probably didn't know these)
- `handleBatchDelete()` --calls--> `withFullscreenLoading()` [INFERRED]
views/basic-info/customer/index.vue → utils/fullscreen-loading.ts
- `dash()` --calls--> `formatDisplayOrDash()` [INFERRED]
components/business/infusion-schedule-outbound-chain-view/index.vue → utils/datetime-display.ts
- `dash()` --calls--> `formatDisplayOrDash()` [INFERRED]
components/business/clinical-schedule-payment-detail/index.vue → utils/datetime-display.ts
- `buildInboundMetaFields()` --calls--> `push()` [INFERRED]
utils/production-work-order-card-meta.ts → views/operations/storage-facility/index.vue
- `fmtMoney()` --calls--> `formatMoneyDisplay()` [INFERRED]
components/business/clinical-schedule-payment-detail/index.vue → utils/money-format.ts
- `defaultInstallmentRatios()` --calls--> `push()` [INFERRED]
utils/protocol-payment-installment.ts → views/operations/storage-facility/index.vue
- `handleAttachmentDownload()` --calls--> `downloadAttachmentFile()` [INFERRED]
components/business/infusion-schedule-outbound-chain-view/index.vue → utils/download-attachment.ts
- `subscribeTokenRefresh()` --calls--> `push()` [INFERRED]
utils/http/index.ts → views/operations/storage-facility/index.vue
- `handleForwardSuccess()` --calls--> `emit()` [INFERRED]
views/production/production-work-order/TaskExecutionDialog.vue → components/core/layouts/art-settings-panel/widget/SettingItem.vue
## Communities
### Community 0 - "Community 0"
Cohesion: 0.01
Cohesion: 0.0
Nodes (206): fetchAccessLogList(), fetchActiveRegions(), fetchCategoryList(), fetchCategoryParameters(), fetchCellProductPriceList(), fetchCellProductTypeList(), fetchChannelAccount(), fetchChannelAgreementPrices() (+198 more)
### Community 1 - "Community 1"
Cohesion: 0.01
Nodes (128): fetchCellProductSpecList(), fetchUploadAttachment(), fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), FireworkSystem, handleReportUpload() (+120 more)
Cohesion: 0.02
Nodes (98): fetchUploadAttachment(), fetchOaInstanceDetail(), fetchOaTasks(), FireworkSystem, currentPrinterName(), load(), openDetail(), printRow() (+90 more)
### Community 2 - "Community 2"
Cohesion: 0.01
Nodes (14): fetchCreateCheckupInstitution(), fetchCreateCheckupInstitutionInvoice(), fetchDeleteProjectSystemItem(), fetchDeptTree(), fetchGetRoleList(), fetchNotDeletedRegions(), fetchPostBoundUserIds(), fetchRegionList() (+6 more)
### Community 3 - "Community 3"
Cohesion: 0.03
Nodes (89): batchSavePilotCheckup(), deletePilotCheckupActualItem(), fetchCheckupInstitutionList(), fetchCheckupInstitutionPackageDetail(), fetchCheckupInstitutionPackages(), fetchPilotCheckupActualItems(), fetchPilotCheckupDetail(), fetchPilotCheckupList() (+81 more)
### Community 3 - "Community 3"
Cohesion: 0.03
Nodes (59): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitutionProject(), fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList() (+51 more)
### Community 4 - "Community 4"
Cohesion: 0.03
Nodes (58): fetchCheckupInstitutionInvoices(), fetchCheckupInstitutionProjects(), fetchCreateCheckupInstitutionProject(), fetchUpdateCheckupInstitutionProject(), fetchCreateEnvDetectItem(), fetchDeleteEnvDetectItem(), fetchEnvDetectItemDetail(), fetchEnvDetectItemList() (+50 more)
Nodes (33): fetchGetMenuList(), ComponentLoader, IframeRouteManager, MenuProcessor, RouteRegistry, RouteTransformer, useAppMode(), useAuth() (+25 more)
### Community 5 - "Community 5"
Cohesion: 0.04
Nodes (56): buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTransportSection(), resolveInboundProtocolStatus(), buildBaseFields(), buildFeeSection() (+48 more)
Cohesion: 0.03
Nodes (59): fetchFullmoonTodoList(), fetchUpdateFullmoonTodoInsurance(), fetchCollectionProtocolAuditList(), fetchCollectionProtocolDetail(), fetchCollectionProtocolList(), fetchCreateProtocolInvoiceRequest(), fetchInvoiceEligiblePayments(), fetchPaymentDetailList() (+51 more)
### Community 6 - "Community 6"
Cohesion: 0.04
Nodes (69): formatNowDatetime(), formatTodayDate(), addPaymentDetail(), applyFqPaymentDefaults(), applyPaymentPresetForMode(), createEmptyTransport(), datetimeToYmd(), defaultInstallmentStartDateYmd() (+61 more)
Cohesion: 0.03
Nodes (51): fetchStorageSlotSelectOptions(), useSettingsHandlers(), useSettingsPanel(), useSettingsState(), RoutePermissionValidator, useCeremony(), useTheme(), if() (+43 more)
### Community 7 - "Community 7"
Cohesion: 0.04
Nodes (41): fetchGetMenuList(), fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchUpdateProfile(), fetchUploadProfileAvatar(), MenuProcessor, RouteRegistry (+33 more)
Cohesion: 0.03
Nodes (57): fetchMyProductionTasks(), fetchMyQcTaskList(), fetchQcTaskDetail(), fetchQcTaskList(), fetchMineTasksForWorkOrders(), useInboundSiblingNavigation(), shouldApplyTriggerSourceFilter(), useQcWorkOrderTabPage() (+49 more)
### Community 8 - "Community 8"
Cohesion: 0.03
Nodes (46): fetchStorageSlotSelectOptions(), useSettingsHandlers(), useSettingsPanel(), useSettingsState(), RoutePermissionValidator, useCeremony(), useTheme(), if() (+38 more)
Nodes (49): fetchCreateOaRole(), fetchDeleteOaRole(), fetchOaAppDraft(), fetchOaAppList(), fetchOaGroupList(), fetchOaRoleList(), fetchOaRoleUsers(), fetchOaTemplateDetail() (+41 more)
### Community 9 - "Community 9"
Cohesion: 0.04
Nodes (43): fetchOaAppDraft(), fetchOaAppList(), fetchOaFlowPreview(), fetchOaGroupList(), fetchOaRoleList(), fetchOaRoleUsers(), fetchOaTemplateDetail(), fetchOaTemplates() (+35 more)
Nodes (51): fetchCellProductSpecList(), buildTemporaryViewSections(), buildInsertedSiblingCard(), resolveShowProtocolPaymentAtGroup(), appendTaskResultSections(), batchTasksForPanelSlot(), buildConfiguredOnlySection(), for() (+43 more)
### Community 10 - "Community 10"
Cohesion: 0.04
Nodes (58): completePilotApplication(), deletePilotApplication(), fetchFullmoonTodoList(), fetchPilotApplicationList(), fetchUpdateFullmoonTodoInsurance(), startPilotApplication(), voidPilotApplication(), fetchCollectionProtocolDetail() (+50 more)
Nodes (47): buildInboundBasicSection(), buildInboundCellStorageViewSections(), buildInboundResearchDonationViewSections(), buildReceptionSection(), buildTransportSection(), resolveInboundProtocolStatus(), buildBaseFields(), buildInboundBasicSection() (+39 more)
### Community 11 - "Community 11"
Cohesion: 0.03
Nodes (24): fetchProductionWorkOrderQcInfo(), fetchQcMaterialBatchDetail(), fetchQcMaterialBatchList(), fetchQcMaterialBatchOptions(), fetchQcMaterialList(), fetchQcMaterialOptions(), fetchUpdateQcMaterialBatch(), dash() (+16 more)
Cohesion: 0.04
Nodes (41): fetchUserList(), fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit() (+33 more)
### Community 12 - "Community 12"
Cohesion: 0.04
Nodes (46): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), handleDialogClose(), handleAdd(), handleBatchDelete() (+38 more)
Nodes (39): fetchEthnicList(), formatNowDatetime(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), if(), loadEthnicOptions() (+31 more)
### Community 13 - "Community 13"
Cohesion: 0.04
Nodes (36): handleBlur(), handleFocus(), handleInput(), fetchClinicalReceiptConfirmed(), fetchClinicalRefundConfirmed(), buildConfirmedParams(), buildPendingParams(), formatAmount() (+28 more)
Cohesion: 0.05
Nodes (45): fetchCreateCustomer(), fetchCustomerList(), fetchDeleteCustomer(), fetchUpdateCustomer(), updateInfusionScheduleStatus(), handleDialogClose(), handleAdd(), handleDelete() (+37 more)
### Community 14 - "Community 14"
Cohesion: 0.05
Nodes (48): fetchEthnicList(), applyDonationBundleToForm(), createEmptyTransport(), ensureEthnicOptionInList(), handleOpenForAdd(), if(), loadEthnicOptions(), normalizeSampleRow() (+40 more)
Nodes (34): fetchClinicalPaymentDetail(), fetchClinicalPayments(), fetchClinicalReceiptConfirmed(), fetchClinicalReceiptPending(), fetchClinicalRefundConfirmed(), fetchClinicalRefundPending(), fetchOrderAdjusts(), fetchOrderDetail() (+26 more)
### Community 15 - "Community 15"
Cohesion: 0.05
Nodes (41): fetchOaInstanceDetail(), fetchOaTasks(), fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), currentPrinterName(), load(), openDetail() (+33 more)
Cohesion: 0.07
Nodes (35): fetchInfusionScheduleMgmtDetail(), dash(), fmtMoney(), attachmentFullUrl(), dash(), handleAttachmentDownload(), handleAttachmentPreview(), loadDetail() (+27 more)
### Community 16 - "Community 16"
Cohesion: 0.05
Nodes (24): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchRoleOptions(), fetchUpdateMenu(), collectIds(), postorder(), preorder() (+16 more)
Cohesion: 0.08
Nodes (37): formatDatetimeToMinute(), handleChineseDatetimePaste(), parseChineseDatetimeText(), parseBirthOrder(), parseChineseNumeral(), addSampleHint(), earliestCollectTime(), isMaternalBloodEmpty() (+29 more)
### Community 17 - "Community 17"
Cohesion: 0.06
Nodes (22): fetchCreateMenu(), fetchDeleteMenu(), fetchMenuTree(), fetchRoleOptions(), fetchUpdateMenu(), collectIds(), postorder(), preorder() (+14 more)
### Community 18 - "Community 18"
Cohesion: 0.1
Nodes (2): WebSocketClient, TableCache
### Community 18 - "Community 18"
Cohesion: 0.06
Nodes (29): fetchInfusionScheduleMgmtDetail(), qcAttachmentFullUrl(), qcDownloadAttachment(), qcPreviewAttachment(), handleDownloadAttachment(), attachmentFullUrl(), dash(), handleAttachmentDownload() (+21 more)
### Community 19 - "Community 19"
Cohesion: 0.06
Nodes (11): fetchProductionWorkOrderQcInfo(), auditorDisplay(), dash(), ensureUnitsInOptions(), expressName(), formatYm(), formatYmd(), sampleTypeName() (+3 more)
### Community 20 - "Community 20"
Cohesion: 0.08
Nodes (33): fetchRefreshToken(), toLogin(), base64ToBytes(), bytesToBase64(), decryptJson(), deriveKey(), encryptJson(), fromBase64Url() (+25 more)
### Community 20 - "Community 20"
### Community 21 - "Community 21"
Cohesion: 0.09
Nodes (8): getDefaultLanguage(), checkStorageCompatibility(), StorageConfig, getSystemStorage(), getSysVersion(), StorageKeyManager, StorageCompatibilityManager, validateStorageData()
### Community 21 - "Community 21"
### Community 22 - "Community 22"
Cohesion: 0.07
Nodes (21): fetchDictDataOptions(), fetchDeleteMaterialBatch(), fetchMaterialBatchList(), fetchMaterialBatchOptions(), fetchMaterialList(), fetchMaterialOptions(), fetchUpdateMaterialBatch(), fetchMaterialUsageList() (+13 more)
### Community 22 - "Community 22"
Cohesion: 0.08
Nodes (12): ComponentLoader, IframeRouteManager, RouteTransformer, getFirstMenuPath(), getFirstSecondLevelMenuPath(), isIframe(), isNavigableMenuItem(), isWorkbenchMenuItem() (+4 more)
### Community 23 - "Community 23"
Cohesion: 0.08
Nodes (18): fetchProductionReceptionBySampleCode(), fetchProductionReceptionSubmit(), fetchProductionReceptionUpdate(), onUserSelectVisible(), remoteSearchUsers(), buildPayload(), ensureDefaultHandler(), initDialog() (+10 more)
### Community 24 - "Community 24"
Cohesion: 0.07
Nodes (14): handleBlur(), handleFocus(), handleInput(), formatAmount(), formatAmount(), formatProtocolAmount(), buildFeeSection(), formatInvoiceAmount() (+6 more)
### Community 25 - "Community 25"
Cohesion: 0.08
Nodes (20): createEmptySnapshots(), normalizeConfiguredReagents(), normalizeConsumables(), normalizeDataCollections(), normalizeReagents(), normalizeStepOutputs(), serializeAttachments(), serializeEquipmentIds() (+12 more)
### Community 24 - "Community 24"
Cohesion: 0.09
Nodes (30): fetchAddTaskStep(), fetchCopyTaskStep(), fetchDeleteTaskStep(), fetchDispatchProductionTaskSteps(), fetchForwardProductionTask(), fetchProductionTaskDetail(), fetchProductionTaskEditorInit(), fetchProductionTaskList() (+22 more)
### Community 25 - "Community 25"
### Community 26 - "Community 26"
Cohesion: 0.09
Nodes (22): fetchMineProductionWorkOrderTabStepCounts(), fetchMineProductionWorkOrderTabStepCountsDeduped(), fetchProductionWorkOrderCellProductOptions(), fetchProductionWorkOrderDetail(), fetchProductionWorkOrderList(), fetchProductionWorkOrderQcDispatchOptions(), fetchProductionWorkOrderTabStepCounts(), fetchProductionWorkOrderTabStepCountsDeduped() (+14 more)
### Community 26 - "Community 26"
Cohesion: 0.07
Nodes (14): fetchUserList(), formatHandoverUserLabel(), formatNowDatetime(), fullFileUrl(), handlePreviewAttachment(), isVideoFile(), remoteSearchHandoverUsers(), resetHandoverForm() (+6 more)
### Community 27 - "Community 27"
Cohesion: 0.09
Nodes (12): fetchMineQcWorkOrderTabUnfinishedCounts(), fetchOutboundQcDetail(), fetchQcWorkOrderDetail(), fetchQcWorkOrderList(), fetchQcWorkOrdersBySample(), fetchQcWorkOrderTabUnfinishedCounts(), reload(), reloadTabCounts() (+4 more)
Nodes (27): completePilotApplication(), deletePilotApplication(), fetchPilotApplicationList(), startPilotApplication(), voidPilotApplication(), handleBatchComplete(), handleBatchStart(), handleBatchVoid() (+19 more)
### Community 28 - "Community 28"
Cohesion: 0.1
Nodes (16): fetchUpdateQcMaterialBatch(), fetchMarkQcMaterialUsageFullyUsed(), financeAttachmentsToUrlString(), ensureTabMounted(), handleTabChange(), handleSubmit(), canMarkFullyUsed(), displayPurpose() (+8 more)
### Community 29 - "Community 29"
Cohesion: 0.12
Nodes (20): fetchGetMenuCodes(), fetchGetUserInfo(), fetchLogin(), fetchUpdateProfile(), fetchUploadProfileAvatar(), fetchUserInfo(), buildWebEncryptedLoginBody(), defaultAvatarPathByRole() (+12 more)
### Community 30 - "Community 30"
Cohesion: 0.12
Nodes (15): addCopyButton(), highlightCode(), insertLineNumbers(), isBlockProcessed(), markBlockAsProcessed(), processBlock(), setupHighlightDirective(), setupRippleDirective() (+7 more)
### Community 29 - "Community 29"
### Community 31 - "Community 31"
Cohesion: 0.13
Nodes (18): fetchCellSampleTypeList(), fetchCreateCellSampleType(), fetchDeleteCellSampleType(), fetchUpdateCellSampleType(), handleAdd(), handleDelete(), handleDropdownCommand(), handleEdit() (+10 more)
### Community 30 - "Community 30"
### Community 32 - "Community 32"
Cohesion: 0.11
Nodes (11): fetchOutboundReleaseMaterial(), fetchOutboundReleaseReviewDetail(), fetchOutboundReleaseReviewList(), fetchReleaseReviewList(), handleReset(), handleSearch(), handleToggleSelect(), loadData() (+3 more)
### Community 33 - "Community 33"
Cohesion: 0.19
Nodes (15): fetchAttachmentDownloadUrl(), attachmentFullUrl(), ensureUniqueZipEntryName(), fetchAttachmentBlob(), getAttachmentExtension(), resolveAttachmentFileName(), sanitizeZipPathSegment(), applyInboundLabStorageCodePrefix() (+7 more)
### Community 31 - "Community 31"
Cohesion: 0.2
Nodes (11): fetchMarkQcMaterialUsageFullyUsed(), canMarkFullyUsed(), displayPurpose(), displayReceiver(), displayUseTime(), getChangeTypeLabel(), getChangeTypeTagType(), handleMarkFullyUsed() (+3 more)
### Community 32 - "Community 32"
### Community 34 - "Community 34"
Cohesion: 0.16
Nodes (10): useTable(), useTableImpl(), getColumnChecks(), useTableColumns(), createErrorHandler(), createSmartDebounce(), defaultResponseAdapter(), extractPagination() (+2 more)
### Community 33 - "Community 33"
### Community 35 - "Community 35"
Cohesion: 0.27
Nodes (14): useChart(), useChartComponent(), useChartOps(), colourBlend(), getCssVar(), getDarkColor(), getLightColor(), handleElementThemeColor() (+6 more)
### Community 34 - "Community 34"
Cohesion: 0.33
Nodes (13): buildProtocolPaymentFlowSteps(), dash(), financeReceiptTime(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit() (+5 more)
### Community 35 - "Community 35"
### Community 36 - "Community 36"
Cohesion: 0.19
Nodes (6): fetchServiceOrderTxnList(), handleReset(), handleSearch(), handleTabChange(), loadData(), switchTab()
### Community 37 - "Community 37"
Cohesion: 0.21
Nodes (7): handleReset(), handleSearch(), handleToggleSelect(), loadData(), onReviewSubmitted(), rowId(), isSelected()
### Community 38 - "Community 38"
Cohesion: 0.42
Nodes (9): buildPaymentFlowSteps(), dash(), formatAmount(), hasFinanceReceipt(), hasFinanceRefund(), hasReceiptSubmit(), hasRefundSubmit(), receiptSubmitTime() (+1 more)
Cohesion: 0.24
Nodes (8): fullFileUrl(), handlePreviewAttachment(), isVideoFile(), normalizeDisplayValue(), resolveReviewCellType(), resolveReviewQuantity(), resolveReviewSpecText(), uniqueJoined()
### Community 39 - "Community 39"
Cohesion: 0.2
Nodes (4): personTitle(), signBadge(), signBadgeText(), statusText()
### Community 40 - "Community 40"
Cohesion: 0.24
Nodes (4): addMaterialRow(), nextMaterialRowKey(), onRequisitionSelect(), removeMaterialRow()
### Community 40 - "Community 40"
### Community 41 - "Community 41"
Cohesion: 0.25
Nodes (2): handleTouchEnd(), setTransition()
### Community 42 - "Community 42"
### Community 44 - "Community 44"
Cohesion: 0.28
Nodes (4): fetchMyProductionMaterialConsumptions(), handleReset(), handleSearch(), loadData()
### Community 43 - "Community 43"
Cohesion: 0.31
Nodes (4): annotateForkEdges(), chainApiToElements(), walkAncestorBranch(), walkAncestorParents()
### Community 46 - "Community 46"
Cohesion: 0.25
Nodes (4): reload(), reloadTabCounts(), handleMenuJump(), openExternalLink()
### Community 47 - "Community 47"
Cohesion: 0.39
Nodes (6): isIgnorableScriptError(), normalizeErrorMessage(), registerPromiseErrorHandler(), registerResourceErrorHandler(), scriptErrorHandler(), setupErrorHandle()
### Community 47 - "Community 47"
### Community 48 - "Community 48"
Cohesion: 0.36
Nodes (1): TableHeightCalculator
### Community 49 - "Community 49"
### Community 50 - "Community 50"
Cohesion: 0.33
Nodes (2): logApiCryptoBootInfo(), maskSecret()
### Community 50 - "Community 50"
### Community 51 - "Community 51"
Cohesion: 0.38
Nodes (4): handleFocus(), handleInput(), parseDecimalToNumber(), sanitizeDecimalInput()
### Community 51 - "Community 51"
### Community 52 - "Community 52"
Cohesion: 0.4
Nodes (2): isUnfinishedQcWorkOrder(), resolveQcWorkOrderUnfinishedBadgeCount()
### Community 52 - "Community 52"
### Community 53 - "Community 53"
Cohesion: 0.47
Nodes (3): isPaymentDueWithinWarnWindow(), parsePaymentDueYmd(), startOfLocalDay()
@@ -299,10 +303,6 @@ Nodes (2): parseEquipmentIds(), syncEquipmentNamesFromOptions()
Cohesion: 0.5
Nodes (2): focusInput(), handleKeydown()
### Community 58 - "Community 58"
Cohesion: 0.4
Nodes (1): fetchQcMaterialAmountAuthUsers()
### Community 60 - "Community 60"
Cohesion: 0.67
Nodes (2): if(), logSidebarMenu()
@@ -319,28 +319,28 @@ Nodes (2): copyTextToClipboard(), copyTextWithFallback()
Cohesion: 1.0
Nodes (2): getSourceProtocolAttachment(), normalizeAttachmentFiles()
### Community 78 - "Community 78"
### Community 77 - "Community 77"
Cohesion: 1.0
Nodes (2): emptyTabCounts(), useProductionWorkOrderTabStepCounts()
### Community 80 - "Community 80"
### Community 79 - "Community 79"
Cohesion: 1.0
Nodes (2): initialProgress(), useQcWorkOrderAttachmentExport()
### Community 81 - "Community 81"
### Community 80 - "Community 80"
Cohesion: 1.0
Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
## Knowledge Gaps
- **Thin community `Community 17`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
- **Thin community `Community 18`** (42 nodes): `WebSocketClient`, `.calculateReconnectDelay()`, `.clearAllTimers()`, `.clearConnectionTimers()`, `.clearTimer()`, `.close()`, `.closeCurrentSocketForReconnect()`, `.connect()`, `.connectionStatusText()`, `.constructor()`, `.destroyInstance()`, `.flushMessageQueue()`, `.getInstance()`, `.getReadyStateText()`, `.handleClose()`, `.handleConnectionTimeout()`, `.handleError()`, `.handleMessage()`, `.handleOpen()`, `.init()`, `.isWebSocketConnected()`, `.reconnect()`, `.resetHeartbeat()`, `.send()`, `.startHeartbeat()`, `.startPing()`, `TableCache`, `.cleanupExpired()`, `.clear()`, `.clearByTags()`, `.clearCurrentSearch()`, `.clearPagination()`, `.constructor()`, `.evictLRU()`, `.generateKey()`, `.generateTags()`, `.get()`, `.getStats()`, `.log()`, `.set()`, `index.ts`, `tableCache.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 40`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
- **Thin community `Community 41`** (9 nodes): `cleanupEventListeners()`, `handleTouchEnd()`, `handleTouchMove()`, `handleTouchStart()`, `handleWheelScroll()`, `if()`, `setTransition()`, `setupEventListeners()`, `index.vue`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 47`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
- **Thin community `Community 48`** (8 nodes): `TableHeightCalculator`, `.calculate()`, `.calculateOffset()`, `.calculatePaginationOffset()`, `.constructor()`, `.getHeaderHeight()`, `useTableHeight()`, `useTableHeight.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 49`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
- **Thin community `Community 50`** (7 nodes): `App.vue`, `main.ts`, `refreshButtonAutoIcons()`, `refreshPanelTitleIcons()`, `logApiCryptoBootInfo()`, `maskSecret()`, `console.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 51`** (6 nodes): `formatQcWorkOrderUnfinishedBadgeCount()`, `isUnfinishedQcWorkOrder()`, `qcWorkOrderUnfinishedBadgeTitle()`, `resolveQcWorkOrderUnfinishedBadgeCount()`, `sumQcWorkOrderGroupUnfinishedBadgeCount()`, `qc-work-order-unfinished-badge.ts`
- **Thin community `Community 52`** (6 nodes): `formatQcWorkOrderUnfinishedBadgeCount()`, `isUnfinishedQcWorkOrder()`, `qcWorkOrderUnfinishedBadgeTitle()`, `resolveQcWorkOrderUnfinishedBadgeCount()`, `sumQcWorkOrderGroupUnfinishedBadgeCount()`, `qc-work-order-unfinished-badge.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 54`** (5 nodes): `formatProtocolDocBatchDeleteConfirm()`, `formatProtocolDocDeleteConfirm()`, `formatProtocolDocSubject()`, `getProtocolDocTypeLabel()`, `protocol-doc-label.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
@@ -348,8 +348,6 @@ Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 57`** (5 nodes): `focusInput()`, `handleKeydown()`, `if()`, `search()`, `index.vue`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 58`** (5 nodes): `fetchBatchRevokeQcMaterialAmountAuth()`, `fetchGrantQcMaterialAmountAuth()`, `fetchQcMaterialAmountAuthUsers()`, `fetchRevokeQcMaterialAmountAuth()`, `qc-material-amount-auth.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 60`** (4 nodes): `if()`, `logSidebarMenu()`, `index.vue`, `SidebarSubmenu.vue`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 65`** (3 nodes): `getSettingDefaults()`, `resetToDefaults()`, `setting.ts`
@@ -358,27 +356,27 @@ Nodes (2): emptyTabCounts(), useQcWorkOrderTabUnfinishedCounts()
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 68`** (3 nodes): `getSourceProtocolAttachment()`, `normalizeAttachmentFiles()`, `protocol-source-attachment.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 78`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
- **Thin community `Community 77`** (3 nodes): `emptyTabCounts()`, `useProductionWorkOrderTabStepCounts()`, `useProductionWorkOrderTabStepCounts.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 80`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
- **Thin community `Community 79`** (3 nodes): `initialProgress()`, `useQcWorkOrderAttachmentExport()`, `useQcWorkOrderAttachmentExport.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
- **Thin community `Community 81`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
- **Thin community `Community 80`** (3 nodes): `emptyTabCounts()`, `useQcWorkOrderTabUnfinishedCounts()`, `useQcWorkOrderTabUnfinishedCounts.ts`
Too small to be a meaningful cluster - may be noise or needs more connections extracted.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 4`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 16`, `Community 18`, `Community 21`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 29`, `Community 35`, `Community 42`, `Community 43`, `Community 58`?**
_High betweenness centrality (0.284) - this node is a cross-community bridge._
- **Why does `push()` connect `Community 1` to `Community 2`, `Community 3`, `Community 4`, `Community 5`, `Community 6`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 14`, `Community 15`, `Community 17`, `Community 19`, `Community 23`, `Community 24`, `Community 25`, `Community 26`, `Community 27`, `Community 30`, `Community 39`?**
_High betweenness centrality (0.279) - this node is a cross-community bridge._
- **Why does `handleDynamicRoutes()` connect `Community 7` to `Community 8`, `Community 15`, `Community 22`, `Community 25`, `Community 27`?**
_High betweenness centrality (0.046) - this node is a cross-community bridge._
- **Are the 291 inferred relationships involving `get()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`get()` has 291 INFERRED edges - model-reasoned connections that need verification._
- **Are the 91 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`push()` has 91 INFERRED edges - model-reasoned connections that need verification._
- **Are the 25 inferred relationships involving `emit()` (e.g. with `handleSubmit()` and `handleDialogClose()`) actually correct?**
_`emit()` has 25 INFERRED edges - model-reasoned connections that need verification._
- **Why does `push()` connect `Community 1` to `Community 0`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 10`, `Community 11`, `Community 12`, `Community 16`, `Community 18`, `Community 19`, `Community 20`, `Community 25`, `Community 26`, `Community 27`, `Community 33`, `Community 40`, `Community 46`?**
_High betweenness centrality (0.263) - this node is a cross-community bridge._
- **Why does `get()` connect `Community 0` to `Community 1`, `Community 2`, `Community 3`, `Community 5`, `Community 6`, `Community 7`, `Community 8`, `Community 9`, `Community 11`, `Community 12`, `Community 13`, `Community 14`, `Community 15`, `Community 17`, `Community 19`, `Community 22`, `Community 23`, `Community 26`, `Community 27`, `Community 29`, `Community 31`, `Community 32`, `Community 36`, `Community 44`?**
_High betweenness centrality (0.251) - this node is a cross-community bridge._
- **Why does `handleDynamicRoutes()` connect `Community 4` to `Community 0`, `Community 1`, `Community 6`, `Community 26`, `Community 29`?**
_High betweenness centrality (0.047) - this node is a cross-community bridge._
- **Are the 290 inferred relationships involving `get()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`get()` has 290 INFERRED edges - model-reasoned connections that need verification._
- **Are the 92 inferred relationships involving `push()` (e.g. with `refreshQcMenuBadges()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`push()` has 92 INFERRED edges - model-reasoned connections that need verification._
- **Are the 27 inferred relationships involving `emit()` (e.g. with `handleSubmit()` and `handleDialogClose()`) actually correct?**
_`emit()` has 27 INFERRED edges - model-reasoned connections that need verification._
- **Are the 19 inferred relationships involving `set()` (e.g. with `buildNodeCodePathFromFlat()` and `collectLeafFacilityNodesInTreeOrder()`) actually correct?**
_`set()` has 19 INFERRED edges - model-reasoned connections that need verification._
+4 -4
View File
@@ -57,12 +57,12 @@
</div>
<div id="legend"></div>
</div>
<div id="stats">3025 nodes &middot; 4249 edges &middot; 345 communities</div>
<div id="stats">3054 nodes &middot; 4284 edges &middot; 344 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 49, "community_name": "Community 49", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 49, "community_name": "Community 49", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 49, "community_name": "Community 49", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 49, "community_name": "Community 49", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 49, "community_name": "Community 49", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 49, "community_name": "Community 49", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 117, "community_name": "Community 117", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 118, "community_name": "Community 118", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 28, "community_name": "Community 28", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 28, "community_name": "Community 28", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 28, "community_name": "Community 28", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective",Line truncated
const RAW_EDGES = [{"from": "app_vue", "to": "src_app_refreshbuttonautoicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "src_app_refreshpaneltitleicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "main_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "utils_sys_console_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_masksecret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_logapicryptobootinfo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "src_main_masksecret", "to": "src_main_logapicryptobootinfo", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_ts", "to": "directives_index_setupglobdirectives", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_setupglobdirectives", "to": "core_auth_setupauthdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "core_roles_setuprolesdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_highlight_setuphighlightdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_ripple_setuprippledirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_core_roles_ts", "to": "core_roles_checkrolepermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_setuprolesdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_roles_checkrolepermission", "to": "core_roles_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_checkauthpermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_setupauthdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_checkauthpermission", "to": "core_auth_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_ripple_ts", "to": "business_ripple_setuprippledirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_highlightcode", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_insertlinenumbers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_addcopybutton", "label": "contains", "title": "contains [EXTRACTED]", "dLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 404}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 214}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 201}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 122}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 95}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 92}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 91}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 84}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 80}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 79}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 75}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 72}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 72}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 71}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 66}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 61}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 48}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 42}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 42}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 41}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 37}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 37}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 37}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 36}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 36}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 34}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 34}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 25}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 22}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 22}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 20}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 18}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 17}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 16}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 14}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 14}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 13}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 13}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 10}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 10}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 9}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 9}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 9}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 9}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 9}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 9}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 8}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 8}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 8}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 7}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 7}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 6}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 6}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 6}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 5}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 5}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 5}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 5}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 5}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 4}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 4}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 4}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 4}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 4}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 3}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 3}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 3}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 3}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 3}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 3}, {"cid": 70, "color": "#4E79A7", "label": "Community 70", "cLine truncated
const RAW_NODES = [{"id": "app_vue", "label": "App.vue", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "App.vue", "community": 50, "community_name": "Community 50", "source_file": "App.vue", "file_type": "code", "degree": 3}, {"id": "src_app_refreshbuttonautoicons", "label": "refreshButtonAutoIcons()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshButtonAutoIcons()", "community": 50, "community_name": "Community 50", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "src_app_refreshpaneltitleicons", "label": "refreshPanelTitleIcons()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "refreshPanelTitleIcons()", "community": 50, "community_name": "Community 50", "source_file": "App.vue", "file_type": "code", "degree": 1}, {"id": "main_ts", "label": "main.ts", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.4, "font": {"size": 0, "color": "#ffffff"}, "title": "main.ts", "community": 50, "community_name": "Community 50", "source_file": "main.ts", "file_type": "code", "degree": 4}, {"id": "src_main_masksecret", "label": "maskSecret()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "maskSecret()", "community": 50, "community_name": "Community 50", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "logApiCryptoBootInfo()", "community": 50, "community_name": "Community 50", "source_file": "main.ts", "file_type": "code", "degree": 2}, {"id": "env_d_ts", "label": "env.d.ts", "color": {"background": "#FF9DA7", "border": "#FF9DA7", "highlight": {"background": "#ffffff", "border": "#FF9DA7"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "env.d.ts", "community": 117, "community_name": "Community 117", "source_file": "env.d.ts", "file_type": "code", "degree": 0}, {"id": "shims_loose_d_ts", "label": "shims-loose.d.ts", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.0, "font": {"size": 0, "color": "#ffffff"}, "title": "shims-loose.d.ts", "community": 118, "community_name": "Community 118", "source_file": "shims-loose.d.ts", "file_type": "code", "degree": 0}, {"id": "directives_index_ts", "label": "index.ts", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "index.ts", "community": 30, "community_name": "Community 30", "source_file": "directives/index.ts", "file_type": "code", "degree": 1}, {"id": "directives_index_setupglobdirectives", "label": "setupGlobDirectives()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.5, "font": {"size": 0, "color": "#ffffff"}, "title": "setupGlobDirectives()", "community": 30, "community_name": "Community 30", "source_file": "directives/index.ts", "file_type": "code", "degree": 5}, {"id": "directives_core_roles_ts", "label": "roles.ts", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "roles.ts", "community": 30, "community_name": "Community 30", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 3}, {"id": "core_roles_checkrolepermission", "label": "checkRolePermission()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "checkRolePermission()", "community": 30, "community_name": "Community 30", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_removeelement", "label": "removeElement()", "color": {"background": "#4E79A7", "border": "#4E79A7", "highlight": {"background": "#ffffff", "border": "#4E79A7"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "removeElement()", "community": 30, "community_name": "Community 30", "source_file": "directives/core/roles.ts", "file_type": "code", "degree": 2}, {"id": "core_roles_setuprolesdirective",Line truncated
const RAW_EDGES = [{"from": "app_vue", "to": "src_app_refreshbuttonautoicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "src_app_refreshpaneltitleicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_vue", "to": "main_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "utils_sys_console_ts", "label": "imports_from", "title": "imports_from [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_masksecret", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "main_ts", "to": "src_main_logapicryptobootinfo", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "src_main_masksecret", "to": "src_main_logapicryptobootinfo", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_ts", "to": "directives_index_setupglobdirectives", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_index_setupglobdirectives", "to": "core_auth_setupauthdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "core_roles_setuprolesdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_highlight_setuphighlightdirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_index_setupglobdirectives", "to": "business_ripple_setuprippledirective", "label": "calls", "title": "calls [INFERRED]", "dashes": true, "width": 1, "color": {"opacity": 0.35}, "confidence": "INFERRED"}, {"from": "directives_core_roles_ts", "to": "core_roles_checkrolepermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_roles_ts", "to": "core_roles_setuprolesdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_roles_checkrolepermission", "to": "core_roles_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_checkauthpermission", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_removeelement", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_core_auth_ts", "to": "core_auth_setupauthdirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "core_auth_checkauthpermission", "to": "core_auth_removeelement", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_ripple_ts", "to": "business_ripple_setuprippledirective", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_highlightcode", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_insertlinenumbers", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "directives_business_highlight_ts", "to": "business_highlight_addcopybutton", "label": "contains", "title": "contains [EXTRACTED]", "dLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "Community 0", "count": 578}, {"cid": 1, "color": "#F28E2B", "label": "Community 1", "count": 144}, {"cid": 2, "color": "#E15759", "label": "Community 2", "count": 122}, {"cid": 3, "color": "#76B7B2", "label": "Community 3", "count": 96}, {"cid": 4, "color": "#59A14F", "label": "Community 4", "count": 93}, {"cid": 5, "color": "#EDC948", "label": "Community 5", "count": 90}, {"cid": 6, "color": "#B07AA1", "label": "Community 6", "count": 89}, {"cid": 7, "color": "#FF9DA7", "label": "Community 7", "count": 89}, {"cid": 8, "color": "#9C755F", "label": "Community 8", "count": 89}, {"cid": 9, "color": "#BAB0AC", "label": "Community 9", "count": 84}, {"cid": 10, "color": "#4E79A7", "label": "Community 10", "count": 79}, {"cid": 11, "color": "#F28E2B", "label": "Community 11", "count": 63}, {"cid": 12, "color": "#E15759", "label": "Community 12", "count": 63}, {"cid": 13, "color": "#76B7B2", "label": "Community 13", "count": 63}, {"cid": 14, "color": "#59A14F", "label": "Community 14", "count": 61}, {"cid": 15, "color": "#EDC948", "label": "Community 15", "count": 48}, {"cid": 16, "color": "#B07AA1", "label": "Community 16", "count": 47}, {"cid": 17, "color": "#FF9DA7", "label": "Community 17", "count": 44}, {"cid": 18, "color": "#9C755F", "label": "Community 18", "count": 42}, {"cid": 19, "color": "#BAB0AC", "label": "Community 19", "count": 42}, {"cid": 20, "color": "#4E79A7", "label": "Community 20", "count": 41}, {"cid": 21, "color": "#F28E2B", "label": "Community 21", "count": 37}, {"cid": 22, "color": "#E15759", "label": "Community 22", "count": 37}, {"cid": 23, "color": "#76B7B2", "label": "Community 23", "count": 36}, {"cid": 24, "color": "#59A14F", "label": "Community 24", "count": 36}, {"cid": 25, "color": "#EDC948", "label": "Community 25", "count": 36}, {"cid": 26, "color": "#B07AA1", "label": "Community 26", "count": 34}, {"cid": 27, "color": "#FF9DA7", "label": "Community 27", "count": 34}, {"cid": 28, "color": "#9C755F", "label": "Community 28", "count": 29}, {"cid": 29, "color": "#BAB0AC", "label": "Community 29", "count": 28}, {"cid": 30, "color": "#4E79A7", "label": "Community 30", "count": 22}, {"cid": 31, "color": "#F28E2B", "label": "Community 31", "count": 22}, {"cid": 32, "color": "#E15759", "label": "Community 32", "count": 22}, {"cid": 33, "color": "#76B7B2", "label": "Community 33", "count": 20}, {"cid": 34, "color": "#59A14F", "label": "Community 34", "count": 17}, {"cid": 35, "color": "#EDC948", "label": "Community 35", "count": 16}, {"cid": 36, "color": "#B07AA1", "label": "Community 36", "count": 14}, {"cid": 37, "color": "#FF9DA7", "label": "Community 37", "count": 13}, {"cid": 38, "color": "#9C755F", "label": "Community 38", "count": 13}, {"cid": 39, "color": "#BAB0AC", "label": "Community 39", "count": 12}, {"cid": 40, "color": "#4E79A7", "label": "Community 40", "count": 10}, {"cid": 41, "color": "#F28E2B", "label": "Community 41", "count": 9}, {"cid": 42, "color": "#E15759", "label": "Community 42", "count": 9}, {"cid": 43, "color": "#76B7B2", "label": "Community 43", "count": 9}, {"cid": 44, "color": "#59A14F", "label": "Community 44", "count": 9}, {"cid": 45, "color": "#EDC948", "label": "Community 45", "count": 9}, {"cid": 46, "color": "#B07AA1", "label": "Community 46", "count": 9}, {"cid": 47, "color": "#FF9DA7", "label": "Community 47", "count": 8}, {"cid": 48, "color": "#9C755F", "label": "Community 48", "count": 8}, {"cid": 49, "color": "#BAB0AC", "label": "Community 49", "count": 8}, {"cid": 50, "color": "#4E79A7", "label": "Community 50", "count": 7}, {"cid": 51, "color": "#F28E2B", "label": "Community 51", "count": 7}, {"cid": 52, "color": "#E15759", "label": "Community 52", "count": 6}, {"cid": 53, "color": "#76B7B2", "label": "Community 53", "count": 6}, {"cid": 54, "color": "#59A14F", "label": "Community 54", "count": 5}, {"cid": 55, "color": "#EDC948", "label": "Community 55", "count": 5}, {"cid": 56, "color": "#B07AA1", "label": "Community 56", "count": 5}, {"cid": 57, "color": "#FF9DA7", "label": "Community 57", "count": 5}, {"cid": 58, "color": "#9C755F", "label": "Community 58", "count": 4}, {"cid": 59, "color": "#BAB0AC", "label": "Community 59", "count": 4}, {"cid": 60, "color": "#4E79A7", "label": "Community 60", "count": 4}, {"cid": 61, "color": "#F28E2B", "label": "Community 61", "count": 4}, {"cid": 62, "color": "#E15759", "label": "Community 62", "count": 4}, {"cid": 63, "color": "#76B7B2", "label": "Community 63", "count": 4}, {"cid": 64, "color": "#59A14F", "label": "Community 64", "count": 3}, {"cid": 65, "color": "#EDC948", "label": "Community 65", "count": 3}, {"cid": 66, "color": "#B07AA1", "label": "Community 66", "count": 3}, {"cid": 67, "color": "#FF9DA7", "label": "Community 67", "count": 3}, {"cid": 68, "color": "#9C755F", "label": "Community 68", "count": 3}, {"cid": 69, "color": "#BAB0AC", "label": "Community 69", "count": 3}, {"cid": 70, "color": "#4E79A7", "label": "Community 70", "cLine truncated
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
function esc(s) {
File diff suppressed because it is too large. Load diff
+23 -21
View File
@@ -1,6 +1,6 @@
{
"/Users/wuzilong/work/00code/zkxw/web-admin/src/App.vue": 1782893851.4905877,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts": 1784173366.0317953,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts": 1784274843.7468073,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/env.d.ts": 1781272556.3788364,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/shims-loose.d.ts": 1781272556.417826,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/directives/index.ts": 1781272556.3521712,
@@ -17,8 +17,8 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/common/index.ts": 1781272556.3597305,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/directive/directive.d.ts": 1781272556.3601494,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/api/api.d.ts": 1781272556.3606477,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1784180518.5480022,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1784180508.1545453,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts": 1784277362.4351091,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/auto-imports.d.ts": 1784277355.5404706,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/store/index.ts": 1781272556.364766,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/types/router/index.ts": 1782394569.8806834,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/composables/useAttachmentActions.ts": 1783921717.4015942,
@@ -84,7 +84,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/mask-sensitive.ts": 1781272556.4029639,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/sample-reception-view-sections.ts": 1783389099.9667985,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-labels.ts": 1783306730.912153,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts": 1784108772.8928564,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts": 1784276981.3083122,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/inbound-sample-special-mark.ts": 1782889894.1376855,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-category.ts": 1783393556.2431076,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-menu-badge.ts": 1783307225.4832592,
@@ -103,6 +103,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-step-assignee.ts": 1782472559.244021,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/process-material-ui.ts": 1781528129.339137,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-fq-params-change.ts": 1781687645.2065177,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts": 1784277173.1550035,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/protocol-payment-flow-steps.ts": 1782806499.3099828,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/loginRsa.ts": 1781272556.4129546,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/chinese-datetime-parse.ts": 1782958233.483039,
@@ -145,8 +146,8 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/http/error.ts": 1781272556.4091117,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/socket/index.ts": 1781272556.4146817,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/router/sidebar-menu-filter.ts": 1781272556.4163456,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue": 1784173366.0334272,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts": 1784173366.0347135,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue": 1784273205.773055,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts": 1784274843.746828,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/tables/art-table/index.vue": 1782893852.037499,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/tables/art-table-header/index.vue": 1782893852.0053234,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/forms/art-search-bar/index.vue": 1782893851.915658,
@@ -228,7 +229,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-video-player/index.vue": 1782893851.5118508,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/core/media/art-cutter-img/index.vue": 1782893851.4950457,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/sample-transport-form-section/index.vue": 1782893852.3610222,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-attachment-mini-readonly/index.vue": 1783921757.1369452,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-attachment-mini-readonly/index.vue": 1784205395.355872,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/index.vue": 1784176800.4318092,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-finance-confirm-fields/finance-attachments.ts": 1781272556.6256514,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/qc-task-view-dialog/index.vue": 1782894734.8201208,
@@ -260,14 +261,15 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/list-datetime-column.vue": 1782893851.4989195,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/amount-input/index.vue": 1782893851.5061834,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/common/decimal-input/index.vue": 1782893851.5090024,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFlowPreview.vue": 1784103286.6667576,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts": 1784105904.181756,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFlowPreview.vue": 1784276122.848332,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts": 1784272584.166454,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaApprovalPrintSheet.vue": 1784108772.892926,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFormDesignerEmbed.vue": 1784106491.2979093,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue": 1784103286.5178576,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue": 1784106536.8243594,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue": 1784106561.55031,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue": 1784106548.2533798,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFcRow.vue": 1784277170.6285605,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFormDesignerEmbed.vue": 1784271049.82102,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue": 1784277386.5617285,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue": 1784273803.9009435,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue": 1784273504.6858127,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue": 1784273804.1612618,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/types.ts": 1784106515.9437442,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/hooks/index.ts": 1781272556.653748,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/hooks/core/useFastEnter.ts": 1781272556.6454022,
@@ -312,7 +314,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-lab-test-item.ts": 1781272556.666375,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/cell-product.ts": 1782710852.6608956,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/sample-sms-notification.ts": 1781272556.666838,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts": 1784099959.142847,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts": 1784276081.4709907,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/material-stock-check.ts": 1781427280.4992144,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/research-donation.ts": 1782893816.502791,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-task.ts": 1783327864.9737554,
@@ -397,15 +399,15 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dept/index.vue": 1784018212.022131,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/dict/index.vue": 1783326448.9326534,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/leave/index.vue": 1783326448.934463,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue": 1784099881.4392262,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue": 1784018992.582203,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue": 1784276545.557209,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue": 1784269877.2911904,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/form-designer-spike/index.vue": 1784018202.8769164,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/done/index.vue": 1784102239.4821205,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/mine/index.vue": 1784173366.0358684,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue": 1784106499.9728048,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue": 1784103227.4305036,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue": 1784271066.9590933,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue": 1784276981.3081641,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/cc/index.vue": 1784173366.0354402,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue": 1784022023.6119828,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue": 1784260925.8786883,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/pending/index.vue": 1784102236.6623435,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/output-type/index.vue": 1782893852.8585393,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/cell-product/index.vue": 1783326448.9373286,
@@ -538,7 +540,7 @@
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialBatchAttachmentDialog.vue": 1782893853.076457,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material-amount-auth/index.vue": 1783919123.1912484,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/index.vue": 1783326448.9852715,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue": 1783925976.6947525,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue": 1784204877.3273342,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/index.vue": 1783389101.2287407,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/sample-reception/SampleReceptionCardList.vue": 1783924089.846302,
"/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/my-qc-task/index.vue": 1783325990.456282,
+15 -6
View File
@@ -182,13 +182,22 @@ export function fetchOaTemplateDetail(appId: string) {
return request.get<any>({ url: `${BASE}/templates/${appId}` })
}
/** 发起前审批流预览(按当前登录人解析审批人) */
export function fetchOaFlowPreview(appId: string, initiatorSelectUserIds?: string[]) {
return request.get<{ steps: OaFlowPreviewStep[] }>({
/** 发起前审批流预览(条件齐后返回最终路径) */
export function fetchOaFlowPreview(
appId: string,
opts?: { formData?: Record<string, any>; initiatorSelectUserIds?: string[] }
) {
return request.post<{
resolved: boolean
message?: string
steps: OaFlowPreviewStep[]
}>({
url: `${BASE}/templates/${appId}/flow-preview`,
params: initiatorSelectUserIds?.length
? { initiatorSelectUserIds: initiatorSelectUserIds.join(',') }
: undefined
data: {
formData: opts?.formData || {},
initiatorSelectUserIds: opts?.initiatorSelectUserIds || undefined
},
showSuccessMessage: false
})
}
@@ -0,0 +1,52 @@
/**
* OA · FormCreate 运行时表单布局
* - 设计器栅格 fcRow 渲染为 ._fd-row(flex),props.gutter 不生效
* - 用负 margin + 列 padding 模拟间距,并用 width 补偿保证占满整行
* - 控件默认拉满列宽,避免日期/输入框定宽导致右侧留白
*/
.form-create {
width: 100%;
--oa-fc-gutter: 20px;
.el-row {
width: 100%;
}
/* 设计器「栅格布局」假 row(对齐 ElRow gutter:负 margin + 列 padding) */
._fd-row {
display: flex;
flex-wrap: wrap;
box-sizing: border-box;
position: relative;
width: 100%;
margin-left: calc(var(--oa-fc-gutter) / -2);
margin-right: calc(var(--oa-fc-gutter) / -2);
> .el-col {
box-sizing: border-box;
padding-left: calc(var(--oa-fc-gutter) / 2);
padding-right: calc(var(--oa-fc-gutter) / 2);
}
}
.el-form-item {
width: 100%;
margin-right: 0;
}
.el-form-item__content {
width: 100%;
}
.el-input,
.el-select,
.el-cascader,
.el-textarea,
.el-input-number,
.el-date-editor,
.el-date-editor.el-input,
.el-date-editor.el-input__wrapper {
width: 100%;
}
}
+3
View File
@@ -25,6 +25,9 @@
// OA 审批 FormCreate 设计器三栏布局
@use './core/oa-fc-designer.scss';
// OA 审批 FormCreate 运行时表单(栅格间距 / 控件铺满)
@use './core/oa-fc-runtime.scss';
// 主题切换过渡优化
@use './core/theme-change.scss';
@@ -1,6 +1,6 @@
<!-- 协议附件 — 迷你缩略图只读(卡片列表用) -->
<template>
<div class="protocol-attachment-mini">
<div class="protocol-attachment-mini" :class="{ 'is-multi': files.length > 1 }">
<div v-if="label" class="protocol-attachment-mini__label">{{ label }}</div>
<span v-if="!files.length" class="protocol-attachment-mini__empty">{{ emptyText }}</span>
<div v-else class="protocol-attachment-mini__list">
@@ -22,12 +22,12 @@
</template>
<template v-else-if="isVideoFile(file)">
<div class="protocol-attachment-mini__icon protocol-attachment-mini__icon--video">
<el-icon :size="20"><VideoPlay /></el-icon>
<el-icon :size="files.length > 1 ? 14 : 20"><VideoPlay /></el-icon>
</div>
</template>
<template v-else>
<div class="protocol-attachment-mini__icon protocol-attachment-mini__icon--doc">
<el-icon :size="20"><Document /></el-icon>
<el-icon :size="files.length > 1 ? 14 : 20"><Document /></el-icon>
</div>
</template>
</div>
@@ -219,4 +219,42 @@
color: #fff;
}
}
/* 多附件时缩小缩略图,便于在卡片内并排展示 */
.protocol-attachment-mini.is-multi {
.protocol-attachment-mini__list {
gap: 4px;
}
.protocol-attachment-mini__item {
width: 48px;
border-radius: 4px;
}
.protocol-attachment-mini__preview {
height: 36px;
}
.protocol-attachment-mini__icon {
width: 22px;
height: 22px;
border-radius: 6px;
}
.protocol-attachment-mini__footer {
padding: 2px 3px;
gap: 1px;
}
.protocol-attachment-mini__name {
font-size: 9px;
}
.protocol-attachment-mini__download {
width: 14px;
height: 14px;
font-size: 9px;
border-radius: 3px;
}
}
</style>
@@ -0,0 +1,10 @@
<!-- 运行时栅格行:对齐设计器 FcRow(._fd-row flex),间距由 oa-fc-runtime.scss 提供 -->
<template>
<div class="_fd-row el-row" v-bind="$attrs">
<slot />
</div>
</template>
<script setup lang="ts">
defineOptions({ name: 'FcRow', inheritAttrs: false })
</script>
@@ -1,11 +1,14 @@
<!-- 发起审批 · 表单底部审批流预览(对齐 docs/mockups/oa-approval-start-flow-preview-demo.html) -->
<template>
<div class="oa-flow-preview">
<div v-loading="loading" class="oa-flow-preview">
<div class="oa-flow-preview__title">
<span>审批流程</span>
<span v-if="hint" class="oa-flow-preview__hint">{{ hint }}</span>
<span v-if="resolved && hint" class="oa-flow-preview__hint">{{ hint }}</span>
</div>
<div v-loading="loading" class="oa-flow-preview__chain">
<div v-if="!resolved" class="oa-flow-preview__pending">
{{ pendingMessage || '必填信息填写后,流程将自动显示' }}
</div>
<div v-else class="oa-flow-preview__chain">
<div v-if="!loading && !steps.length" class="oa-flow-preview__empty">暂无流程配置</div>
<div v-for="(s, idx) in steps" :key="s.id || idx" class="oa-flow-step">
<div class="oa-flow-rail">
@@ -49,15 +52,20 @@
steps?: OaFlowPreviewStep[]
loading?: boolean
hint?: string
resolved?: boolean
pendingMessage?: string
}>(),
{
steps: () => [],
loading: false,
hint: '按当前发起人解析审批人'
hint: '按当前发起人解析审批人',
resolved: true,
pendingMessage: '必填信息填写后,流程将自动显示'
}
)
const steps = computed(() => props.steps || [])
const resolved = computed(() => props.resolved !== false)
function signBadge(s: OaFlowPreviewStep) {
if (s.type === 'cc' || s.signMode === 'cc') return 'cc'
@@ -105,6 +113,14 @@
font-weight: 400;
}
.oa-flow-preview__pending {
padding: 16px 8px 20px;
color: var(--mint-text-muted, #94a3b8);
font-size: 13px;
line-height: 1.5;
text-align: center;
}
.oa-flow-preview__empty {
padding: 8px 0;
color: var(--mint-text-muted, #94a3b8);
@@ -29,6 +29,8 @@
const frameRef = ref<HTMLIFrameElement | null>(null)
const frameReady = ref(false)
let reqSeq = 0
/** 最近一次推入 iframe 的 schema JSON,用于避免保存回写后重复 setRule 清空画布 */
let lastPushedJson = ''
const pending = new Map<
number,
{ resolve: (v: { rule: unknown; option: unknown }) => void; reject: (e: Error) => void }
@@ -62,6 +64,10 @@
}
}
function schemaJson(schema: unknown) {
return JSON.stringify(toPlainSchema(schema))
}
function postToFrame(payload: Record<string, unknown>) {
try {
frameRef.value?.contentWindow?.postMessage(payload, '*')
@@ -70,11 +76,16 @@
}
}
function pushSchemaToFrame() {
/** force=true 时即使内容相同也重新 setRule(用于切回表单 Tab 强制回显) */
function pushSchemaToFrame(force = false) {
if (!frameReady.value) return
const schema = toPlainSchema(props.modelValue)
const json = JSON.stringify(schema)
if (!force && json === lastPushedJson) return
lastPushedJson = json
postToFrame({
type: MSG.SET,
schema: toPlainSchema(props.modelValue)
schema
})
}
@@ -88,7 +99,7 @@
function onFrameLoad() {
if (frameReady.value) {
pushSchemaToFrame()
pushSchemaToFrame(true)
pushFlowRefs()
}
}
@@ -98,11 +109,13 @@
if (!data || typeof data !== 'object') return
if (data.type === MSG.READY) {
frameReady.value = true
pushSchemaToFrame()
lastPushedJson = ''
pushSchemaToFrame(true)
pushFlowRefs()
// 宿主刚就绪时再补推一次,避免 setRule 早于内部 dragForm 初始化
window.setTimeout(() => pushSchemaToFrame(), 50)
window.setTimeout(() => pushSchemaToFrame(), 200)
// 宿主刚就绪时再补推,避免 setRule 早于内部 dragForm / 菜单初始化
window.setTimeout(() => pushSchemaToFrame(true), 50)
window.setTimeout(() => pushSchemaToFrame(true), 200)
window.setTimeout(() => pushSchemaToFrame(true), 500)
return
}
if (data.type === MSG.SCHEMA && typeof data.requestId === 'number') {
@@ -110,6 +123,8 @@
if (!wait) return
pending.delete(data.requestId)
const schema = toPlainSchema(data.schema)
// 与父级即将回写的内容对齐,避免 watch 再次 setRule
lastPushedJson = JSON.stringify(schema)
wait.resolve(schema)
}
}
@@ -136,12 +151,17 @@
})
}
/** 切回「表单设计」Tab 时强制把父级 schema 灌回画布 */
function reapplySchema() {
pushSchemaToFrame(true)
pushFlowRefs()
}
watch(
() => props.modelValue,
() => schemaJson(props.modelValue),
() => {
pushSchemaToFrame()
},
{ deep: true }
pushSchemaToFrame(false)
}
)
watch(
@@ -162,7 +182,7 @@
pending.clear()
})
defineExpose({ fetchSchema })
defineExpose({ fetchSchema, reapplySchema })
</script>
<style scoped lang="scss">
@@ -8,10 +8,7 @@
<div v-if="!items.length" class="oa-flow-preview__empty">暂无任务记录</div>
<div v-for="(item, idx) in items" :key="item.key" class="oa-flow-step">
<div class="oa-flow-rail">
<div
class="oa-flow-dot"
:class="dotClass(item)"
/>
<div class="oa-flow-dot" :class="dotClass(item)" />
<div v-if="idx < items.length - 1" class="oa-flow-line" />
</div>
<div class="oa-flow-card">
@@ -20,7 +17,11 @@
<span v-if="statusBadge(item)" class="oa-flow-badge" :class="statusBadge(item)">
{{ statusText(item.status) }}
</span>
<span v-if="item.taskType === 'cc'" class="oa-flow-badge cc">抄送</span>
<span v-if="signBadge(item)" class="oa-flow-badge" :class="signBadge(item)">
{{ signBadgeText(item) }}
</span>
<span v-else-if="item.taskType === 'cc'" class="oa-flow-badge cc">抄送</span>
<span v-else-if="item.taskType === 'end'" class="oa-flow-badge mute">结束</span>
<template v-if="item.timestamp">
<span class="oa-flow-card__sep">·</span>
<span class="oa-flow-card__meta" :title="item.timestamp">{{ item.timestamp }}</span>
@@ -32,12 +33,21 @@
</span>
</template>
<span
v-if="item.assignee && item.kind !== 'pending_node' && item.kind !== 'terminal'"
v-if="displayPeople(item).length && item.kind !== 'terminal'"
class="oa-flow-card__people"
>
<span class="oa-person-chip">
<span class="oa-person-chip__dot">{{ avatarChar(item.assignee) }}</span>
{{ item.assignee }}
<span
v-for="p in displayPeople(item)"
:key="p.id || p.nickName"
class="oa-person-chip"
:class="personChipClass(p.status)"
:title="personTitle(p)"
>
<span class="oa-person-chip__dot">{{ avatarChar(p.nickName) }}</span>
{{ p.nickName }}
<span v-if="personStatusHint(p.status)" class="oa-person-chip__st">
{{ personStatusHint(p.status) }}
</span>
</span>
</span>
</div>
@@ -53,6 +63,15 @@
<script setup lang="ts">
defineOptions({ name: 'OaProgressChain' })
export type OaProgressPerson = {
id?: string
nickName?: string
status?: string
timestamp?: string
commentText?: string
taskId?: string
}
export type OaProgressChainItem = {
key: string
title: string
@@ -63,6 +82,8 @@
commentText?: string
taskType?: string
kind?: string
signMode?: string
people?: OaProgressPerson[]
}
withDefaults(
@@ -100,6 +121,59 @@
return ''
}
function signBadge(item: OaProgressChainItem) {
if (item.taskType === 'cc' || item.signMode === 'cc') return 'cc'
if (item.signMode === 'and') return 'and'
if (item.signMode === 'or') return 'or'
return ''
}
function signBadgeText(item: OaProgressChainItem) {
const k = signBadge(item)
if (k === 'cc') return '抄送'
if (k === 'and') return '会签'
if (k === 'or') return '或签'
return ''
}
function displayPeople(item: OaProgressChainItem): OaProgressPerson[] {
const list = Array.isArray(item.people) ? item.people.filter((p) => p?.nickName || p?.id) : []
if (list.length) {
return list.map((p) => ({
...p,
nickName: (p.nickName || p.id || '').trim()
}))
}
const name = (item.assignee || '').trim()
if (!name) return []
return [{ nickName: name, status: item.status }]
}
function personChipClass(status?: string) {
const s = status || ''
if (s === 'approved' || s === 'completed') return 'is-ok'
if (s === 'pending' || s === 'running') return 'is-pending'
if (s === 'rejected' || s === 'returned' || s === 'cancelled') return 'is-danger'
if (s === 'done' || s === 'not_reached') return 'is-mute'
return ''
}
function personStatusHint(status?: string) {
const s = status || ''
if (s === 'approved') return '已同意'
if (s === 'rejected') return '已拒绝'
if (s === 'returned') return '已打回'
if (s === 'pending' || s === 'running') return '待处理'
if (s === 'done') return '无需处理'
if (s === 'not_reached') return '未到达'
return ''
}
function personTitle(p: OaProgressPerson) {
const parts = [p.nickName || '', statusText(p.status || ''), p.timestamp || ''].filter(Boolean)
return parts.join(' · ')
}
function dotClass(item: OaProgressChainItem) {
const s = item.status || ''
if (s === 'approved' || s === 'completed' || s === 'done' || s === 'submitted') return 'ok'
@@ -275,6 +349,42 @@
white-space: nowrap;
background: #f1f5f9;
border-radius: 999px;
&.is-ok {
color: #059669;
background: #ecfdf5;
.oa-person-chip__dot {
background: var(--primary, #10b981);
}
}
&.is-pending {
color: #d97706;
background: #fff7ed;
.oa-person-chip__dot {
background: #d97706;
}
}
&.is-danger {
color: #dc2626;
background: #fef2f2;
.oa-person-chip__dot {
background: #ef4444;
}
}
&.is-mute {
color: #94a3b8;
background: #f8fafc;
.oa-person-chip__dot {
background: #94a3b8;
}
}
}
.oa-person-chip__dot {
@@ -289,6 +399,12 @@
border-radius: 50%;
}
.oa-person-chip__st {
margin-left: 2px;
font-size: 10px;
opacity: 0.85;
}
.oa-flow-badge {
flex-shrink: 0;
padding: 0 5px;
@@ -308,6 +424,11 @@
background: #fff7ed;
}
&.and {
color: #2563eb;
background: #eff6ff;
}
&.danger {
color: #dc2626;
background: #fef2f2;
@@ -68,6 +68,16 @@
:disabled="disabled"
@update:model-value="(v) => onValueChange(idx, coerceValue(rule.field, v))"
/>
<el-button
class="cond-rule-editor__del"
text
type="danger"
:disabled="disabled || localRules.length <= 1"
title="删除条件"
@click="removeRule(idx)"
>
<el-icon><Delete /></el-icon>
</el-button>
</div>
<div v-if="idx < localRules.length - 1" class="cond-rule-editor__and">且(AND)</div>
</div>
@@ -86,7 +96,7 @@
<script setup lang="ts">
import { computed, watch } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import { Delete, Plus } from '@element-plus/icons-vue'
import {
opsForFieldType,
type ConditionCandidate,
@@ -207,6 +217,12 @@
}
])
}
function removeRule(idx: number) {
if (localRules.value.length <= 1) return
const next = localRules.value.filter((_, i) => i !== idx)
emitRules(next)
}
</script>
<style scoped lang="scss">
@@ -230,11 +246,16 @@
.cond-rule-editor__row {
display: grid;
grid-template-columns: 1fr auto 1fr;
grid-template-columns: 1fr auto 1fr auto;
gap: 6px;
align-items: center;
margin-bottom: 6px;
}
.cond-rule-editor__del {
padding: 4px;
}
.cond-rule-editor__and {
margin: 0 0 6px;
color: var(--mint-text-muted, #94a3b8);
@@ -36,8 +36,23 @@
<div class="flow-cond-col__title" @click.stop="emit('edit', node)">
{{ branchTitle(g, idx) }}
</div>
<!-- 分支仅有结束节点时,先露出「+」才能往分支内插入 -->
<el-dropdown
v-if="!g.child || g.child.type === 'end'"
trigger="click"
@command="(cmd: string) => onAddInGroup(idx, cmd)"
>
<button type="button" class="flow-plus" title="在本分支添加节点">+</button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="approval">审批人</el-dropdown-item>
<el-dropdown-item command="cc">抄送人</el-dropdown-item>
<el-dropdown-item command="condition">条件分支</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<FlowBranch
v-if="g.child"
v-if="g.child && g.child.type !== 'end'"
:node="g.child"
:depth="depth + 1"
:candidates="candidates"
@@ -48,6 +63,28 @@
<div v-else class="flow-end">流程结束</div>
</div>
</div>
<!-- 条件分支汇合后继续主链 -->
<el-dropdown trigger="click" @command="(cmd: string) => onAdd(cmd)">
<button type="button" class="flow-plus" title="在条件分支后添加节点">+</button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="approval">审批人</el-dropdown-item>
<el-dropdown-item command="cc">抄送人</el-dropdown-item>
<el-dropdown-item command="condition">条件分支</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<FlowBranch
v-if="node.child"
:node="node.child"
:depth="depth"
:candidates="candidates"
@edit="(n) => emit('edit', n)"
@remove="(id) => emit('remove', id)"
@add="(payload) => emit('add', payload)"
/>
<div v-else class="flow-end">流程结束</div>
</template>
<template v-else>
@@ -102,7 +139,14 @@
const emit = defineEmits<{
edit: [node: FlowNode]
remove: [nodeId: string]
add: [payload: { parentId: string; type: 'approval' | 'cc' | 'condition' }]
add: [
payload: {
parentId: string
type: 'approval' | 'cc' | 'condition'
/** 写入条件节点的第 N 个分支;缺省则写入 parent.child(汇合后主链) */
groupIndex?: number
}
]
}>()
function typeLabel(t: string) {
@@ -134,6 +178,12 @@
emit('add', { parentId: props.node.id, type: cmd })
}
}
function onAddInGroup(groupIndex: number, cmd: string) {
if (cmd === 'approval' || cmd === 'cc' || cmd === 'condition') {
emit('add', { parentId: props.node.id, type: cmd, groupIndex })
}
}
</script>
<style scoped lang="scss">
@@ -459,10 +459,35 @@
return null
}
function onAdd(payload: { parentId: string; type: 'approval' | 'cc' | 'condition' }) {
function onAdd(payload: {
parentId: string
type: 'approval' | 'cc' | 'condition'
groupIndex?: number
}) {
const parent = findNode(root.value, payload.parentId)
if (!parent) return
const neu = createNode(payload.type)
// 写入条件节点的某一分支
if (
parent.type === 'condition' &&
typeof payload.groupIndex === 'number' &&
parent.conditionGroups?.[payload.groupIndex]
) {
const g = parent.conditionGroups[payload.groupIndex]
const old = g.child || createEndNode()
if (payload.type === 'condition') {
const groups = neu.conditionGroups || []
const def = groups.find((x) => x.isDefault) || groups[groups.length - 1]
if (def) def.child = old
} else {
neu.child = old
}
g.child = neu
commit()
return
}
const old = parent.child || createEndNode()
if (payload.type === 'condition') {
const groups = neu.conditionGroups || []
@@ -1,5 +1,6 @@
/** 允许「参与流程条件分支」的 FormCreate type */
export const CONDITION_ELIGIBLE_TYPES = new Set([
'input',
'inputNumber',
'number',
'money',
@@ -20,6 +21,7 @@ export interface ConditionCandidate {
}
export function opsForFieldType(type: string): Array<{ value: ConditionOp; label: string }> {
// 单选/下拉为离散选项,仅等于/不等于;输入框常填数字参与区间比较,与数字/金额/日期同套运算符
if (type === 'radio' || type === 'select') {
return [
{ value: '==', label: '等于' },
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "label": "oa-approval-print.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L1"}, {"id": "utils_oa_approval_print_resolvestamp", "label": "resolveStamp()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L80"}, {"id": "utils_oa_approval_print_statustext", "label": "statusText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L97"}, {"id": "utils_oa_approval_print_formatdateonly", "label": "formatDateOnly()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L101"}, {"id": "utils_oa_approval_print_formatnow", "label": "formatNow()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L107"}, {"id": "utils_oa_approval_print_ishttpurl", "label": "isHttpUrl()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L113"}, {"id": "utils_oa_approval_print_extracturls", "label": "extractUrls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L117"}, {"id": "utils_oa_approval_print_formatscalar", "label": "formatScalar()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L148"}, {"id": "utils_oa_approval_print_walkrules", "label": "walkRules()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L170"}, {"id": "utils_oa_approval_print_buildformrows", "label": "buildFormRows()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L206"}, {"id": "utils_oa_approval_print_buildflowitems", "label": "buildFlowItems()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L226"}, {"id": "utils_oa_approval_print_buildoaprintmodel", "label": "buildOaPrintModel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L316"}, {"id": "utils_oa_approval_print_buildoaprintfilename", "label": "buildOaPrintFilename()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L354"}, {"id": "utils_oa_approval_print_canvastopdf", "label": "canvasToPdf()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L367"}, {"id": "utils_oa_approval_print_exportoaapprovalpdf", "label": "exportOaApprovalPdf()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L401"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "target": "html2canvas", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "target": "jspdf", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "target": "utils_oa_approval_print_resolvestamp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L80", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "target": "utils_oa_approval_print_statustext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-approval-print.ts", "source_location": "L97", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_approval_print_ts", "target": "utils_oa_approval_print_formatdateonly", "relation": "contains",Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "label": "oa-form-create-upload.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L1"}, {"id": "utils_oa_form_create_upload_resolveuploadresponseurl", "label": "resolveUploadResponseUrl()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L25"}, {"id": "utils_oa_form_create_upload_ensureoauploadruleprops", "label": "ensureOaUploadRuleProps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L39"}, {"id": "utils_oa_form_create_upload_setupformcreateupload", "label": "setupFormCreateUpload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L98"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_composables_useattachmentactions", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_resolveuploadresponseurl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L25", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensureoauploadruleprops", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L39", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_setupformcreateupload", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L98", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L26"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L26"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "attachmentFullUrl", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L30"}, {"caller_nid": "utils_oa_form_create_upload_ensureoauploadruleprops", "callee": "isArray", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L40"}, {"caller_nid": "utils_oa_form_create_upload_ensureoauploadruleprops", "callee": "map", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L41"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_roles_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L1"}, {"id": "roles_index_avatarcolor", "label": "avatarColor()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L390"}, {"id": "roles_index_avatarinitial", "label": "avatarInitial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L396"}, {"id": "roles_index_resolveuser", "label": "resolveUser()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L401"}, {"id": "roles_index_memberoptionlabel", "label": "memberOptionLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L405"}, {"id": "roles_index_memberoptionsub", "label": "memberOptionSub()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L412"}, {"id": "roles_index_chiptitle", "label": "chipTitle()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L419"}, {"id": "roles_index_onmemberpick", "label": "onMemberPick()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L424"}, {"id": "roles_index_removemember", "label": "removeMember()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L434"}, {"id": "roles_index_loaddata", "label": "loadData()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L438"}, {"id": "roles_index_handlesearch", "label": "handleSearch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L451"}, {"id": "roles_index_handlereset", "label": "handleReset()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L455"}, {"id": "roles_index_resetform", "label": "resetForm()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L461"}, {"id": "roles_index_handleadd", "label": "handleAdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L469"}, {"id": "roles_index_handleedit", "label": "handleEdit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L477"}, {"id": "roles_index_handlesubmit", "label": "handleSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L489"}, {"id": "roles_index_handledelete", "label": "handleDelete()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L514"}, {"id": "roles_index_loaduseroptions", "label": "loadUserOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L526"}, {"id": "roles_index_handlemembers", "label": "handleMembers()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L545"}, {"id": "roles_index_handlemembersubmit", "label": "handleMemberSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L560"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_roles_index_vue", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L320", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_roles_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/roles/index.vue", "source_location": "L321", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_roles_index_vue", "target"Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "label": "oa-form-create-upload.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L1"}, {"id": "utils_oa_form_create_upload_resolveuploadresponseurl", "label": "resolveUploadResponseUrl()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L25"}, {"id": "utils_oa_form_create_upload_ensureoauploadruleprops", "label": "ensureOaUploadRuleProps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L37"}, {"id": "utils_oa_form_create_upload_setupformcreateupload", "label": "setupFormCreateUpload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L85"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_composables_useattachmentactions", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_resolveuploadresponseurl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L25", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensureoauploadruleprops", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L37", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_setupformcreateupload", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L85", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L26"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L26"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "attachmentFullUrl", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L30"}, {"caller_nid": "utils_oa_form_create_upload_ensureoauploadruleprops", "callee": "isArray", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L38"}, {"caller_nid": "utils_oa_form_create_upload_ensureoauploadruleprops", "callee": "map", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L39"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "label": "oa-condition-fields.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L1"}, {"id": "oa_approval_oa_condition_fields_opsforfieldtype", "label": "opsForFieldType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L23"}, {"id": "oa_approval_oa_condition_fields_walkrules", "label": "walkRules()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L40"}, {"id": "oa_approval_oa_condition_fields_flattenformrules", "label": "flattenFormRules()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L50"}, {"id": "oa_approval_oa_condition_fields_listconditioncandidates", "label": "listConditionCandidates()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L65"}, {"id": "oa_approval_oa_condition_fields_collectconditionreferencedfields", "label": "collectConditionReferencedFields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L91"}, {"id": "oa_approval_oa_condition_fields_normalizeschemaconditionrequired", "label": "normalizeSchemaConditionRequired()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L109"}, {"id": "oa_approval_oa_condition_fields_formatconditionpreview", "label": "formatConditionPreview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L137"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_opsforfieldtype", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L23", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_walkrules", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L40", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_flattenformrules", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L50", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_listconditioncandidates", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L65", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_collectconditionreferencedfields", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L91", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_normalizeschemaconditionrequired", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L109", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_formatconditionpreview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L137", "weight": 1.0}, {"source": "oa_approval_oa_condition_fields_flattenformrules", "target": "oa_approval_oa_condition_fields_walkrules", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-aLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "label": "PreTransitProtocolCardList.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L455", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L456", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_pre_transit_sample", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L457", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_status_tag_registry", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L458", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_status_tag_registry", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L470", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_sample_code_with_special_display_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L471", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_protocol_attachment_mini_readonly_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L472", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_protocol_source_attachment", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L473", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_pre_transit_sample_pretransitprotocolcardlist_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_composables_useattachmentactions", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/pre-transit-sample/PreTransitProtocolCardList.vue", "source_location": "L474", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L1"}, {"id": "start_index_validate", "label": "validate()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L388"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "target": "start_index_validate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L388", "weight": 1.0}], "raw_calls": [{"caller_nid": "start_index_validate", "callee": "warning", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L390"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_conditionruleeditor_vue", "label": "ConditionRuleEditor.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_conditionruleeditor_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue", "source_location": "L99", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_conditionruleeditor_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue", "source_location": "L100", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_conditionruleeditor_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/ConditionRuleEditor.vue", "source_location": "L105", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_instances_detail_vue", "label": "detail.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "label": "main.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L1"}, {"id": "src_main_masksecret", "label": "maskSecret()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L26"}, {"id": "src_main_logapicryptobootinfo", "label": "logApiCryptoBootInfo()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L32"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_patch_el_select_filterable", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_app_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_store", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_locales", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_assets_styles_core_tailwind_css", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L11", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_assets_styles_index_scss", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L12", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_sys_console_ts", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L13", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_directives", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L14", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_sys_error_handle", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L15", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "designer", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L16", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "auto_import", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/main.ts", "source_location": "L17", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload", "relation": "imports_from", "confidence": "EXTRACTED", "source_filLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L1"}, {"id": "start_index_validate", "label": "validate()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L375"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "target": "start_index_validate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L375", "weight": 1.0}], "raw_calls": [{"caller_nid": "start_index_validate", "callee": "warning", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L377"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "label": "main.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L5", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "zh_cn", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "index_css", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "designer", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_main_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/main.ts", "source_location": "L11", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "label": "OaProgressChain.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L1"}, {"id": "oa_approval_oaprogresschain_statustext", "label": "statusText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L97"}, {"id": "oa_approval_oaprogresschain_statusbadge", "label": "statusBadge()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L114"}, {"id": "oa_approval_oaprogresschain_signbadge", "label": "signBadge()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L123"}, {"id": "oa_approval_oaprogresschain_signbadgetext", "label": "signBadgeText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L130"}, {"id": "oa_approval_oaprogresschain_displaypeople", "label": "displayPeople()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L138"}, {"id": "oa_approval_oaprogresschain_personchipclass", "label": "personChipClass()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L151"}, {"id": "oa_approval_oaprogresschain_personstatushint", "label": "personStatusHint()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L160"}, {"id": "oa_approval_oaprogresschain_persontitle", "label": "personTitle()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L171"}, {"id": "oa_approval_oaprogresschain_dotclass", "label": "dotClass()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L176"}, {"id": "oa_approval_oaprogresschain_resolvesourcetext", "label": "resolveSourceText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L184"}, {"id": "oa_approval_oaprogresschain_avatarchar", "label": "avatarChar()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L196"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_statustext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L97", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_statusbadge", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L114", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_signbadge", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L123", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_signbadgetext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L130", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_displaypeople", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L138", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_personchipclass", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vuLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaformdesignerembed_vue", "label": "OaFormDesignerEmbed.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFormDesignerEmbed.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L1"}, {"id": "designer_index_loaddraft", "label": "loadDraft()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L222"}, {"id": "designer_index_savedraft", "label": "saveDraft()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L258"}, {"id": "designer_index_publish", "label": "publish()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L293"}, {"id": "designer_index_goback", "label": "goBack()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L313"}, {"id": "designer_index_onstepchange", "label": "onStepChange()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L317"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "vue_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L113", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L114", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L115", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L116", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L117", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_oaapproval", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L118", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L119", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L120", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaformdesignerembed_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L121", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_designer_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/designer/index.vue", "source_location": "L122", "weight": 1.0}, {"source": "users_wuzilong_work_00codLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "label": "FlowDesigner.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L1"}, {"id": "flow_tree_flowdesigner_commit", "label": "commit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L307"}, {"id": "flow_tree_flowdesigner_avatarcolor", "label": "avatarColor()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L359"}, {"id": "flow_tree_flowdesigner_avatarinitial", "label": "avatarInitial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L365"}, {"id": "flow_tree_flowdesigner_resolveuser", "label": "resolveUser()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L370"}, {"id": "flow_tree_flowdesigner_chiptitle", "label": "chipTitle()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L374"}, {"id": "flow_tree_flowdesigner_memberoptionlabel", "label": "memberOptionLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L379"}, {"id": "flow_tree_flowdesigner_memberoptionsub", "label": "memberOptionSub()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L387"}, {"id": "flow_tree_flowdesigner_onmemberpick", "label": "onMemberPick()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L394"}, {"id": "flow_tree_flowdesigner_removemember", "label": "removeMember()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L403"}, {"id": "flow_tree_flowdesigner_setassigneetype", "label": "setAssigneeType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L408"}, {"id": "flow_tree_flowdesigner_loadroles", "label": "loadRoles()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L413"}, {"id": "flow_tree_flowdesigner_loadusers", "label": "loadUsers()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L423"}, {"id": "flow_tree_flowdesigner_findnode", "label": "findNode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L447"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L250", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L251", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_admin", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L252", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_oaapproval", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowDesigner.vue", "source_location": "L253", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowdesigner_vue", "target": "users_wuziloLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "label": "oa-form-create-upload.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L1"}, {"id": "utils_oa_form_create_upload_resolveuploadresponseurl", "label": "resolveUploadResponseUrl()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L29"}, {"id": "utils_oa_form_create_upload_ensurefcrowuseselrow", "label": "ensureFcRowUsesElRow()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L42"}, {"id": "utils_oa_form_create_upload_ensureuploadrule", "label": "ensureUploadRule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L58"}, {"id": "utils_oa_form_create_upload_ensureoauploadruleprops", "label": "ensureOaUploadRuleProps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L97"}, {"id": "utils_oa_form_create_upload_setupformcreateupload", "label": "setupFormCreateUpload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L126"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_composables_useattachmentactions", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_resolveuploadresponseurl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensurefcrowuseselrow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L42", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensureuploadrule", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L58", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensureoauploadruleprops", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L97", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_setupformcreateupload", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L126", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L30"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L30"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "attachmentFullUrl", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L34"}, {"caller_nid": "utils_oa_form_create_upload_ensurefcrowuseselrow", "callee": "String", "souLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "label": "App.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L1"}, {"id": "oa_fc_host_app_rule", "label": "rule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L46"}, {"id": "oa_fc_host_app_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L271"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "target": "oa_fc_host_app_rule", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L46", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "target": "oa_fc_host_app_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L271", "weight": 1.0}], "raw_calls": [{"caller_nid": "oa_fc_host_app_if", "callee": "setTimeout", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L272"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "label": "FlowBranch.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L1"}, {"id": "flow_tree_flowbranch_branchtitle", "label": "branchTitle()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L160"}, {"id": "flow_tree_flowbranch_nodesummary", "label": "nodeSummary()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L167"}, {"id": "flow_tree_flowbranch_onadd", "label": "onAdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L176"}, {"id": "flow_tree_flowbranch_onaddingroup", "label": "onAddInGroup()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L182"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L119", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L123", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_types", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L124", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L126", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "flow_tree_flowbranch_branchtitle", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L160", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "flow_tree_flowbranch_nodesummary", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L167", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "flow_tree_flowbranch_onadd", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L176", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_flow_tree_flowbranch_vue", "target": "flow_tree_flowbranch_onaddingroup", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L182", "weight": 1.0}], "raw_calls": [{"caller_nid": "flow_tree_flowbranch_branchtitle", "callee": "formatConditionPreview", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L162"}, {"caller_nid": "flow_tree_flowbranch_nodesummary", "callee": "summarizeApprover", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_location": "L173"}, {"caller_nid": "flow_tree_flowbranch_onadd", "callee": "emit", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/flow-tree/FlowBranch.vue", "source_loLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "label": "App.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L1"}, {"id": "oa_fc_host_app_rule", "label": "rule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L43"}, {"id": "oa_fc_host_app_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L235"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "target": "oa_fc_host_app_rule", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L43", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "target": "oa_fc_host_app_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L235", "weight": 1.0}], "raw_calls": [{"caller_nid": "oa_fc_host_app_if", "callee": "setTimeout", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L236"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_instances_detail_vue", "label": "detail.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_protocol_attachment_mini_readonly_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/business/protocol-attachment-mini-readonly/index.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "label": "oa-condition-fields.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L1"}, {"id": "oa_approval_oa_condition_fields_opsforfieldtype", "label": "opsForFieldType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L23"}, {"id": "oa_approval_oa_condition_fields_walkrules", "label": "walkRules()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L41"}, {"id": "oa_approval_oa_condition_fields_flattenformrules", "label": "flattenFormRules()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L51"}, {"id": "oa_approval_oa_condition_fields_listconditioncandidates", "label": "listConditionCandidates()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L66"}, {"id": "oa_approval_oa_condition_fields_collectconditionreferencedfields", "label": "collectConditionReferencedFields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L92"}, {"id": "oa_approval_oa_condition_fields_normalizeschemaconditionrequired", "label": "normalizeSchemaConditionRequired()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L110"}, {"id": "oa_approval_oa_condition_fields_formatconditionpreview", "label": "formatConditionPreview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L138"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_opsforfieldtype", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L23", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_walkrules", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L41", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_flattenformrules", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L51", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_listconditioncandidates", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L66", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_collectconditionreferencedfields", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L92", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_normalizeschemaconditionrequired", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L110", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oa_condition_fields_ts", "target": "oa_approval_oa_condition_fields_formatconditionpreview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/oa-condition-fields.ts", "source_location": "L138", "weight": 1.0}, {"source": "oa_approval_oa_condition_fields_flattenformrules", "target": "oa_approval_oa_condition_fields_walkrules", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-aLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "label": "OaProgressChain.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L1"}, {"id": "oa_approval_oaprogresschain_statustext", "label": "statusText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L97"}, {"id": "oa_approval_oaprogresschain_statusbadge", "label": "statusBadge()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L114"}, {"id": "oa_approval_oaprogresschain_signbadge", "label": "signBadge()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L123"}, {"id": "oa_approval_oaprogresschain_signbadgetext", "label": "signBadgeText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L130"}, {"id": "oa_approval_oaprogresschain_displaypeople", "label": "displayPeople()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L138"}, {"id": "oa_approval_oaprogresschain_personchipclass", "label": "personChipClass()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L151"}, {"id": "oa_approval_oaprogresschain_personstatushint", "label": "personStatusHint()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L160"}, {"id": "oa_approval_oaprogresschain_persontitle", "label": "personTitle()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L170"}, {"id": "oa_approval_oaprogresschain_dotclass", "label": "dotClass()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L175"}, {"id": "oa_approval_oaprogresschain_resolvesourcetext", "label": "resolveSourceText()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L183"}, {"id": "oa_approval_oaprogresschain_avatarchar", "label": "avatarChar()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L195"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_statustext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L97", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_statusbadge", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L114", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_signbadge", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L123", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_signbadgetext", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L130", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_displaypeople", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vue", "source_location": "L138", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaprogresschain_vue", "target": "oa_approval_oaprogresschain_personchipclass", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaProgressChain.vuLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_instances_detail_vue", "label": "detail.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L1"}, {"id": "apps_index_loadgroups", "label": "loadGroups()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L364"}, {"id": "apps_index_loaddata", "label": "loadData()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L369"}, {"id": "apps_index_handlesearch", "label": "handleSearch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L379"}, {"id": "apps_index_resetform", "label": "resetForm()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L383"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "vue_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L264", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L265", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L266", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L267", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L280", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_oaapproval", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L281", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_app_icons", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L291", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "core", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L292", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "apps_index_loadgroups", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L364", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "apps_index_loaddata", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L369", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "apps_index_handlesearch", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location": "L379", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_apps_index_vue", "target": "apps_index_resetform", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/apps/index.vue", "source_location":Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L1"}, {"id": "start_index_validate", "label": "validate()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L345"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "target": "start_index_validate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L345", "weight": 1.0}], "raw_calls": [{"caller_nid": "start_index_validate", "callee": "warning", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L347"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_instances_detail_vue", "label": "detail.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/instances/detail.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "label": "App.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L1"}, {"id": "oa_fc_host_app_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L170"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_oa_fc_host_app_vue", "target": "oa_fc_host_app_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L170", "weight": 1.0}], "raw_calls": [{"caller_nid": "oa_fc_host_app_if", "callee": "setTimeout", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/oa-fc-host/App.vue", "source_location": "L171"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oafcrow_vue", "label": "OaFcRow.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFcRow.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L1"}, {"id": "start_index_validate", "label": "validate()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L385"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_oa_approval_start_index_vue", "target": "start_index_validate", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L385", "weight": 1.0}], "raw_calls": [{"caller_nid": "start_index_validate", "callee": "warning", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/oa-approval/start/index.vue", "source_location": "L387"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oaflowpreview_vue", "label": "OaFlowPreview.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/components/oa-approval/OaFlowPreview.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "label": "oa-form-create-upload.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L1"}, {"id": "utils_oa_form_create_upload_resolveuploadresponseurl", "label": "resolveUploadResponseUrl()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L30"}, {"id": "utils_oa_form_create_upload_ensureuploadrule", "label": "ensureUploadRule()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L38"}, {"id": "utils_oa_form_create_upload_ensureoauploadruleprops", "label": "ensureOaUploadRuleProps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L75"}, {"id": "utils_oa_form_create_upload_setupformcreateupload", "label": "setupFormCreateUpload()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L103"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L6", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_business", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L7", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_composables_useattachmentactions", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L8", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_oa_approval_oafcrow_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_resolveuploadresponseurl", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L30", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensureuploadrule", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L38", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_ensureoauploadruleprops", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L75", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_oa_form_create_upload_ts", "target": "utils_oa_form_create_upload_setupformcreateupload", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L103", "weight": 1.0}], "raw_calls": [{"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L31"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L31"}, {"caller_nid": "utils_oa_form_create_upload_resolveuploadresponseurl", "callee": "attachmentFullUrl", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L35"}, {"caller_nid": "utils_oa_form_create_upload_ensureuploadrule", "callee": "has", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/oa-form-create-upload.ts", "source_location": "L39"}, {"caller_nid": "utils_oa_form_create_upload_ensureuploadrule", "callee": "String", "source_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_oaapproval_ts", "label": "oaApproval.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L1"}, {"id": "api_oaapproval_fetchoarolelist", "label": "fetchOaRoleList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L9"}, {"id": "api_oaapproval_fetchensureoarolepresets", "label": "fetchEnsureOaRolePresets()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L16"}, {"id": "api_oaapproval_fetchcreateoarole", "label": "fetchCreateOaRole()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L23"}, {"id": "api_oaapproval_fetchupdateoarole", "label": "fetchUpdateOaRole()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L37"}, {"id": "api_oaapproval_fetchdeleteoarole", "label": "fetchDeleteOaRole()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L53"}, {"id": "api_oaapproval_fetchoaroleusers", "label": "fetchOaRoleUsers()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L60"}, {"id": "api_oaapproval_fetchreplaceoaroleusers", "label": "fetchReplaceOaRoleUsers()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L66"}, {"id": "api_oaapproval_fetchoagrouplist", "label": "fetchOaGroupList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L78"}, {"id": "api_oaapproval_fetchcreateoagroup", "label": "fetchCreateOaGroup()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L82"}, {"id": "api_oaapproval_fetchupdateoagroup", "label": "fetchUpdateOaGroup()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L94"}, {"id": "api_oaapproval_fetchdeleteoagroup", "label": "fetchDeleteOaGroup()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L105"}, {"id": "api_oaapproval_fetchoaapplist", "label": "fetchOaAppList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L112"}, {"id": "api_oaapproval_fetchcreateoaapp", "label": "fetchCreateOaApp()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L123"}, {"id": "api_oaapproval_fetchupdateoaapp", "label": "fetchUpdateOaApp()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L131"}, {"id": "api_oaapproval_fetchdeleteoaapp", "label": "fetchDeleteOaApp()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L139"}, {"id": "api_oaapproval_fetchoaappdraft", "label": "fetchOaAppDraft()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L146"}, {"id": "api_oaapproval_fetchsaveoaappdraft", "label": "fetchSaveOaAppDraft()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L150"}, {"id": "api_oaapproval_fetchpublishoaapp", "label": "fetchPublishOaApp()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L166"}, {"id": "api_oaapproval_fetchoatemplates", "label": "fetchOaTemplates()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L177"}, {"id": "api_oaapproval_fetchoatemplatedetail", "label": "fetchOaTemplateDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L181"}, {"id": "api_oaapproval_fetchoaflowpreview", "label": "fetchOaFlowPreview()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L186"}, {"id": "api_oaapproval_fetchstartoainstance", "label": "fetchStartOaInstance()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "source_location": "L215"}, {"id": "api_oaapproval_fetchoainstancedetail", "label": "fetchOaInstanceDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/oaApproval.ts", "sLine truncated
+3
View File
@@ -15,10 +15,13 @@ import { setupGlobDirectives } from './directives'
import { setupErrorHandle } from './utils/sys/error-handle'
import FcDesigner from '@form-create/designer'
import formCreateAutoImport from '@form-create/element-ui/auto-import'
import { setupFormCreateUpload } from '@/utils/oa-form-create-upload'
// FormCreate 按字符串解析 el-input / fc-radio 等,主应用是按需自动导入,不会全局注册;
// 必须挂上官方 auto-import,否则发起审批/详情里动态表单控件会残缺(如单选项只剩文字)。
FcDesigner.formCreate.use(formCreateAutoImport)
// 内置「上传」默认 action=/,改为走附件上传 API,避免 POST 前端原点 404
setupFormCreateUpload(FcDesigner.formCreate)
function maskSecret(value?: string) {
if (!value) return '(empty)'
+198 -108
View File
@@ -8,15 +8,6 @@
:config="designerConfig"
:locale="fcLocale"
/>
<div v-show="showCondFlag" class="oa-cond-flag">
<div class="oa-cond-flag__row">
<el-switch :model-value="flagOn" @change="onFlagChange" />
<div>
<div class="oa-cond-flag__title">参与流程条件分支</div>
<div class="oa-cond-flag__tip">勾选后该字段必填且不可改为选填;可在「3 流程设计」条件中选用</div>
</div>
</div>
</div>
</div>
</template>
@@ -31,6 +22,9 @@
type DesignerApi = {
getRule?: () => unknown
getOption?: () => unknown
/** 含 $FNX 回调的可持久化 JSON(勿用 getRule 直接 postMessage) */
getJson?: () => string
getOptionsJson?: () => string
setRule?: (rule: unknown[]) => void
setOption?: (option: unknown) => void
}
@@ -39,10 +33,32 @@
const fcLocale = formCreateZh
let pendingSchema: { rule: unknown; option: unknown } | null = null
const COND_FIELD = 'formCreateUseInCondition'
const designerConfig = {
showSaveBtn: false,
showDevice: true,
showAi: false
showAi: false,
/** 让右侧「组件配置」能读写 rule.useInCondition */
appendConfigData: [COND_FIELD],
baseRule: {
append: true,
rule() {
return [
{
type: 'switch',
field: COND_FIELD,
title: '参与流程条件分支',
value: false,
info: '勾选后该字段必填且不可改为选填;可在「3 流程设计」条件中选用',
props: {
activeText: '是',
inactiveText: '否'
}
}
]
}
}
}
const MSG = {
@@ -54,19 +70,20 @@
} as const
const flowConditionFields = ref<string[]>([])
const showCondFlag = ref(false)
const flagOn = ref(false)
const lockRequired = ref(false)
let pollTimer: number | null = null
let lastActiveId = ''
let lastFlagOn: boolean | null = null
let lastEligible: boolean | null = null
function getDesigner(): DesignerApi | null {
const inst = designerRef.value as any
if (!inst) return null
// FormCreate 官方内部多用 setupState;优先走这条,避免拿到残缺代理
if (typeof inst.setupState?.setRule === 'function') return inst.setupState
if (typeof inst.setRule === 'function') return inst
if (inst.$ && typeof inst.$.exposed?.setRule === 'function') return inst.$.exposed
if (typeof inst.setupState?.setRule === 'function') return inst.setupState
return inst
return null
}
function getSetupState(): any {
@@ -94,75 +111,165 @@
}
}
function syncActivePanel() {
const rule = getActiveRule()
const type = String(rule?.type || '')
const eligible = !!(rule?.field && CONDITION_ELIGIBLE_TYPES.has(type))
showCondFlag.value = eligible
if (!eligible) {
flagOn.value = false
lockRequired.value = false
lastActiveId = ''
return
}
const id = String(rule._fc_id || rule.field || '')
const on = readFlag(rule)
flagOn.value = on
lockRequired.value = on
if (on) applyFlagToRule(rule, true)
lastActiveId = id
}
function onFlagChange(val: string | number | boolean) {
const on = !!val
const rule = getActiveRule()
if (!rule?.field) return
if (!on) {
const field = String(rule.field)
if (flowConditionFields.value.includes(field)) {
ElMessage.warning('请先在流程设计中删除对该字段的条件')
flagOn.value = true
return
}
applyFlagToRule(rule, false)
flagOn.value = false
lockRequired.value = false
return
}
applyFlagToRule(rule, true)
flagOn.value = true
lockRequired.value = true
// 同步校验面板必填开关
/** 在「组件配置」基础表单中显示/隐藏开关(设计器选中后会重置 hidden,需持续同步) */
function syncCondFieldVisibility(eligible: boolean) {
const state = getSetupState()
const api = state?.baseForm?.api
if (!api) return
try {
const state = getSetupState()
const vapi = state?.validateForm?.api
if (vapi?.setValue) {
const cur = typeof vapi.formData === 'function' ? vapi.formData() : {}
vapi.setValue({ ...cur, $required: true })
if (typeof api.hidden === 'function') {
api.hidden(!eligible, COND_FIELD)
}
const all = typeof api.all === 'function' ? api.all() : []
if (Array.isArray(all)) {
all.forEach((item: any) => {
if (item?.field === COND_FIELD || item?.name === COND_FIELD) {
item.hidden = !eligible
}
})
}
} catch {
/* ignore */
}
}
function readSchema() {
const d = getDesigner()
return {
rule: d?.getRule?.() ?? [],
option: d?.getOption?.() ?? {}
function syncRequiredLock(on: boolean) {
lockRequired.value = on
const state = getSetupState()
const vapi = state?.validateForm?.api
if (!vapi) return
try {
if (on) {
if (typeof vapi.setValue === 'function') {
const cur = typeof vapi.formData === 'function' ? vapi.formData() : {}
vapi.setValue({ ...cur, $required: true })
}
if (typeof vapi.disabled === 'function') {
vapi.disabled(true, '$required')
}
} else if (typeof vapi.disabled === 'function') {
vapi.disabled(false, '$required')
}
} catch {
/* ignore */
}
}
function syncBaseFormFlag(on: boolean) {
const state = getSetupState()
const api = state?.baseForm?.api
if (!api?.setValue) return
try {
const cur = typeof api.formData === 'function' ? api.formData() : {}
api.setValue({ ...cur, [COND_FIELD]: on })
} catch {
/* ignore */
}
}
function syncActivePanel() {
const rule = getActiveRule()
const type = String(rule?.type || '')
const eligible = !!(rule?.field && CONDITION_ELIGIBLE_TYPES.has(type))
const id = rule ? String(rule._fc_id || rule.field || '') : ''
if (!eligible) {
syncCondFieldVisibility(false)
if (lastEligible !== false || id !== lastActiveId) {
syncRequiredLock(false)
}
lastActiveId = id
lastFlagOn = null
lastEligible = false
return
}
syncCondFieldVisibility(true)
let on = readFlag(rule)
// 用户在面板关掉开关,但流程仍引用该字段 → 拦截并回滚
if (
lastFlagOn === true &&
on === false &&
id === lastActiveId &&
flowConditionFields.value.includes(String(rule.field))
) {
ElMessage.warning('请先在流程设计中删除对该字段的条件')
applyFlagToRule(rule, true)
syncBaseFormFlag(true)
on = true
}
if (on) {
applyFlagToRule(rule, true)
}
if (on !== lastFlagOn || id !== lastActiveId || lastEligible !== true) {
syncRequiredLock(on)
syncBaseFormFlag(on)
}
lastActiveId = id
lastFlagOn = on
lastEligible = true
}
/**
* 导出可克隆的纯 JSON schema。
* Upload 等控件的 onSuccess 在运行时是函数(由 $FNX 编译),
* structured clone / postMessage 无法传递函数;必须走 FormCreate 的 toJson(getJson)。
*/
function readSchema(): { rule: unknown; option: unknown } {
const d = getDesigner()
try {
if (typeof d?.getJson === 'function') {
const ruleRaw = JSON.parse(d.getJson() || '[]')
let option: unknown = {}
if (typeof d.getOptionsJson === 'function') {
option = JSON.parse(d.getOptionsJson() || '{}')
} else {
option = JSON.parse(JSON.stringify(d.getOption?.() ?? {}))
}
return {
rule: Array.isArray(ruleRaw) ? ruleRaw : [],
option: option && typeof option === 'object' ? option : {}
}
}
} catch (e) {
console.warn('[oa-fc-host] readSchema getJson failed, fallback', e)
}
// 兜底:剥离函数,至少保证 postMessage 不抛错(可能丢失 onSuccess 等回调)
try {
const plain = JSON.parse(
JSON.stringify({
rule: d?.getRule?.() ?? [],
option: d?.getOption?.() ?? {}
})
)
return {
rule: Array.isArray(plain?.rule) ? plain.rule : [],
option: plain?.option && typeof plain.option === 'object' ? plain.option : {}
}
} catch {
return { rule: [], option: {} }
}
}
function countRules(rules: unknown): number {
return Array.isArray(rules) ? rules.length : 0
}
async function applySchema(schema: any, attempt = 0) {
const rule = Array.isArray(schema?.rule) ? schema.rule : Array.isArray(schema) ? schema : []
const option = schema?.option && typeof schema.option === 'object' ? schema.option : {}
pendingSchema = { rule, option }
const expectCount = countRules(rule)
await nextTick()
const d = getDesigner()
if (!d?.setRule) {
if (attempt < 8) {
window.setTimeout(() => void applySchema(schema, attempt + 1), 40 * (attempt + 1))
if (attempt < 12) {
window.setTimeout(() => void applySchema(schema, attempt + 1), 50 * (attempt + 1))
}
return
}
@@ -172,12 +279,18 @@
if (d.setOption) {
d.setOption(JSON.parse(JSON.stringify(option)))
}
// 校验是否真正落到画布;菜单未就绪时 loadRule 可能静默失败
const applied = countRules(d.getRule?.() ?? [])
if (expectCount > 0 && applied < expectCount && attempt < 12) {
window.setTimeout(() => void applySchema(schema, attempt + 1), 80 * (attempt + 1))
return
}
pendingSchema = null
window.setTimeout(() => syncActivePanel(), 80)
} catch (e) {
console.warn('[oa-fc-host] applySchema failed', e)
if (attempt < 5) {
window.setTimeout(() => void applySchema(schema, attempt + 1), 80)
if (attempt < 12) {
window.setTimeout(() => void applySchema(schema, attempt + 1), 80 * (attempt + 1))
}
}
}
@@ -190,10 +303,23 @@
return
}
if (data.type === MSG.GET) {
window.parent?.postMessage(
{ type: MSG.SCHEMA, schema: readSchema(), requestId: data.requestId },
'*'
)
try {
window.parent?.postMessage(
{ type: MSG.SCHEMA, schema: readSchema(), requestId: data.requestId },
'*'
)
} catch (e) {
console.error('[oa-fc-host] postMessage schema failed', e)
window.parent?.postMessage(
{
type: MSG.SCHEMA,
schema: { rule: [], option: {} },
requestId: data.requestId,
error: 'schema-not-clonable'
},
'*'
)
}
return
}
if (data.type === MSG.FLOW_REFS) {
@@ -224,11 +350,7 @@
void applySchema(pendingSchema)
}
pollTimer = window.setInterval(() => {
const rule = getActiveRule()
const id = rule ? String(rule._fc_id || rule.field || '') : ''
if (id !== lastActiveId || (rule && readFlag(rule) !== flagOn.value)) {
syncActivePanel()
}
syncActivePanel()
}, 250)
})
@@ -271,38 +393,6 @@
height: 100% !important;
}
.oa-cond-flag {
position: absolute;
top: 56px;
right: 12px;
z-index: 30;
width: 292px;
padding: 12px;
background: #ecfdf5;
border: 1px dashed #a7f3d0;
border-radius: 8px;
box-shadow: 0 2px 8px rgb(15 23 42 / 8%);
}
.oa-cond-flag__row {
display: flex;
gap: 10px;
align-items: flex-start;
}
.oa-cond-flag__title {
font-size: 13px;
font-weight: 600;
color: #059669;
}
.oa-cond-flag__tip {
margin-top: 2px;
font-size: 12px;
line-height: 1.4;
color: #64748b;
}
/* 参与分支时锁定「是否必填」 */
.oa-fc-host--lock-required ._fc-r .el-form-item:has([name='$required']),
.oa-fc-host--lock-required ._fc-r .el-form-item:has(.fc-required),
+2
View File
@@ -7,6 +7,7 @@ import zhCn from 'element-plus/es/locale/lang/zh-cn'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import 'element-plus/dist/index.css'
import FcDesigner from '@form-create/designer'
import { setupFormCreateUpload } from '@/utils/oa-form-create-upload'
import App from './App.vue'
const app = createApp(App)
@@ -18,4 +19,5 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.use(ElementPlus, { locale: zhCn })
app.use(FcDesigner)
app.use(FcDesigner.formCreate)
setupFormCreateUpload(FcDesigner.formCreate)
app.mount('#app')
+29 -4
View File
@@ -238,18 +238,42 @@ function buildFlowItems(detail: any): OaPrintFlowItem[] {
ccBuf = null
}
const peopleNames = (p: any): string[] => {
const people = Array.isArray(p?.people) ? p.people : []
const fromPeople = people
.map((x: any) => {
const n = String(x?.nickName || x?.id || '').trim()
if (!n) return ''
const st = String(x?.status || '')
if (st === 'approved') return `${n}(已同意)`
if (st === 'rejected') return `${n}(已拒绝)`
if (st === 'returned') return `${n}(已打回)`
if (st === 'pending' || st === 'running') return `${n}(待处理)`
if (st === 'done') return `${n}(无需处理)`
return n
})
.filter(Boolean)
if (fromPeople.length) return fromPeople
const name = String(p.assigneeUserName || p.assigneeUserId || '').trim()
return name ? [name] : []
}
for (const p of list) {
const kind = String(p.kind || '')
const taskType = String(p.taskType || '')
const title = String(p.title || '-').trim()
const name = String(p.assigneeUserName || p.assigneeUserId || '').trim()
const names = peopleNames(p)
const name = names.join(',')
const ts = String(p.timestamp || '').trim()
const comment = String(p.commentText || '').trim()
const st = statusText(String(p.status || ''))
const signMode = String(p.signMode || '')
const signLabel = signMode === 'and' ? '会签' : signMode === 'or' ? '或签' : ''
if (taskType === 'cc') {
if (!ccBuf) ccBuf = { names: [], ts }
if (name) ccBuf.names.push(name)
if (names.length) ccBuf.names.push(...names.map((n) => n.replace(/\(.*?\)\s*$/, '')))
else if (name) ccBuf.names.push(name)
if (ts) ccBuf.ts = ts
continue
}
@@ -277,9 +301,10 @@ function buildFlowItems(detail: any): OaPrintFlowItem[] {
})
continue
}
// task
// task(或签/会签同节点多人已合并)
const head = signLabel ? `【${title}·${signLabel}】` : `【${title}】`
items.push({
left: name ? `【${title}】 ${name} ${st}` : `【${title}】 ${st}`,
left: name ? `${head} ${name} ${st}` : `${head} ${st}`,
right: ts,
comment: comment || undefined
})
@@ -0,0 +1,164 @@
/**
* FormCreate 运行时补丁:
* - 内置 upload 默认 action 为「/」,会 POST 到前端原点导致 404;接管为附件上传 API
* - 运行时注册 FcRow(flex ._fd-row),间距与铺满由 oa-fc-runtime.scss 处理
*/
import { ElMessage } from 'element-plus'
import { fetchUploadAttachment } from '@/api/business'
import { attachmentFullUrl } from '@/composables/useAttachmentActions'
import OaFcRow from '@/components/oa-approval/OaFcRow.vue'
type FcFetchOptions = {
source?: string
file?: File
filename?: string
data?: Record<string, unknown>
action?: string
onSuccess?: (res: unknown) => void
onError?: (err: unknown) => void
[key: string]: unknown
}
const FLAG = '__oaUploadConfigured'
const UPLOAD_TYPES = new Set(['upload', 'fcUpload'])
/** 与业务表单 `.form-grid-2` 横向间距对齐(顶层 option.row.gutter / CSS --oa-fc-gutter) */
export const OA_FC_DEFAULT_GUTTER = 20
/** 从上传接口响应中取出可回显的 url(兼容 FormCreate 默认 onSuccess) */
export function resolveUploadResponseUrl(res: any): string {
const raw = String(
res?.data?.url || res?.data?.fileUrl || res?.fileUrl || res?.url || ''
).trim()
if (!raw) return ''
return attachmentFullUrl(raw) || raw
}
function ensureUploadRule(rule: any) {
if (!UPLOAD_TYPES.has(String(rule.type || ''))) return
const props = { ...(rule.props || {}) }
if (!props.action || props.action === '/') {
props.action = '#'
}
const prevSuccess = props.onSuccess
// `$FNX:...` 须留给 FormCreate 编译;替换成函数会丢掉官方 file.url = res.data.url
if (typeof prevSuccess === 'string' && prevSuccess.includes('$FNX')) {
// keep
} else if (typeof prevSuccess === 'function') {
props.onSuccess = (res: any, file: any) => {
try {
prevSuccess(res, file)
} catch {
/* ignore */
}
const url = resolveUploadResponseUrl(res)
// Element Plus 选文件时已写入 blob: URL,必须强制覆盖
if (url && file) {
file.url = url
}
}
} else if (!prevSuccess) {
props.onSuccess = (res: any, file: any) => {
const url = resolveUploadResponseUrl(res)
if (url && file) {
file.url = url
}
}
}
rule.props = props
}
/**
* 运行时补齐 FormCreate rule(upload action / onSuccess)
*/
export function ensureOaUploadRuleProps(rules: unknown): any[] {
if (!Array.isArray(rules)) return []
return rules.map((raw) => {
if (!raw || typeof raw !== 'object') return raw
const rule: any = { ...(raw as object) }
ensureUploadRule(rule)
if (Array.isArray(rule.children)) {
rule.children = ensureOaUploadRuleProps(rule.children)
}
if (Array.isArray(rule.props?.rule)) {
rule.props = {
...rule.props,
rule: ensureOaUploadRuleProps(rule.props.rule)
}
}
if (Array.isArray(rule.control)) {
rule.control = rule.control.map((c: any) => {
if (!c || typeof c !== 'object') return c
if (Array.isArray(c.rule)) {
return { ...c, rule: ensureOaUploadRuleProps(c.rule) }
}
return c
})
}
return rule
})
}
export function setupFormCreateUpload(formCreate: {
fetch?: (opts: FcFetchOptions) => void
component?: (name: string, component: unknown) => void
}) {
if (!formCreate || (formCreate as any)[FLAG]) return
// 主应用 formCreate 默认未挂设计器 FcRow;用 flex 行保证栅格铺满,间距走 CSS
if (typeof formCreate.component === 'function') {
formCreate.component('fcRow', OaFcRow)
formCreate.component('FcRow', OaFcRow)
}
const prevFetch = formCreate.fetch
formCreate.fetch = (options: FcFetchOptions) => {
const isUpload = options?.source === 'upload' || !!options?.file
if (!isUpload) {
if (typeof prevFetch === 'function') {
return prevFetch(options)
}
return
}
void (async () => {
try {
const file = options.file
if (!file) {
throw new Error('未选择文件')
}
const fd = new FormData()
fd.append('file', file)
fd.append('folder', 'oa-approval')
const extra = options.data
if (extra && typeof extra === 'object') {
Object.entries(extra).forEach(([k, v]) => {
if (v != null && k !== 'file' && k !== 'folder') {
fd.append(k, String(v))
}
})
}
const res: any = await fetchUploadAttachment(fd)
const rawUrl = String(res?.fileUrl || res?.data?.fileUrl || '').trim()
if (!rawUrl) {
throw new Error('上传失败:未返回文件地址')
}
// 预览用完整 URL;设计器默认 onSuccess 为 file.url = res.data.url
const url = attachmentFullUrl(rawUrl) || rawUrl
options.onSuccess?.({
data: { url, fileUrl: rawUrl },
fileUrl: rawUrl,
url
})
} catch (e) {
const msg = e instanceof Error ? e.message : '上传失败'
ElMessage.error(msg)
options.onError?.(e)
}
})()
}
;(formCreate as any)[FLAG] = true
}
@@ -260,7 +260,7 @@
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref } from 'vue'
import { computed, onActivated, onMounted, reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { UploadRequestOptions } from 'element-plus'
@@ -536,10 +536,14 @@
{ debounce: 200 }
)
onMounted(async () => {
async function refresh() {
await loadGroups()
await loadData()
})
}
onMounted(refresh)
// KeepAlive 下从设计器返回时不会再次 onMounted,需在激活时刷新列表
onActivated(refresh)
</script>
<style scoped lang="scss">
@@ -70,6 +70,7 @@
<div v-show="activeStep === 'form'" class="oa-designer__form-step">
<OaFormDesignerEmbed
v-if="formDesignerMounted"
:key="formDesignerEpoch"
ref="formEmbedRef"
v-model="formSchema"
:flow-condition-fields="flowConditionFields"
@@ -108,7 +109,7 @@
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref } from 'vue'
import { computed, nextTick, onMounted, reactive, ref } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { UploadRequestOptions } from 'element-plus'
@@ -137,10 +138,13 @@
const activeStep = ref('basic')
const draft = ref<any>(null)
/** iframe 表单设计器(与主应用 Tailwind 隔离) */
const formEmbedRef = ref<{ fetchSchema: () => Promise<{ rule: unknown; option: unknown }> } | null>(
null
)
const formEmbedRef = ref<{
fetchSchema: () => Promise<{ rule: unknown; option: unknown }>
reapplySchema?: () => void
} | null>(null)
const formDesignerMounted = ref(false)
/** 每次进入表单 Tab 递增,强制重建 iframe,避免 display:none 后画布丢控件 */
const formDesignerEpoch = ref(0)
const formSchema = ref<{ rule: unknown; option: unknown }>({ rule: [], option: {} })
const basic = reactive({
@@ -268,6 +272,19 @@
advancedSettingsJson: { ...advanced }
})
draft.value = data
// 以服务端回包为准同步本地,避免与 iframe 内容漂移
const fs = data?.formSchemaJson
if (fs) {
try {
const plain = JSON.parse(JSON.stringify(fs))
formSchema.value = {
rule: Array.isArray(plain?.rule) ? plain.rule : Array.isArray(plain) ? plain : [],
option: plain?.option && typeof plain.option === 'object' ? plain.option : {}
}
} catch {
/* keep collected schema */
}
}
} finally {
saving.value = false
}
@@ -307,13 +324,20 @@
}
}
if (name === 'form') {
// 先卸载再挂载:隐藏态 iframe 内 FormCreate 画布易丢控件,重建后按 formSchema 回显
formDesignerMounted.value = false
formDesignerEpoch.value += 1
await nextTick()
formDesignerMounted.value = true
await nextTick()
formEmbedRef.value?.reapplySchema?.()
}
}
onMounted(async () => {
await loadDraft()
if (activeStep.value === 'form') {
formDesignerEpoch.value += 1
formDesignerMounted.value = true
}
})
@@ -153,6 +153,10 @@
import OaProgressChain from '@/components/oa-approval/OaProgressChain.vue'
import { MAX_ADMIN_LIST_PAGE_SIZE } from '@/utils/fetch-paged-list'
import { useUserStore } from '@/store/modules/user'
import {
OA_FC_DEFAULT_GUTTER,
ensureOaUploadRuleProps
} from '@/utils/oa-form-create-upload'
defineOptions({ name: 'OaApprovalInstanceDetail' })
@@ -166,6 +170,7 @@
const viewRule = ref<any[]>([])
const viewOption = ref({
form: { disabled: true, labelPosition: 'top' },
row: { gutter: OA_FC_DEFAULT_GUTTER },
submitBtn: false,
resetBtn: false
})
@@ -182,7 +187,7 @@
const list = detail.value?.progress
if (!Array.isArray(list) || !list.length) return []
return list.map((p: any, idx: number) => ({
key: `${p.kind}-${p.taskId || p.nodeKey || idx}-${p.roundNo || 1}`,
key: `${p.kind}-${p.nodeKey || p.taskId || idx}-${p.roundNo || 1}`,
title: p.title || '-',
status: p.status || 'info',
timestamp: p.timestamp || '',
@@ -191,7 +196,18 @@
commentText: p.commentText || '',
taskType: p.taskType || '',
kind: p.kind || '',
roundNo: p.roundNo || 1
roundNo: p.roundNo || 1,
signMode: p.signMode || '',
people: Array.isArray(p.people)
? p.people.map((x: any) => ({
id: x.id || '',
nickName: x.nickName || x.id || '',
status: x.status || '',
timestamp: x.timestamp || '',
commentText: x.commentText || '',
taskId: x.taskId || ''
}))
: []
}))
})
@@ -246,10 +262,16 @@
function applySchema(schema: any, data: any) {
viewFormData.value = { ...(data || {}) }
const rule = Array.isArray(schema?.rule) ? schema.rule : Array.isArray(schema) ? schema : []
viewRule.value = rule
viewRule.value = ensureOaUploadRuleProps(rule)
const savedGutter = Number(schema?.option?.row?.gutter)
viewOption.value = {
...(schema?.option || {}),
form: { ...(schema?.option?.form || {}), disabled: true, labelPosition: 'top' },
// 顶层字段 col.span 布局用;栅格组件 fcRow 由 ensureOaUploadRuleProps 处理
row: {
...(schema?.option?.row || {}),
gutter: savedGutter > 0 ? savedGutter : OA_FC_DEFAULT_GUTTER
},
submitBtn: false,
resetBtn: false
}
+317 -21
View File
@@ -218,25 +218,81 @@
:close-on-click-modal="false"
>
<el-form label-position="top">
<el-form-item label="绑定用户">
<el-select
v-model="memberUserIds"
multiple
filterable
clearable
collapse-tags
collapse-tags-tooltip
placeholder="请选择用户"
style="width: 100%"
:loading="memberLoading"
>
<el-option
v-for="u in userOptions"
:key="u.id"
:label="`${u.nickName}(${u.userNo})`"
:value="u.id"
/>
</el-select>
<el-form-item>
<template #label>
绑定用户
<span class="form-label-tip">可多选,已选成员将展示在下方列表</span>
</template>
<div v-loading="memberLoading" class="member-picker">
<el-select
v-model="memberPickBuffer"
filterable
clearable
:loading="memberLoading"
placeholder="搜索姓名 / 工号,点击添加"
style="width: 100%"
popper-class="oa-role-member-select-popper"
@change="onMemberPick"
>
<el-option
v-for="u in userOptions"
:key="u.id"
:label="memberOptionLabel(u)"
:value="u.id"
:disabled="memberUserIds.includes(u.id)"
>
<div class="member-option">
<span class="member-avatar" :style="{ background: avatarColor(u.id) }">
{{ avatarInitial(u.nickName) }}
</span>
<span class="member-option__meta">
<span class="member-option__name">{{ u.nickName || '未命名' }}</span>
<span v-if="memberOptionSub(u)" class="member-option__sub">
{{ memberOptionSub(u) }}
</span>
</span>
<el-tag
v-if="memberUserIds.includes(u.id)"
size="small"
type="info"
effect="plain"
class="member-option__tag"
>
已选
</el-tag>
</div>
</el-option>
</el-select>
<div
class="member-chips"
:class="{ 'is-empty': !memberUserIds.length }"
>
<template v-if="memberUserIds.length">
<span v-for="id in memberUserIds" :key="id" class="member-chip">
<span
class="member-avatar member-avatar--sm"
:style="{ background: avatarColor(id) }"
>
{{ avatarInitial(resolveUser(id)?.nickName) }}
</span>
<span class="member-chip__name" :title="chipTitle(id)">
{{ resolveUser(id)?.nickName || id }}
</span>
<button
type="button"
class="member-chip__rm"
:aria-label="`移除 ${resolveUser(id)?.nickName || id}`"
@click="removeMember(id)"
>
×
</button>
</span>
</template>
<template v-else>暂未选择成员,请从上方搜索添加</template>
</div>
<p class="member-picked-count">已选 {{ memberUserIds.length }} 人</p>
</div>
</el-form-item>
</el-form>
<template #footer>
@@ -261,7 +317,7 @@
<script setup lang="ts">
import { formatDisplayOrDash } from '@/utils/datetime-display'
import { onMounted, reactive, ref } from 'vue'
import { nextTick, onMounted, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import {
Plus,
@@ -310,12 +366,74 @@
status: [{ required: true, message: '请选择状态', trigger: 'change' }]
}
type UserOption = { id: string; nickName: string; userNo: string }
const AVATAR_COLORS = [
'#059669',
'#0ea5e9',
'#8b5cf6',
'#d97706',
'#ef4444',
'#14b8a6',
'#6366f1',
'#ec4899'
]
const memberVisible = ref(false)
const memberRole = ref<any>(null)
const memberUserIds = ref<string[]>([])
const memberPickBuffer = ref('')
const memberLoading = ref(false)
const memberSubmitLoading = ref(false)
const userOptions = ref<Array<{ id: string; nickName: string; userNo: string }>>([])
const userOptions = ref<UserOption[]>([])
function avatarColor(id: string) {
let hash = 0
for (let i = 0; i < id.length; i++) hash = (hash * 31 + id.charCodeAt(i)) >>> 0
return AVATAR_COLORS[hash % AVATAR_COLORS.length]
}
function avatarInitial(name?: string) {
const t = (name || '?').trim()
return t ? t.slice(0, 1) : '?'
}
function resolveUser(id: string) {
return userOptions.value.find((u) => u.id === id)
}
function memberOptionLabel(u: UserOption) {
const name = (u.nickName || '').trim() || '未命名'
const no = (u.userNo || '').trim()
if (no && no !== name) return `${name}(${no})`
return name
}
function memberOptionSub(u: UserOption) {
const name = (u.nickName || '').trim()
const no = (u.userNo || '').trim()
if (!no || no === name) return ''
return `账号 ${no}`
}
function chipTitle(id: string) {
const u = resolveUser(id)
return u ? memberOptionLabel(u) : id
}
function onMemberPick(id: string) {
if (!id) return
if (!memberUserIds.value.includes(id)) {
memberUserIds.value = [...memberUserIds.value, id]
}
nextTick(() => {
memberPickBuffer.value = ''
})
}
function removeMember(id: string) {
memberUserIds.value = memberUserIds.value.filter((x) => x !== id)
}
async function loadData() {
loading.value = true
@@ -426,6 +544,8 @@
async function handleMembers(row: any) {
memberRole.value = row
memberPickBuffer.value = ''
memberUserIds.value = []
memberVisible.value = true
memberLoading.value = true
try {
@@ -468,4 +588,180 @@
margin-bottom: 0;
}
}
.member-picker {
width: 100%;
}
.member-chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
min-height: 44px;
margin-top: 12px;
padding: 12px;
background: #f8fafc;
border: 1px dashed #cbd5e1;
border-radius: 8px;
&.is-empty {
align-items: center;
justify-content: center;
color: var(--mint-text-muted, #94a3b8);
font-size: 13px;
}
}
.member-chip {
display: inline-flex;
gap: 8px;
align-items: center;
max-width: 100%;
padding: 4px 8px 4px 4px;
background: #fff;
border: 1px solid var(--mint-border, #e2e8f0);
border-radius: 999px;
}
.member-chip__name {
max-width: 120px;
overflow: hidden;
font-size: 13px;
font-weight: 500;
white-space: nowrap;
text-overflow: ellipsis;
}
.member-chip__rm {
display: grid;
flex-shrink: 0;
place-items: center;
width: 20px;
height: 20px;
padding: 0;
color: var(--mint-text-muted, #64748b);
font-size: 14px;
line-height: 1;
background: #f1f5f9;
border: 0;
border-radius: 50%;
cursor: pointer;
&:hover {
color: #dc2626;
background: #fee2e2;
}
}
.member-picked-count {
margin: 8px 0 0;
color: var(--mint-text-muted, #94a3b8);
font-size: 12px;
}
.member-avatar {
display: inline-flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
color: #fff;
font-size: 13px;
font-weight: 700;
line-height: 1;
text-align: center;
border-radius: 50%;
&--sm {
width: 28px;
height: 28px;
font-size: 11px;
}
}
</style>
<!-- 下拉挂 body,须非 scoped -->
<style lang="scss">
.oa-role-member-select-popper {
.el-select-dropdown__list {
padding: 8px;
}
.el-select-dropdown__item {
height: auto !important;
min-height: 56px;
margin-bottom: 8px;
padding: 10px 12px !important;
line-height: normal !important;
border-radius: 8px;
&:last-child {
margin-bottom: 0;
}
&.is-disabled {
opacity: 0.55;
}
&.hover,
&:hover {
background: var(--primary-bg, #ecfdf5);
}
}
.member-option {
display: flex;
gap: 12px;
align-items: center;
width: 100%;
min-height: 36px;
}
.member-option__meta {
display: flex;
flex: 1;
flex-direction: column;
gap: 2px;
justify-content: center;
min-width: 0;
}
.member-option__name {
overflow: hidden;
color: var(--mint-text, #0f172a);
font-size: 13px;
font-weight: 600;
white-space: nowrap;
text-overflow: ellipsis;
}
.member-option__sub {
overflow: hidden;
color: var(--mint-text-muted, #64748b);
font-size: 12px;
white-space: nowrap;
text-overflow: ellipsis;
}
.member-option__tag {
flex-shrink: 0;
margin-left: auto;
}
.member-avatar {
display: inline-flex;
flex-shrink: 0;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
color: #fff;
font-size: 13px;
font-weight: 700;
line-height: 1;
text-align: center;
border-radius: 50%;
}
}
</style>
@@ -131,6 +131,8 @@
v-if="!detailLoading"
:steps="flowSteps"
:loading="previewLoading"
:resolved="flowResolved"
:pending-message="flowPendingMessage"
/>
</div>
<template #footer>
@@ -166,6 +168,10 @@
import OaFlowPreview from '@/components/oa-approval/OaFlowPreview.vue'
import { MAX_ADMIN_LIST_PAGE_SIZE } from '@/utils/fetch-paged-list'
import { resolveOaAppIconUrl } from '@/utils/oa-app-icons'
import {
OA_FC_DEFAULT_GUTTER,
ensureOaUploadRuleProps
} from '@/utils/oa-form-create-upload'
defineOptions({ name: 'OaApprovalStart' })
@@ -181,7 +187,11 @@
const picked = ref<any>(null)
const formData = ref<Record<string, any>>({})
const formRule = ref<any[]>([])
const formOption = ref<Record<string, any>>({ submitBtn: false, resetBtn: false })
const formOption = ref<Record<string, any>>({
submitBtn: false,
resetBtn: false,
row: { gutter: OA_FC_DEFAULT_GUTTER }
})
const fapi = ref<any>(null)
const submitting = ref(false)
const needInitiatorSelect = ref(false)
@@ -189,7 +199,10 @@
const userLoading = ref(false)
const userOptions = ref<Array<{ id: string; nickName: string; userNo: string }>>([])
const flowSteps = ref<OaFlowPreviewStep[]>([])
const flowResolved = ref(true)
const flowPendingMessage = ref('必填信息填写后,流程将自动显示')
const previewLoading = ref(false)
let previewTimer: ReturnType<typeof setTimeout> | null = null
const displayGroups = computed(() => {
const kw = (searchKeyword.value || '').trim().toLowerCase()
@@ -267,18 +280,32 @@
async function loadFlowPreview(appId: string) {
previewLoading.value = true
try {
const preview = await fetchOaFlowPreview(
appId,
needInitiatorSelect.value ? [...initiatorSelectUserIds.value] : undefined
)
flowSteps.value = preview?.steps || []
const preview = await fetchOaFlowPreview(appId, {
formData: { ...formData.value },
initiatorSelectUserIds: needInitiatorSelect.value
? [...initiatorSelectUserIds.value]
: undefined
})
flowResolved.value = preview?.resolved !== false
flowPendingMessage.value =
preview?.message || '必填信息填写后,流程将自动显示'
flowSteps.value = flowResolved.value ? preview?.steps || [] : []
} catch {
flowSteps.value = []
flowResolved.value = true
} finally {
previewLoading.value = false
}
}
function scheduleFlowPreview() {
if (!dlgVisible.value || !picked.value?.id) return
if (previewTimer) clearTimeout(previewTimer)
previewTimer = setTimeout(() => {
loadFlowPreview(picked.value.id)
}, 300)
}
async function onPick(t: any) {
picked.value = t
formData.value = {}
@@ -286,19 +313,32 @@
needInitiatorSelect.value = false
initiatorSelectUserIds.value = []
flowSteps.value = []
flowResolved.value = false
flowPendingMessage.value = '必填信息填写后,流程将自动显示'
dlgVisible.value = true
detailLoading.value = true
previewLoading.value = true
try {
const detail = await fetchOaTemplateDetail(t.id)
const schema = detail?.formSchemaJson || {}
formRule.value = Array.isArray(schema.rule) ? schema.rule : Array.isArray(schema) ? schema : []
const rawRule = Array.isArray(schema.rule)
? schema.rule
: Array.isArray(schema)
? schema
: []
formRule.value = ensureOaUploadRuleProps(rawRule)
const savedGutter = Number(schema.option?.row?.gutter)
formOption.value = {
...(schema.option || {}),
form: {
...(schema.option?.form || {}),
labelPosition: 'top'
},
// 顶层字段 col.span 布局用;栅格组件 fcRow 由 ensureOaUploadRuleProps 处理
row: {
...(schema.option?.row || {}),
gutter: savedGutter > 0 ? savedGutter : OA_FC_DEFAULT_GUTTER
},
submitBtn: false,
resetBtn: false
}
@@ -312,17 +352,26 @@
} catch {
formRule.value = []
flowSteps.value = []
flowResolved.value = true
previewLoading.value = false
} finally {
detailLoading.value = false
}
}
watch(
formData,
() => {
scheduleFlowPreview()
},
{ deep: true }
)
watch(
initiatorSelectUserIds,
() => {
if (dlgVisible.value && picked.value?.id && needInitiatorSelect.value) {
loadFlowPreview(picked.value.id)
scheduleFlowPreview()
}
},
{ deep: true }
@@ -104,24 +104,22 @@
</span>
</div>
</div>
<div class="protocol-card-compact__field protocol-card-compact__field--split-row">
<div class="protocol-card-compact__field-col">
<label>母血采集</label>
<span
class="protocol-card__kv-value"
:title="String(row.maternalBloodCollectTime || '')"
>
{{ formatDisplayOrDash(row.maternalBloodCollectTime) }}
</span>
</div>
<div class="protocol-card-compact__field-col protocol-card-compact__field-col--attachment">
<ProtocolAttachmentMiniReadonly
:label="attachmentMeta(row).label"
:files="attachmentMeta(row).files"
@preview="handleAttachmentPreview"
@download="handleAttachmentDownload"
/>
</div>
<div class="protocol-card-compact__field">
<label>母血采集</label>
<span
class="protocol-card__kv-value"
:title="String(row.maternalBloodCollectTime || '')"
>
{{ formatDisplayOrDash(row.maternalBloodCollectTime) }}
</span>
</div>
<div class="protocol-card-compact__field protocol-card-compact__field--attachment-only">
<ProtocolAttachmentMiniReadonly
:label="attachmentMeta(row).label"
:files="attachmentMeta(row).files"
@preview="handleAttachmentPreview"
@download="handleAttachmentDownload"
/>
</div>
</template>
<template v-else>