This commit is contained in:
zlwu committed 2026-06-25 12:41:07 +08:00
1 parent 66609c0e21
commit 0b50eff3d8
93 files changed
+40172 -30060

No files matched your search

+18
View File
@@ -69,6 +69,24 @@ export function fetchReassignProductionTask(
})
}
export function fetchDispatchProductionTaskSteps(
taskId: string,
data: {
steps: Array<{
stepId: string
assigneeUserIds: string[]
plannedStartTime?: string | null
}>
},
operateScope?: ProductionTaskOperateScope
) {
return request.put<any>({
url: `/web/admin/production-tasks/${taskId}/steps/dispatch`,
data,
params: scopeQuery(operateScope)
})
}
export function fetchProductionTaskDetail(id: string) {
return request.get<any>({ url: `/web/admin/production-tasks/${id}` })
}
+21 -10
View File
@@ -150,27 +150,38 @@ export function fetchDeleteProductionWorkOrder(id: string) {
return request.del({ url: `/web/admin/production-work-orders/${id}` })
}
export interface ProductionCellProductOption {
export interface ProductionQcDispatchOption {
id: string
cellProductId?: string
productCode?: string
productName?: string
productTypeName?: string
passage?: string
storageSlotName?: string
stepOutputId?: string
taskId?: string
taskNo?: string
taskName?: string
stepId?: string
processName?: string
outputTypeId?: string
outputTypeName?: string
outputName?: string
outputBarcode?: string
cellProductId?: string
}
export function fetchProductionWorkOrderCellProductOptions(workOrderId: string) {
return request.get<ProductionCellProductOption[]>({
/** @deprecated 使用 ProductionQcDispatchOption */
export type ProductionCellProductOption = ProductionQcDispatchOption
export function fetchProductionWorkOrderQcDispatchOptions(workOrderId: string) {
return request.get<ProductionQcDispatchOption[]>({
url: `/web/admin/production-work-orders/${workOrderId}/cell-product-options`
})
}
/** @deprecated 使用 fetchProductionWorkOrderQcDispatchOptions */
export function fetchProductionWorkOrderCellProductOptions(workOrderId: string) {
return fetchProductionWorkOrderQcDispatchOptions(workOrderId)
}
export function fetchCreateQcFromProduction(
workOrderId: string,
data: { cellProductId: string; productionTaskId?: string; remark?: string }
data: { productionStepOutputId: string; remark?: string }
) {
return request.post({
url: `/web/admin/production-work-orders/${workOrderId}/qc-work-orders`,
+1
View File
@@ -138,6 +138,7 @@ export type QcWorkOrder = {
productionWorkOrderId?: string
productionWorkOrderNo?: string
productionTaskId?: string
productionStepOutputId?: string
protocolStatus?: string
protocolStatusLabel?: string
paymentSummary?: QcProtocolPaymentSummary | null
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "label": "useTaskStepEditor.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1"}, {"id": "production_work_order_usetaskstepeditor_parsetaskattachmentsfromurls", "label": "parseTaskAttachmentsFromUrls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L43"}, {"id": "production_work_order_usetaskstepeditor_toapiflag", "label": "toApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L53"}, {"id": "production_work_order_usetaskstepeditor_fromapiflag", "label": "fromApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L57"}, {"id": "production_work_order_usetaskstepeditor_normalizestepsubtables", "label": "normalizeStepSubTables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L60"}, {"id": "production_work_order_usetaskstepeditor_parseordernum", "label": "parseOrderNum()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L77"}, {"id": "production_work_order_usetaskstepeditor_usetaskstepeditor", "label": "useTaskStepEditor()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L84"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L18", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L27", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L28", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_sample_reception", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_equipment_select", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L30", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_process_material_ui", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L31", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "label": "TaskExecutionDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "label": "DispatchQcWorkOrderDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L114", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L115", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L116", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L117", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L118", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task_ts", "label": "production-task.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L1"}, {"id": "api_production_task_scopequery", "label": "scopeQuery()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L5"}, {"id": "api_production_task_fetchcreateproductiontask", "label": "fetchCreateProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L9"}, {"id": "api_production_task_fetchproductiontasklist", "label": "fetchProductionTaskList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L13"}, {"id": "api_production_task_fetchmyproductiontasks", "label": "fetchMyProductionTasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L31"}, {"id": "api_production_task_fetchforwardproductiontask", "label": "fetchForwardProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L50"}, {"id": "api_production_task_fetchreassignproductiontask", "label": "fetchReassignProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L62"}, {"id": "api_production_task_fetchdispatchproductiontasksteps", "label": "fetchDispatchProductionTaskSteps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L72"}, {"id": "api_production_task_fetchproductiontaskdetail", "label": "fetchProductionTaskDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L88"}, {"id": "api_production_task_fetchupdateproductiontask", "label": "fetchUpdateProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L92"}, {"id": "api_production_task_fetchupdateproductiontaskstatus", "label": "fetchUpdateProductionTaskStatus()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L96"}, {"id": "api_production_task_fetchdeleteproductiontask", "label": "fetchDeleteProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L108"}, {"id": "api_production_task_fetchaddtaskstep", "label": "fetchAddTaskStep()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L112"}, {"id": "api_production_task_fetchupdatetaskstep", "label": "fetchUpdateTaskStep()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L124"}, {"id": "api_production_task_fetchdeletetaskstep", "label": "fetchDeleteTaskStep()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L137"}, {"id": "api_production_task_fetchreplacestepreagents", "label": "fetchReplaceStepReagents()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L148"}, {"id": "api_production_task_fetchreplacestepconsumables", "label": "fetchReplaceStepConsumables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L161"}, {"id": "api_production_task_fetchreplacestepconfiguredreagents", "label": "fetchReplaceStepConfiguredReagents()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L174"}, {"id": "api_production_task_fetchreplacestepdatacollection", "label": "fetchReplaceStepDataCollection()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L187"}, {"id": "api_production_task_fetchsettaskinputs", "label": "fetchSetTaskInputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L200"}, {"id": "api_production_task_fetchsettaskoutputs", "label": "fetchSetTaskOutputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L212"}, {"id": "api_production_task_fetchreordertasksteps", "label": "fetchReorderTaskSteps()", "file_type": "code", "source_file": "/Users/wuzilong/Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "label": "production-work-order.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L1"}, {"id": "api_production_work_order_fetchproductionworkorderlist", "label": "fetchProductionWorkOrderList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L83"}, {"id": "api_production_work_order_fetchproductionworkorderdetail", "label": "fetchProductionWorkOrderDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L105"}, {"id": "api_production_work_order_fetchcompleteproductionworkorder", "label": "fetchCompleteProductionWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L109"}, {"id": "api_production_work_order_fetchcreateproductionworkorder", "label": "fetchCreateProductionWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L113"}, {"id": "api_production_work_order_fetchconfigureproductionworkorder", "label": "fetchConfigureProductionWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L126"}, {"id": "api_production_work_order_fetchupdateproductionworkorder", "label": "fetchUpdateProductionWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L142"}, {"id": "api_production_work_order_fetchdeleteproductionworkorder", "label": "fetchDeleteProductionWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L149"}, {"id": "api_production_work_order_fetchproductionworkorderqcdispatchoptions", "label": "fetchProductionWorkOrderQcDispatchOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L171"}, {"id": "api_production_work_order_fetchproductionworkordercellproductoptions", "label": "fetchProductionWorkOrderCellProductOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L178"}, {"id": "api_production_work_order_fetchcreateqcfromproduction", "label": "fetchCreateQcFromProduction()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L182"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "target": "api_production_work_order_fetchproductionworkorderlist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L83", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "target": "api_production_work_order_fetchproductionworkorderdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L105", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "target": "api_production_work_order_fetchcompleteproductionworkorder", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L109", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order_ts", "target": "api_production_work_order_fetchcreateproductionworkorder", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-work-order.ts", "source_location": "L113", "weight": 1.0}, {"source": "users_wuzilong_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_productionworkordercardlist_vue", "label": "ProductionWorkOrderCardList.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchstepdialog_vue", "label": "DispatchStepDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L1"}, {"id": "production_work_order_dispatchstepdialog_mergeduseroptions", "label": "mergedUserOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L115"}, {"id": "production_work_order_dispatchstepdialog_remotesearchusers", "label": "remoteSearchUsers()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L122"}, {"id": "production_work_order_dispatchstepdialog_onuserselectvisible", "label": "onUserSelectVisible()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L139"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchstepdialog_vue", "target": "production_work_order_dispatchstepdialog_mergeduseroptions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L115", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchstepdialog_vue", "target": "production_work_order_dispatchstepdialog_remotesearchusers", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L122", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchstepdialog_vue", "target": "production_work_order_dispatchstepdialog_onuserselectvisible", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L139", "weight": 1.0}, {"source": "production_work_order_dispatchstepdialog_onuserselectvisible", "target": "production_work_order_dispatchstepdialog_remotesearchusers", "relation": "calls", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L140", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_dispatchstepdialog_mergeduseroptions", "callee": "values", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L119"}, {"caller_nid": "production_work_order_dispatchstepdialog_remotesearchusers", "callee": "fetchUserList", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L125"}, {"caller_nid": "production_work_order_dispatchstepdialog_remotesearchusers", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchStepDialog.vue", "source_location": "L128"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "label": "useTaskStepEditor.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1"}, {"id": "production_work_order_usetaskstepeditor_parsetaskattachmentsfromurls", "label": "parseTaskAttachmentsFromUrls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L45"}, {"id": "production_work_order_usetaskstepeditor_toapiflag", "label": "toApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L55"}, {"id": "production_work_order_usetaskstepeditor_fromapiflag", "label": "fromApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L59"}, {"id": "production_work_order_usetaskstepeditor_normalizestepsubtables", "label": "normalizeStepSubTables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L62"}, {"id": "production_work_order_usetaskstepeditor_parseordernum", "label": "parseOrderNum()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L90"}, {"id": "production_work_order_usetaskstepeditor_usetaskstepeditor", "label": "useTaskStepEditor()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L97"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L20", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L30", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_sample_reception", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L31", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_equipment_select", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L32", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "label": "StepDetailPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L1"}, {"id": "production_work_order_stepdetailpanel_for", "label": "for()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L990"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "target": "production_work_order_stepdetailpanel_for", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L990", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "push", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "decodeURIComponent", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L995"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "pop", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L995"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "split", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L995"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L995"}]}
@@ -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_production_production_work_order_productionworkordercardlist_vue", "label": "ProductionWorkOrderCardList.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "label": "DispatchTaskDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L1"}, {"id": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "label": "resolveCreatedTaskId()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L264"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "vue_draggable_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L208", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L209", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_labels", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L210", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L211", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L212", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L213", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L214", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L264", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L266"}, {"caller_nid": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L266"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "label": "StepDetailPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L1"}, {"id": "production_work_order_stepdetailpanel_for", "label": "for()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L912"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "target": "production_work_order_stepdetailpanel_for", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L912", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "push", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L914"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "decodeURIComponent", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L917"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "pop", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L917"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "split", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L917"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L917"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "label": "DispatchQcWorkOrderDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L1"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L109", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L110", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L111", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchQcWorkOrderDialog.vue", "source_location": "L112", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L1"}, {"id": "production_work_order_index_refreshactivetab", "label": "refreshActiveTab()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L148"}, {"id": "production_work_order_index_handletabchange", "label": "handleTabChange()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L153"}, {"id": "production_work_order_index_handleaddtemporary", "label": "handleAddTemporary()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L164"}, {"id": "production_work_order_index_submitadd", "label": "submitAdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L169"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "vue_router", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L111", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L112", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L113", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L114", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_tabs", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L121", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_tabs_productionworkordertabpanel_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L126", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L127", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchstepdialog_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L128", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchqcworkorderdialog_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/index.vue", "source_location": "L129", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_vieLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_workordertasksublist_vue", "label": "WorkOrderTaskSubList.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L1"}, {"id": "production_work_order_workordertasksublist_iscurrentassignee", "label": "isCurrentAssignee()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L270"}, {"id": "production_work_order_workordertasksublist_isminehistoryrow", "label": "isMineHistoryRow()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L278"}, {"id": "production_work_order_workordertasksublist_canenterexecution", "label": "canEnterExecution()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L284"}, {"id": "production_work_order_workordertasksublist_canforwardtask", "label": "canForwardTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L291"}, {"id": "production_work_order_workordertasksublist_canreassigntask", "label": "canReassignTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L295"}, {"id": "production_work_order_workordertasksublist_candispatchsteps", "label": "canDispatchSteps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L299"}, {"id": "production_work_order_workordertasksublist_canedittask", "label": "canEditTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L304"}, {"id": "production_work_order_workordertasksublist_candeletetask", "label": "canDeleteTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L310"}, {"id": "production_work_order_workordertasksublist_hasmoretaskactions", "label": "hasMoreTaskActions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L315"}, {"id": "production_work_order_workordertasksublist_loaddata", "label": "loadData()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L320"}, {"id": "production_work_order_workordertasksublist_handletaskmutationsuccess", "label": "handleTaskMutationSuccess()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L352"}, {"id": "production_work_order_workordertasksublist_handledispatch", "label": "handleDispatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L359"}, {"id": "production_work_order_workordertasksublist_handleneedstepdispatch", "label": "handleNeedStepDispatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L373"}, {"id": "production_work_order_workordertasksublist_openstepdispatch", "label": "openStepDispatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L379"}, {"id": "production_work_order_workordertasksublist_handleenterexecution", "label": "handleEnterExecution()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L390"}, {"id": "production_work_order_workordertasksublist_handleviewdetail", "label": "handleViewDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/WorkOrderTaskSubList.vue", "source_location": "L397"}, {"id": "production_work_order_workordertasksublist_handledropdowncommand", "label": "handleDropdownCommand()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-adLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_operations_storage_facility_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue", "source_location": "L1"}, {"id": "storage_facility_index_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue", "source_location": "L945"}, {"id": "storage_facility_index_push", "label": "push()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue", "source_location": "L948"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_operations_storage_facility_index_vue", "target": "storage_facility_index_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue", "source_location": "L945", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_operations_storage_facility_index_vue", "target": "storage_facility_index_push", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue", "source_location": "L948", "weight": 1.0}], "raw_calls": [{"caller_nid": "storage_facility_index_if", "callee": "set", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/operations/storage-facility/index.vue", "source_location": "L946"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "label": "DispatchTaskDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L1"}, {"id": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "label": "resolveCreatedTaskId()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L264"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "vue_draggable_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L208", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L209", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_labels", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L210", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L211", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L212", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L213", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L214", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L264", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L266"}, {"caller_nid": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L266"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "label": "qc-work-order.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L1"}, {"id": "api_qc_work_order_fetchqcworkorderlist", "label": "fetchQcWorkOrderList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L181"}, {"id": "api_qc_work_order_fetchqcworkorderdetail", "label": "fetchQcWorkOrderDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L201"}, {"id": "api_qc_work_order_fetchconfigureqcworkorder", "label": "fetchConfigureQcWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L207"}, {"id": "api_qc_work_order_fetchcreateqcworkorder", "label": "fetchCreateQcWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L224"}, {"id": "api_qc_work_order_fetchupdateqcworkorder", "label": "fetchUpdateQcWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L239"}, {"id": "api_qc_work_order_fetchdeleteqcworkorder", "label": "fetchDeleteQcWorkOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L249"}, {"id": "api_qc_work_order_fetchoutboundqcdetail", "label": "fetchOutboundQcDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L322"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_http", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchqcworkorderlist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L181", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchqcworkorderdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L201", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchconfigureqcworkorder", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L207", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchcreateqcworkorder", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L224", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchupdateqcworkorder", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L239", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchdeleteqcworkorder", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L249", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_work_order_ts", "target": "api_qc_work_order_fetchoutboundqcdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L322", "weight": 1.0}], "raw_calls": [{"caller_nid": "api_qc_work_order_fetchqcworkorderlist", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L195"}, {"caller_nid": "api_qc_work_order_fetchqcworkorderdetail", "callee": "get", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L202"}, {"caller_nid": "api_qc_work_order_fetchconfigureqcworkorder", "callee": "post", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-work-order.ts", "source_location": "L218"}, {"caller_nid": "api_qc_work_order_fetchcreateqcworkoLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "label": "useTaskStepEditor.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1"}, {"id": "production_work_order_usetaskstepeditor_parsetaskattachmentsfromurls", "label": "parseTaskAttachmentsFromUrls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L45"}, {"id": "production_work_order_usetaskstepeditor_toapiflag", "label": "toApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L55"}, {"id": "production_work_order_usetaskstepeditor_fromapiflag", "label": "fromApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L59"}, {"id": "production_work_order_usetaskstepeditor_normalizestepsubtables", "label": "normalizeStepSubTables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L62"}, {"id": "production_work_order_usetaskstepeditor_parseordernum", "label": "parseOrderNum()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L90"}, {"id": "production_work_order_usetaskstepeditor_usetaskstepeditor", "label": "useTaskStepEditor()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L97"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L20", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L30", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_sample_reception", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L31", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_equipment_select", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L32", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_productionworkordercardlist_vue", "label": "ProductionWorkOrderCardList.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/ProductionWorkOrderCardList.vue", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "label": "StepDetailPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L1"}, {"id": "production_work_order_stepdetailpanel_for", "label": "for()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L987"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "target": "production_work_order_stepdetailpanel_for", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L987", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "push", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L989"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "decodeURIComponent", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "pop", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "split", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "label": "useTaskStepEditor.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1"}, {"id": "production_work_order_usetaskstepeditor_parsetaskattachmentsfromurls", "label": "parseTaskAttachmentsFromUrls()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L45"}, {"id": "production_work_order_usetaskstepeditor_toapiflag", "label": "toApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L55"}, {"id": "production_work_order_usetaskstepeditor_fromapiflag", "label": "fromApiFlag()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L59"}, {"id": "production_work_order_usetaskstepeditor_normalizestepsubtables", "label": "normalizeStepSubTables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L62"}, {"id": "production_work_order_usetaskstepeditor_parseordernum", "label": "parseOrderNum()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L90"}, {"id": "production_work_order_usetaskstepeditor_usetaskstepeditor", "label": "useTaskStepEditor()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L97"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L19", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L20", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "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/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L29", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L30", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_sample_reception", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L31", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_equipment_select", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/useTaskStepEditor.ts", "source_location": "L32", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "label": "DispatchTaskDialog.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L1"}, {"id": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "label": "resolveCreatedTaskId()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L264"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "vue_draggable_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L208", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L209", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_labels", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L210", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L211", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L212", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_usetaskstepeditor", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L213", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L214", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L264", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "callee": "trim", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L266"}, {"caller_nid": "production_work_order_dispatchtaskdialog_resolvecreatedtaskid", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L266"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_card_meta_ts", "label": "production-work-order-card-meta.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L1"}, {"id": "utils_production_work_order_card_meta_formatoutboundschedulesortno", "label": "formatOutboundScheduleSortNo()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L40"}, {"id": "utils_production_work_order_card_meta_formatoutboundscheduletotalcount", "label": "formatOutboundScheduleTotalCount()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L46"}, {"id": "utils_production_work_order_card_meta_parsereceptiontime", "label": "parseReceptionTime()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L52"}, {"id": "utils_production_work_order_card_meta_receptionover24hourslabel", "label": "receptionOver24HoursLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L59"}, {"id": "utils_production_work_order_card_meta_receptionover24hourstagtype", "label": "receptionOver24HoursTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L66"}, {"id": "utils_production_work_order_card_meta_protocolstatuslabelfortab", "label": "protocolStatusLabelForTab()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L73"}, {"id": "utils_production_work_order_card_meta_protocolstatustagtypefortab", "label": "protocolStatusTagTypeForTab()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L82"}, {"id": "utils_production_work_order_card_meta_buildinboundmetafields", "label": "buildInboundMetaFields()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L91"}, {"id": "utils_production_work_order_card_meta_getcardmetaconfig", "label": "getCardMetaConfig()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L263"}, {"id": "utils_production_work_order_card_meta_getcardmetaconfigforlegacytab", "label": "getCardMetaConfigForLegacyTab()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L267"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_card_meta_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_work_order", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_card_meta_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_qc_labels", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L2", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_card_meta_ts", "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/utils/production-work-order-card-meta.ts", "source_location": "L3", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_card_meta_ts", "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/utils/production-work-order-card-meta.ts", "source_location": "L9", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_card_meta_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_production_work_order_tabs", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/production-work-order-card-meta.ts", "source_location": "L10", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_storage_slot_options_ts", "label": "storage-slot-options.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L1"}, {"id": "utils_storage_slot_options_getstoragefacilityordernum", "label": "getStorageFacilityOrderNum()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L16"}, {"id": "utils_storage_slot_options_getstorageslotordernum", "label": "getStorageSlotOrderNum()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L22"}, {"id": "utils_storage_slot_options_decodeslotlayoutorder", "label": "decodeSlotLayoutOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L31"}, {"id": "utils_storage_slot_options_parselegacyrowcolslotcode", "label": "parseLegacyRowColSlotCode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L40"}, {"id": "utils_storage_slot_options_parsestorageslotcode", "label": "parseStorageSlotCode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L47"}, {"id": "utils_storage_slot_options_buildnodecodepathfromflat", "label": "buildNodeCodePathFromFlat()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L54"}, {"id": "utils_storage_slot_options_buildfullslotcodefromflat", "label": "buildFullSlotCodeFromFlat()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L78"}, {"id": "utils_storage_slot_options_comparestoragefacilityslots", "label": "compareStorageFacilitySlots()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L90"}, {"id": "utils_storage_slot_options_sortstoragefacilityslots", "label": "sortStorageFacilitySlots()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L118"}, {"id": "utils_storage_slot_options_isstorageslotavailable", "label": "isStorageSlotAvailable()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L122"}, {"id": "utils_storage_slot_options_collectleaffacilitynodesintreeorder", "label": "collectLeafFacilityNodesInTreeOrder()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L131"}, {"id": "utils_storage_slot_options_mapslotstoselectoptions", "label": "mapSlotsToSelectOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L183"}, {"id": "utils_storage_slot_options_loadstorageslotselectoptions", "label": "loadStorageSlotSelectOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L211"}, {"id": "utils_storage_slot_options_remotesearchstorageslotselectoptions", "label": "remoteSearchStorageSlotSelectOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L249"}, {"id": "utils_storage_slot_options_ensurestorageslotsinoptions", "label": "ensureStorageSlotsInOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L274"}, {"id": "utils_storage_slot_options_filterstorageslotselectoptions", "label": "filterStorageSlotSelectOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L293"}, {"id": "utils_storage_slot_options_validateuniquestorageslotids", "label": "validateUniqueStorageSlotIds()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L307"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_storage_slot_options_ts", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_tree_path", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/utils/storage-slot-options.ts", "source_location": "L4", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_storage_slot_options_ts", "target": "users_wuzilong_work_00code_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_production_task_ts", "label": "production-task.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L1"}, {"id": "api_production_task_scopequery", "label": "scopeQuery()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L5"}, {"id": "api_production_task_fetchcreateproductiontask", "label": "fetchCreateProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L9"}, {"id": "api_production_task_fetchproductiontasklist", "label": "fetchProductionTaskList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L13"}, {"id": "api_production_task_fetchmyproductiontasks", "label": "fetchMyProductionTasks()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L31"}, {"id": "api_production_task_fetchforwardproductiontask", "label": "fetchForwardProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L50"}, {"id": "api_production_task_fetchreassignproductiontask", "label": "fetchReassignProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L62"}, {"id": "api_production_task_fetchdispatchproductiontasksteps", "label": "fetchDispatchProductionTaskSteps()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L72"}, {"id": "api_production_task_fetchproductiontaskdetail", "label": "fetchProductionTaskDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L90"}, {"id": "api_production_task_fetchupdateproductiontask", "label": "fetchUpdateProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L94"}, {"id": "api_production_task_fetchupdateproductiontaskstatus", "label": "fetchUpdateProductionTaskStatus()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L98"}, {"id": "api_production_task_fetchdeleteproductiontask", "label": "fetchDeleteProductionTask()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L110"}, {"id": "api_production_task_fetchaddtaskstep", "label": "fetchAddTaskStep()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L114"}, {"id": "api_production_task_fetchupdatetaskstep", "label": "fetchUpdateTaskStep()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L126"}, {"id": "api_production_task_fetchdeletetaskstep", "label": "fetchDeleteTaskStep()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L139"}, {"id": "api_production_task_fetchreplacestepreagents", "label": "fetchReplaceStepReagents()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L150"}, {"id": "api_production_task_fetchreplacestepconsumables", "label": "fetchReplaceStepConsumables()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L163"}, {"id": "api_production_task_fetchreplacestepconfiguredreagents", "label": "fetchReplaceStepConfiguredReagents()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L176"}, {"id": "api_production_task_fetchreplacestepdatacollection", "label": "fetchReplaceStepDataCollection()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L189"}, {"id": "api_production_task_fetchsettaskinputs", "label": "fetchSetTaskInputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L202"}, {"id": "api_production_task_fetchsettaskoutputs", "label": "fetchSetTaskOutputs()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L214"}, {"id": "api_production_task_fetchreordertasksteps", "label": "fetchReorderTaskSteps()", "file_type": "code", "source_file": "/Users/wuzilong/Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "label": "StepDetailPanel.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L1"}, {"id": "production_work_order_stepdetailpanel_for", "label": "for()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L987"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_stepdetailpanel_vue", "target": "production_work_order_stepdetailpanel_for", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L987", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "push", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L989"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "decodeURIComponent", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "pop", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "split", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}, {"caller_nid": "production_work_order_stepdetailpanel_for", "callee": "String", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/StepDetailPanel.vue", "source_location": "L992"}]}
@@ -89,10 +89,7 @@ function protocolStatusTagTypeForTab(
}
function buildInboundMetaFields(tabKey: ProductionWorkOrderTabKey): CardMetaField[] {
const fields: CardMetaField[] = [
{ label: '样本编码', getValue: (row) => row.sampleCode || '—' },
{ label: '实验室入库编码', getValue: (row) => row.labStorageCode || '—' }
]
const fields: CardMetaField[] = []
if (tabKey === 'inbound_cell_storage') {
fields.push({
label: '来源类型',
@@ -120,6 +117,9 @@ function buildInboundMetaFields(tabKey: ProductionWorkOrderTabKey): CardMetaFiel
},
{ label: '接收时间', getValue: (row) => row.receptionTime || '—' },
{ label: '创建时间', getValue: (row) => row.createTime || '—' },
{ label: '工单号', getValue: (row) => row.workOrderNo || '—' },
{ label: '样本编码', getValue: (row) => row.sampleCode || '—' },
{ label: '实验室入库编码', getValue: (row) => row.labStorageCode || '—' },
{
label: '备注',
getValue: (row) => row.remark || '—',
+32 -6
View File
@@ -25,11 +25,29 @@ export function getStorageSlotOrderNum(slot: Record<string, unknown>): number {
return Number.isFinite(parsed) ? parsed : 0
}
/** 解析 slotCode「{prefix}{row}-{col}」 */
export function parseStorageSlotCode(code: string): { row: number; col: number } | null {
/** 货架布局 order_num 步长(row * STRIDE + col) */
export const SLOT_LAYOUT_ROW_STRIDE = 1000
export function decodeSlotLayoutOrder(orderNum: number): { row: number; col: number } {
const order = Number(orderNum) || 0
if (order >= SLOT_LAYOUT_ROW_STRIDE) {
return { row: Math.trunc(order / SLOT_LAYOUT_ROW_STRIDE), col: order % SLOT_LAYOUT_ROW_STRIDE }
}
return { row: 0, col: order }
}
/** 解析旧版 slotCode「{prefix}{row}-{col}」;纯数字序号返回 null */
export function parseLegacyRowColSlotCode(code: string): { row: number; col: number; prefix: string } | null {
const match = (code || '').trim().match(/^(.*?)(\d+)-(\d+)$/)
if (!match) return null
return { row: parseInt(match[2], 10), col: parseInt(match[3], 10) }
return { prefix: match[1], row: parseInt(match[2], 10), col: parseInt(match[3], 10) }
}
/** @deprecated 兼容旧调用;新数据请用 decodeSlotLayoutOrder + 序号 slotCode */
export function parseStorageSlotCode(code: string): { row: number; col: number } | null {
const legacy = parseLegacyRowColSlotCode(code)
if (legacy) return { row: legacy.row, col: legacy.col }
return null
}
/** 从根到节点的 node_code 路径,用 `-` 连接 */
@@ -68,17 +86,25 @@ export function buildFullSlotCodeFromFlat(
return local || path
}
/** 盒内格位:order_num → 行 → 列 → 编码 */
/** 盒内格位:order_num → 布局行列 → 序号 */
export function compareStorageFacilitySlots(
a: Record<string, unknown>,
b: Record<string, unknown>
): number {
const orderDiff = getStorageSlotOrderNum(a) - getStorageSlotOrderNum(b)
if (orderDiff !== 0) return orderDiff
const oa = getStorageSlotOrderNum(a)
const ob = getStorageSlotOrderNum(b)
if (oa >= SLOT_LAYOUT_ROW_STRIDE && ob >= SLOT_LAYOUT_ROW_STRIDE) {
const da = decodeSlotLayoutOrder(oa)
const db = decodeSlotLayoutOrder(ob)
if (da.row !== db.row) return da.row - db.row
if (da.col !== db.col) return da.col - db.col
}
const codeA = String(a.slotCode ?? a.slot_code ?? '')
const codeB = String(b.slotCode ?? b.slot_code ?? '')
const pa = parseStorageSlotCode(codeA)
const pb = parseStorageSlotCode(codeB)
const pa = parseLegacyRowColSlotCode(codeA)
const pb = parseLegacyRowColSlotCode(codeB)
if (pa && pb) {
if (pa.row !== pb.row) return pa.row - pb.row
if (pa.col !== pb.col) return pa.col - pb.col
@@ -135,7 +135,7 @@
<div class="shelf-cells">
<div
class="shelf-cell shelf-cell--add"
title="在此行前面增加格子"
title="在此行末尾增加格子"
@click="handleAddSlotInRow(ri)"
>
<span class="add-icon">+</span>
@@ -215,11 +215,11 @@
<el-form-item label="节点名称" prop="nodeName">
<el-input v-model="nodeFormData.nodeName" placeholder="请输入节点名称" />
</el-form-item>
<el-form-item prop="nodeCode">
<el-form-item>
<template #label>
节点编号<span class="form-label-tip">单段字母或数字,不含连字符</span>
节点编号<span class="form-label-tip">可选</span>
</template>
<el-input v-model="nodeFormData.nodeCode" placeholder="如 1、03、A" />
<el-input v-model="nodeFormData.nodeCode" placeholder="可不填" />
</el-form-item>
<el-form-item label="节点类型">
<el-select v-model="nodeFormData.nodeType" placeholder="请选择节点类型">
@@ -278,15 +278,17 @@
<el-form
ref="slotFormRef"
:model="slotFormData"
:rules="slotFormRules"
label-position="top"
class="storage-dialog-form"
scroll-to-error
:scroll-into-view-options="{ behavior: 'smooth', block: 'center' }"
>
<div class="form-grid-2">
<el-form-item label="本地编码(行-列)" prop="slotCode">
<el-input v-model="slotFormData.slotCode" placeholder="如 1-3" />
<el-form-item>
<template #label>
本地编码(序号)<span class="form-label-tip">可选</span>
</template>
<el-input v-model="slotFormData.slotCode" placeholder="可不填" />
</el-form-item>
<el-form-item label="格子状态">
<el-select v-model="slotFormData.slotStatus" placeholder="请选择状态">
@@ -357,9 +359,9 @@
将生成 <strong>{{ batchForm.rows * batchForm.cols }}</strong> 个格子({{
batchForm.rows
}}
行 × {{ batchForm.cols }} 列)
行 × {{ batchForm.cols }} 列),本地序号从 <strong>1</strong> 起依次编号
<template v-if="batchPreviewCode">
,示例编号:<strong>{{ batchPreviewCode }}</strong>
,示例完整编号:<strong>{{ batchPreviewCode }}</strong>
</template>
</div>
</div>
@@ -625,22 +627,24 @@
<el-form
ref="occupancySlotFormRef"
:model="occupancySlotFormData"
:rules="occupancySlotFormRules"
label-position="top"
class="storage-dialog-form"
scroll-to-error
:scroll-into-view-options="{ behavior: 'smooth', block: 'center' }"
>
<div class="form-grid-2">
<el-form-item label="完整编号" class="form-col-span-2">
<div class="form-grid-3">
<el-form-item label="完整编号">
<el-input
:model-value="currentSlot?.fullSlotCode || '—'"
readonly
placeholder="保存后自动生成"
/>
</el-form-item>
<el-form-item label="本地编码(行-列)" prop="slotCode">
<el-input v-model="occupancySlotFormData.slotCode" placeholder="如 1-3" />
<el-form-item>
<template #label>
本地编码(序号)<span class="form-label-tip">可选</span>
</template>
<el-input v-model="occupancySlotFormData.slotCode" placeholder="可不填" />
</el-form-item>
<el-form-item label="格子状态">
<el-select v-model="occupancySlotFormData.slotStatus" placeholder="请选择状态">
@@ -734,7 +738,13 @@
fetchRemoveOccupancy
} from '@/api/admin'
import { buildTreePathLabelFromFlat } from '@/utils/tree-path'
import { buildNodeCodePathFromFlat } from '@/utils/storage-slot-options'
import {
buildNodeCodePathFromFlat,
decodeSlotLayoutOrder,
getStorageSlotOrderNum,
parseLegacyRowColSlotCode,
SLOT_LAYOUT_ROW_STRIDE
} from '@/utils/storage-slot-options'
defineOptions({ name: 'StorageFacility' })
@@ -877,7 +887,7 @@
}
}
// ==================== 货架行计算(按 slotCode 中的行号分组) ====================
// ==================== 货架行计算(按 order_num 布局分组) ====================
const batchForm = reactive({
rows: 4,
cols: 6
@@ -886,23 +896,51 @@
const batchPreviewCode = computed(() => {
if (!selectedNode.value?.id) return ''
const path = buildNodeCodePathFromFlat(selectedNode.value.id, flatList.value)
if (!path) return ''
return `${path}-1-1`
const total = Number(batchForm.rows) * Number(batchForm.cols)
const local = total <= 1 ? '1' : `1…${total}`
return path ? `${path}-${local}` : local
})
/** 解析 slotCode "{prefix}{row}-{col}" 格式,提取行号和列号 */
const parseSlotCode = (code: string): { prefix: string; row: number; col: number } | null => {
const match = code.match(/^(.*?)(\d+)-(\d+)$/)
if (!match) return null
return { prefix: match[1], row: parseInt(match[2], 10), col: parseInt(match[3], 10) }
}
const sortSlotsForShelf = (slots: any[]) =>
[...slots].sort((a, b) => {
const oa = getStorageSlotOrderNum(a)
const ob = getStorageSlotOrderNum(b)
if (oa !== ob) return oa - ob
const na = parseInt(String(a.slotCode || ''), 10) || 0
const nb = parseInt(String(b.slotCode || ''), 10) || 0
return na - nb
})
const shelfRows = computed(() => {
const sorted = sortSlotsForShelf(slotList.value)
const hasLayoutOrder = sorted.some((slot) => getStorageSlotOrderNum(slot) >= SLOT_LAYOUT_ROW_STRIDE)
if (hasLayoutOrder) {
const rowMap = new Map<number, any[]>()
for (const slot of sorted) {
const { row } = decodeSlotLayoutOrder(getStorageSlotOrderNum(slot))
if (!rowMap.has(row)) rowMap.set(row, [])
rowMap.get(row)!.push(slot)
}
return [...rowMap.entries()]
.sort(([a], [b]) => a - b)
.map(([rowNum, cells], index) => ({
label: String(index + 1),
rowNum,
prefix: '',
cells: cells.sort(
(a, b) =>
decodeSlotLayoutOrder(getStorageSlotOrderNum(a)).col -
decodeSlotLayoutOrder(getStorageSlotOrderNum(b)).col
)
}))
}
// 兼容旧版「行-列」本地编码
const rowMap = new Map<number, { prefix: string; cells: any[] }>()
const ungrouped: any[] = []
for (const slot of slotList.value) {
const parsed = parseSlotCode(slot.slotCode || '')
for (const slot of sorted) {
const parsed = parseLegacyRowColSlotCode(slot.slotCode || '')
if (parsed) {
if (!rowMap.has(parsed.row)) {
rowMap.set(parsed.row, { prefix: parsed.prefix, cells: [] })
@@ -913,14 +951,11 @@
}
}
// 按行号排序,每个行内按列号排序
const result: { label: string; cells: any[]; rowNum: number; prefix: string }[] = []
const sortedEntries = [...rowMap.entries()].sort(([a], [b]) => a - b)
for (const [rowNum, data] of sortedEntries) {
for (const [rowNum, data] of [...rowMap.entries()].sort(([a], [b]) => a - b)) {
data.cells.sort((a, b) => {
const pa = parseSlotCode(a.slotCode || '')
const pb = parseSlotCode(b.slotCode || '')
const pa = parseLegacyRowColSlotCode(a.slotCode || '')
const pb = parseLegacyRowColSlotCode(b.slotCode || '')
return (pa?.col ?? 0) - (pb?.col ?? 0)
})
result.push({
@@ -931,7 +966,6 @@
})
}
// 无法解析编码的格子归入末尾
if (ungrouped.length > 0) {
result.push({
label: String(result.length + 1),
@@ -962,22 +996,8 @@
remark: ''
})
const validateNodeCode = (_rule: unknown, value: string, callback: (err?: Error) => void) => {
const v = (value || '').trim()
if (!v) {
callback(new Error('请输入节点编号'))
return
}
if (!/^[A-Za-z0-9]+$/.test(v)) {
callback(new Error('编号只能包含字母和数字,不能含连字符'))
return
}
callback()
}
const nodeFormRules = {
nodeName: [{ required: true, message: '请输入节点名称', trigger: 'blur' }],
nodeCode: [{ required: true, validator: validateNodeCode, trigger: 'blur' }]
nodeName: [{ required: true, message: '请输入节点名称', trigger: 'blur' }]
}
const handleAddRoot = () => {
@@ -1106,10 +1126,6 @@
remark: ''
})
const slotFormRules = {
slotCode: [{ required: true, message: '请输入格子编码', trigger: 'blur' }]
}
const handleEditSlot = (row: any) => {
isSlotEdit.value = true
slotDialogTitle.value = '编辑格子'
@@ -1218,25 +1234,17 @@
// ==================== 单独新增行/格子 ====================
const addSlotLoading = ref(false)
/** 在指定行前面追加一个格子 */
/** 在指定行末尾追加一个格子 */
const handleAddSlotInRow = async (rowIndex: number) => {
if (!selectedNode.value?.id || addSlotLoading.value) return
const row = shelfRows.value[rowIndex]
if (!row) return
// 计算该行下一个列号
let nextCol = 1
for (const cell of row.cells) {
const parsed = parseSlotCode(cell.slotCode || '')
if (parsed && parsed.col >= nextCol) nextCol = parsed.col + 1
}
const slotCode = `${row.rowNum}-${nextCol}`
addSlotLoading.value = true
try {
await fetchCreateStorageSlot({
facilityNodeId: selectedNode.value.id,
slotCode,
atRowNum: row.rowNum,
slotStatus: '空'
})
ElMessage.success('新增格子成功')
@@ -1356,9 +1364,6 @@
slotStatus: '空',
remark: ''
})
const occupancySlotFormRules = {
slotCode: [{ required: true, message: '请输入格子编码', trigger: 'blur' }]
}
const handleOccupancySlotSave = async () => {
await occupancySlotFormRef.value?.validate?.()
@@ -30,23 +30,55 @@
v-loading="optionsLoading"
>
<div class="form-grid-2">
<el-form-item label="细胞产品" prop="cellProductId" class="form-col-span-2">
<el-form-item label="生产任务" prop="taskId" class="form-col-span-2">
<el-select
v-model="form.cellProductId"
placeholder="请选择细胞产品"
v-model="form.taskId"
placeholder="请选择生产任务"
filterable
style="width: 100%"
:disabled="!productOptions.length"
:disabled="!productionTasks.length"
@change="handleTaskChange"
>
<el-option
v-for="opt in productOptions"
v-for="opt in taskOptions"
:key="opt.taskId"
:label="formatTaskOptionLabel(opt)"
:value="opt.taskId"
/>
</el-select>
</el-form-item>
<el-form-item label="步骤产出物" prop="stepOutputId" class="form-col-span-2">
<template #label
>步骤产出物<span class="form-label-tip">类型为有效物且已填写条码</span></template
>
<el-select
v-model="form.stepOutputId"
placeholder="请选择步骤产出物"
filterable
style="width: 100%"
:disabled="!form.taskId || !filteredOutputOptions.length"
>
<el-option
v-for="opt in filteredOutputOptions"
:key="opt.id"
:label="formatProductOptionLabel(opt)"
:label="formatStepOutputOptionLabel(opt)"
:value="opt.id"
/>
</el-select>
<p v-if="!optionsLoading && !productOptions.length" class="hint-muted">
暂无产出细胞产品,请先完成生产任务并录入输出。
<p v-if="!optionsLoading && !productionTasks.length" class="hint-muted">
该生产工单下暂无生产任务,请先派发生产任务。
</p>
<p
v-else-if="!optionsLoading && productionTasks.length && !dispatchOptions.length"
class="hint-muted"
>
暂无可派发产出物,请先在生产任务执行中录入类型为「有效物」且含条码的步骤产出。
</p>
<p
v-else-if="!optionsLoading && form.taskId && !filteredOutputOptions.length"
class="hint-muted"
>
该任务下暂无符合条件的步骤产出物。
</p>
</el-form-item>
<el-form-item label="备注" class="form-col-span-2">
@@ -69,7 +101,6 @@
class="btn-main"
type="primary"
:loading="submitting"
:disabled="!productOptions.length"
@click="handleSubmit"
>
<el-icon><Check /></el-icon>确定
@@ -83,13 +114,20 @@
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage } from 'element-plus'
import { Close, Check } from '@element-plus/icons-vue'
import { fetchProductionTaskList } from '@/api/production-task'
import {
fetchProductionWorkOrderCellProductOptions,
fetchProductionWorkOrderQcDispatchOptions,
fetchCreateQcFromProduction,
type ProductionWorkOrderItem,
type ProductionCellProductOption
type ProductionQcDispatchOption
} from '@/api/production-work-order'
interface ProductionTaskOption {
taskId: string
taskNo?: string
taskName?: string
}
defineOptions({ name: 'DispatchQcWorkOrderDialog' })
const props = defineProps<{
@@ -108,41 +146,70 @@
})
const formRef = ref<FormInstance>()
const form = reactive({ cellProductId: '', remark: '' })
const form = reactive({ taskId: '', stepOutputId: '', remark: '' })
const rules: FormRules = {
cellProductId: [{ required: true, message: '请选择细胞产品', trigger: 'change' }]
taskId: [{ required: true, message: '请选择生产任务', trigger: 'change' }],
stepOutputId: [{ required: true, message: '请选择步骤产出物', trigger: 'change' }]
}
const productOptions = ref<ProductionCellProductOption[]>([])
const dispatchOptions = ref<ProductionQcDispatchOption[]>([])
const productionTasks = ref<ProductionTaskOption[]>([])
const optionsLoading = ref(false)
const submitting = ref(false)
function formatProductOptionLabel(opt: ProductionCellProductOption) {
const taskOptions = computed(() => productionTasks.value)
const filteredOutputOptions = computed(() =>
dispatchOptions.value.filter((opt) => opt.taskId === form.taskId)
)
function formatTaskOptionLabel(opt: ProductionTaskOption) {
const parts = [opt.taskNo, opt.taskName].filter(Boolean)
return parts.join(' · ') || opt.taskId || '—'
}
function formatStepOutputOptionLabel(opt: ProductionQcDispatchOption) {
const parts = [
opt.productCode,
opt.productName,
opt.productTypeName ? `(${opt.productTypeName})` : '',
opt.passage ? `P${opt.passage}` : '',
opt.storageSlotName ? `@${opt.storageSlotName}` : ''
opt.processName,
opt.outputName,
opt.outputBarcode ? `条码 ${opt.outputBarcode}` : ''
].filter(Boolean)
const base = parts.join(' ') || opt.id
return opt.taskNo ? `${base} · ${opt.taskNo}` : base
return parts.join(' · ') || opt.id
}
function handleTaskChange() {
form.stepOutputId = ''
formRef.value?.clearValidate(['stepOutputId'])
}
async function loadOptions() {
if (!props.workOrderRow?.id) {
productOptions.value = []
dispatchOptions.value = []
productionTasks.value = []
return
}
optionsLoading.value = true
try {
productOptions.value = (await fetchProductionWorkOrderCellProductOptions(props.workOrderRow.id)) || []
const [dispatchRes, tasksRes] = await Promise.all([
fetchProductionWorkOrderQcDispatchOptions(props.workOrderRow.id),
fetchProductionTaskList({ workOrderId: props.workOrderRow.id, pageSize: 100 })
])
dispatchOptions.value = dispatchRes || []
productionTasks.value = (tasksRes?.list || []).map((task: Record<string, any>) => ({
taskId: task.id,
taskNo: task.taskNo,
taskName: task.taskName
}))
if (productionTasks.value.length === 1) {
form.taskId = productionTasks.value[0].taskId
}
} finally {
optionsLoading.value = false
}
}
function resetForm() {
form.cellProductId = ''
form.taskId = ''
form.stepOutputId = ''
form.remark = ''
formRef.value?.clearValidate()
}
@@ -157,10 +224,8 @@
await formRef.value?.validate()
submitting.value = true
try {
const selected = productOptions.value.find((o) => o.id === form.cellProductId)
await fetchCreateQcFromProduction(props.workOrderRow.id, {
cellProductId: form.cellProductId,
productionTaskId: selected?.taskId,
productionStepOutputId: form.stepOutputId,
remark: form.remark || undefined
})
ElMessage.success(
@@ -0,0 +1,220 @@
<!-- 生产任务 · 工艺步骤派发 / 调整派发 -->
<template>
<el-dialog
v-model="dialogVisible"
:title="dialogTitle"
width="860px"
class="dialog-form-layout dispatch-step-dialog"
align-center
modal-class="protocol-dialog-mask"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@close="handleClose"
>
<p v-if="taskName" class="dispatch-step-dialog__task-name">任务:{{ taskName }}</p>
<el-table v-loading="loading" :data="rows" stripe class="list-table dispatch-step-table">
<el-table-column label="序号" min-width="64" align="center">
<template #default="{ $index }">{{ $index + 1 }}</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" min-width="140" show-overflow-tooltip />
<el-table-column label="负责人" min-width="220">
<template #default="{ row }">
<el-select
v-model="row.assigneeUserIds"
multiple
filterable
remote
reserve-keyword
collapse-tags
collapse-tags-tooltip
placeholder="选择负责人"
style="width: 100%"
:loading="userLoading"
:remote-method="remoteSearchUsers"
@visible-change="onUserSelectVisible"
>
<el-option
v-for="u in mergedUserOptions(row)"
:key="u.id"
:label="`${u.nickName}(${u.userNo})`"
:value="u.id"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="计划开始时间" min-width="200">
<template #default="{ row }">
<el-date-picker
v-model="row.plannedStartTime"
type="datetime"
placeholder="可选"
format="YYYY-MM-DD HH:mm"
value-format="YYYY-MM-DDTHH:mm:00"
style="width: 100%"
clearable
/>
</template>
</el-table-column>
</el-table>
<p class="form-label-tip dispatch-step-dialog__hint">至少为一个步骤指定负责人;未派发的步骤仅管理员可见。</p>
<template #footer>
<el-button class="btn-ghost" @click="handleClose">
<el-icon><Close /></el-icon>取消
</el-button>
<el-button class="btn-main" type="primary" :loading="submitting" @click="handleSubmit">
<el-icon><Check /></el-icon>确定
</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { Close, Check } from '@element-plus/icons-vue'
import { fetchUserList } from '@/api/admin'
import { fetchProductionTaskDetail, fetchDispatchProductionTaskSteps } from '@/api/production-task'
defineOptions({ name: 'DispatchStepDialog' })
const props = defineProps<{
visible: boolean
taskId: string
taskName?: string
}>()
const emit = defineEmits<{
(e: 'update:visible', val: boolean): void
(e: 'success'): void
}>()
const dialogVisible = computed({
get: () => props.visible,
set: (val) => emit('update:visible', val)
})
const dialogTitle = computed(() => (hasAnyAssignee.value ? '调整步骤派发' : '步骤派发'))
const loading = ref(false)
const submitting = ref(false)
const userLoading = ref(false)
const userOptions = ref<Api.User.UserItem[]>([])
type StepDispatchRow = {
stepId: string
processName: string
assigneeUserIds: string[]
plannedStartTime: string | null
presetUsers: Api.User.UserItem[]
}
const rows = ref<StepDispatchRow[]>([])
const hasAnyAssignee = ref(false)
function mergedUserOptions(row: StepDispatchRow) {
const map = new Map<string, Api.User.UserItem>()
for (const u of userOptions.value) map.set(u.id, u)
for (const u of row.presetUsers) map.set(u.id, u)
return [...map.values()]
}
async function remoteSearchUsers(query: string) {
userLoading.value = true
try {
const res = await fetchUserList({
page: 1,
pageSize: 50,
keyword: query?.trim() || undefined,
status: '1'
})
userOptions.value = res.list || []
} catch {
userOptions.value = []
} finally {
userLoading.value = false
}
}
function onUserSelectVisible(visible: boolean) {
if (visible) void remoteSearchUsers('')
}
async function loadSteps() {
if (!props.taskId) {
rows.value = []
return
}
loading.value = true
try {
const detail = await fetchProductionTaskDetail(props.taskId)
const steps = (detail?.steps || []) as Record<string, any>[]
hasAnyAssignee.value = steps.some((s) => (s.assigneeUserIds || []).length > 0)
rows.value = steps.map((s) => ({
stepId: s.id,
processName: s.processName || '未命名步骤',
assigneeUserIds: [...(s.assigneeUserIds || [])],
plannedStartTime: s.plannedStartTime || null,
presetUsers: (s.assignees || []).map((a: Record<string, any>) => ({
id: a.userId,
nickName: a.nickName,
userNo: a.userNo
})) as Api.User.UserItem[]
}))
} finally {
loading.value = false
}
}
function handleClose() {
dialogVisible.value = false
rows.value = []
}
async function handleSubmit() {
if (!props.taskId) return
const payload = rows.value
.filter((r) => r.assigneeUserIds.length > 0)
.map((r) => ({
stepId: r.stepId,
assigneeUserIds: r.assigneeUserIds,
plannedStartTime: r.plannedStartTime
}))
if (!payload.length) {
ElMessage.warning('请至少为一个步骤指定负责人')
return
}
submitting.value = true
try {
await fetchDispatchProductionTaskSteps(props.taskId, { steps: payload })
ElMessage.success('步骤派发成功')
emit('success')
handleClose()
} finally {
submitting.value = false
}
}
watch(
() => props.visible,
(val) => {
if (val) {
void remoteSearchUsers('')
void loadSteps()
}
}
)
</script>
<style scoped lang="scss">
.dispatch-step-dialog__task-name {
margin: 0 0 12px;
font-size: 14px;
color: var(--mint-text-muted, #64748b);
}
.dispatch-step-dialog__hint {
display: block;
margin-top: 12px;
}
</style>
@@ -33,27 +33,6 @@
<el-form-item label="任务名称" prop="taskName" class="form-col-span-2">
<el-input v-model="form.taskName" placeholder="请输入任务名称" maxlength="200" />
</el-form-item>
<el-form-item label="负责人" prop="assigneeUserId" class="form-col-span-2">
<el-select
v-model="form.assigneeUserId"
filterable
remote
reserve-keyword
clearable
placeholder="输入姓名检索负责人"
style="width: 100%"
:loading="userLoading"
:remote-method="remoteSearchUsers"
@visible-change="onUserSelectVisible"
>
<el-option
v-for="u in userOptions"
:key="u.id"
:label="`${u.nickName}(${u.userNo})`"
:value="u.id"
/>
</el-select>
</el-form-item>
<el-form-item label="工艺路线" class="form-col-span-2">
<template #label
>工艺路线<span class="form-label-tip">可选,不选则从零创建工艺过程</span></template
@@ -228,7 +207,6 @@
import { Rank, Plus, CopyDocument, Delete, Close, Check } from '@element-plus/icons-vue'
import { VueDraggable as draggable } from 'vue-draggable-plus'
import { fetchCreateProductionTask } from '@/api/production-task'
import { fetchUserList } from '@/api/admin'
import { productionTaskTypeForWorkOrder } from '@/utils/production-labels'
import { fetchProcessRouteList } from '@/api/production'
import type { FormInstance, FormRules } from 'element-plus'
@@ -247,6 +225,7 @@
const emit = defineEmits<{
(e: 'update:visible', val: boolean): void
(e: 'success'): void
(e: 'needStepDispatch', payload: { taskId: string; taskName: string }): void
}>()
const dialogVisible = computed({
@@ -260,19 +239,15 @@
const formRef = ref<FormInstance>()
const routeOptions = ref<any[]>([])
const userOptions = ref<Api.User.UserItem[]>([])
const userLoading = ref(false)
const routeLoading = ref(false)
const form = reactive({
taskName: '',
assigneeUserId: '',
routeId: '',
description: '',
remark: ''
})
const rules: FormRules = {
taskName: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
assigneeUserId: [{ required: true, message: '请选择负责人', trigger: 'change' }]
taskName: [{ required: true, message: '请输入任务名称', trigger: 'blur' }]
}
const editor = useTaskStepEditor()
@@ -297,27 +272,6 @@
return editor.initEditor(taskId, options)
}
async function remoteSearchUsers(query: string) {
userLoading.value = true
try {
const res = await fetchUserList({
page: 1,
pageSize: 50,
keyword: query?.trim() || undefined,
status: '1'
})
userOptions.value = res.list || []
} catch {
userOptions.value = []
} finally {
userLoading.value = false
}
}
function onUserSelectVisible(visible: boolean) {
if (visible) void remoteSearchUsers('')
}
async function remoteSearchRoutes(query: string) {
routeLoading.value = true
try {
@@ -344,7 +298,6 @@
phase.value = 'form'
createdTaskName.value = ''
form.taskName = ''
form.assigneeUserId = ''
form.routeId = ''
form.description = ''
form.remark = ''
@@ -361,7 +314,6 @@
work_order_id: props.workOrderRow.id,
task_type: productionTaskTypeForWorkOrder(props.workOrderRow.workOrderType),
task_name: form.taskName,
assigneeUserId: form.assigneeUserId,
route_id: form.routeId,
description: form.description || undefined,
remark: form.remark || undefined
@@ -379,6 +331,9 @@
} else {
ElMessage.success('任务已创建,可编辑步骤')
}
if (expectSteps && stepCount > 0) {
emit('needStepDispatch', { taskId, taskName: form.taskName })
}
emit('success')
} catch {
/* global error handling */
@@ -399,7 +354,6 @@
// 新建任务:走阶段一表单(已在编辑阶段时不重置,避免生成任务后被 watch 打回表单)
phase.value = 'form'
form.taskName = ''
form.assigneeUserId = ''
form.routeId = ''
form.description = ''
form.remark = ''
@@ -410,7 +364,7 @@
form.taskName = `${props.workOrderRow.workOrderNo}任务`
}
void remoteSearchRoutes('')
void remoteSearchUsers('')
void editor.remoteSearchStepAssigneeUsers('')
}
}
}
@@ -14,7 +14,7 @@
@change="(val) => handleCardSelect(row, Boolean(val))"
/>
<span class="production-work-order-card__index">{{ cardIndex(idx) }}</span>
<span class="production-work-order-card__no">{{ row.workOrderNo || '—' }}</span>
<span class="production-work-order-card__no">{{ cardTitleLabel(row) }}</span>
<el-tag :type="productionWoStatusTag(row.workOrderStatus).type" size="small">
{{ productionWoStatusTag(row.workOrderStatus).label }}
</el-tag>
@@ -174,18 +174,38 @@
</section>
</div>
</header>
<QcWorkOrderProtocolPaymentPanel
v-if="showProtocolFeeSummary(row)"
:summary="row.paymentSummary"
compact
class="production-work-order-card__fee-in-head"
/>
<QcWorkOrderFeeSummaryBar
v-if="showOutboundFeeSummary(row)"
variant="basic-experiment"
:fee-summary="row.feeSummary"
class="production-work-order-card__fee-in-head"
/>
<template v-if="hasFeeInfo(row)">
<div
v-if="isMineMode && !isFeeExpanded(row.id)"
class="production-work-order-card__fee-toggle-bar"
>
<el-button class="btn-ghost" @click="toggleFeeExpand(row.id)">
<el-icon><ArrowDown /></el-icon>展开费用
</el-button>
</div>
<template v-if="!isMineMode || isFeeExpanded(row.id)">
<QcWorkOrderProtocolPaymentPanel
v-if="showProtocolFeeSummary(row)"
:summary="row.paymentSummary"
compact
class="production-work-order-card__fee-in-head"
/>
<QcWorkOrderFeeSummaryBar
v-if="showOutboundFeeSummary(row)"
variant="basic-experiment"
:fee-summary="row.feeSummary"
class="production-work-order-card__fee-in-head"
/>
</template>
<div
v-if="isMineMode && isFeeExpanded(row.id)"
class="production-work-order-card__fee-toggle-bar production-work-order-card__fee-toggle-bar--after-fee"
>
<el-button class="btn-ghost" @click="toggleFeeExpand(row.id)">
<el-icon><ArrowUp /></el-icon>收起
</el-button>
</div>
</template>
<section class="production-work-order-card__tasks">
<WorkOrderTaskSubList
embedded
@@ -218,8 +238,8 @@
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { View, Position, Document, Check, More, EditPen, Delete } from '@element-plus/icons-vue'
import { computed, ref } from 'vue'
import { View, Position, Document, Check, More, EditPen, Delete, ArrowDown, ArrowUp } from '@element-plus/icons-vue'
import type { ProductionWorkOrderItem } from '@/api/production-work-order'
import type { OutboundQcDetailProduct } from '@/api/qc-work-order'
import type { ProductionWorkOrderCardMetaConfig } from '@/utils/production-work-order-card-meta'
@@ -256,12 +276,42 @@
const isMineMode = computed(() => props.pageMode === 'mine')
const expandedFeeIds = ref<Set<string>>(new Set())
function isFeeExpanded(id: string) {
return expandedFeeIds.value.has(id)
}
function toggleFeeExpand(id: string) {
const next = new Set(expandedFeeIds.value)
if (next.has(id)) {
next.delete(id)
} else {
next.add(id)
}
expandedFeeIds.value = next
}
const cardMeta = computed(
() =>
props.cardMetaConfig ??
getCardMetaConfigForLegacyTab(props.activeTypeTab || 'inbound')
)
const INBOUND_SAMPLE_TITLE_TAB_KEYS = new Set([
'inbound_cell_storage',
'inbound_research_donation'
])
function cardTitleLabel(row: ProductionWorkOrderItem) {
if (INBOUND_SAMPLE_TITLE_TAB_KEYS.has(cardMeta.value.tabKey)) {
const lab = (row.labStorageCode || '').trim() || '—'
const sample = (row.sampleCode || '').trim() || '—'
return `${lab} - ${sample}`
}
return row.workOrderNo || '—'
}
const emit = defineEmits<{
view: [row: ProductionWorkOrderItem]
dispatch: [row: ProductionWorkOrderItem]
@@ -293,6 +343,10 @@
return cardMeta.value.showOutboundFeeSummary && !!row.feeSummary
}
function hasFeeInfo(row: ProductionWorkOrderItem) {
return showProtocolFeeSummary(row) || showOutboundFeeSummary(row)
}
function cellProducts(row: ProductionWorkOrderItem): OutboundQcDetailProduct[] {
return row.products?.length ? row.products : []
}
@@ -331,9 +385,9 @@
function dispatchQcTooltip(row: ProductionWorkOrderItem) {
if (!cardMeta.value.allowDispatchQc) return ''
if (row.workOrderStatus === 'dpz') return '请先派发并完成生产任务,录入输出细胞产品后再派发质检'
if (row.workOrderStatus === 'dpz') return '请先派发生产任务,并在步骤中录入有效物产出及条码后再派发质检'
if (row.workOrderStatus === 'yzf') return '已作废工单不可派发质检'
return '请先完成生产任务并录入输出细胞产品'
return '请先在生产任务步骤中录入类型为有效物且含条码的产出物'
}
function canComplete(row: ProductionWorkOrderItem) {
@@ -447,12 +501,28 @@
.production-work-order-card__no {
font-size: 15px;
font-weight: 600;
font-weight: 700;
color: #1e293b;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
word-break: break-all;
}
.production-work-order-card__fee-toggle-bar {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-start;
gap: 8px;
padding: 8px 16px;
border-top: 1px solid #e2e8f0;
background: #fff;
&--after-fee {
border-top: none;
border-bottom: 1px solid #e2e8f0;
}
}
.production-work-order-card__meta {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
@@ -476,6 +546,7 @@
dd {
margin: 0;
font-size: 13px;
font-weight: 600;
line-height: 1.4;
color: #334155;
word-break: break-word;
@@ -13,7 +13,11 @@
{{ editor.stepStatusTag(editor.selectedStep.value.stepStatus || 'dzx').label }}
</el-tag>
<el-button
v-if="editor.selectedStep.value.stepStatus === 'dzx'"
v-if="
editor.mode.value === 'execution' &&
editor.canEditStep(editor.selectedStep.value) &&
editor.selectedStep.value.stepStatus === 'dzx'
"
class="btn-main task-exec-toolbar-btn"
type="primary"
:loading="editor.stepActionLoading.value"
@@ -23,7 +27,11 @@
<el-icon><VideoPlay /></el-icon>执行此步骤
</el-button>
<el-button
v-if="editor.selectedStep.value.stepStatus === 'jxz'"
v-if="
editor.mode.value === 'execution' &&
editor.canEditStep(editor.selectedStep.value) &&
editor.selectedStep.value.stepStatus === 'jxz'
"
class="btn-main task-exec-toolbar-btn"
type="success"
:loading="editor.stepActionLoading.value"
@@ -34,6 +42,10 @@
</el-button>
</template>
<el-button
v-if="
editor.canEditStep(editor.selectedStep.value) ||
(editor.canEditStepDispatch() && !readonly)
"
class="btn-main task-exec-toolbar-btn"
type="primary"
:loading="editor.manualSaveLoading.value"
@@ -100,6 +112,81 @@
:disabled="readonly"
/>
</el-form-item>
<el-form-item
v-if="editor.canEditStepDispatch() && !readonly"
label="负责人"
class="step-form-col-half"
>
<el-select
v-model="editor.selectedStep.value.assigneeUserIds"
multiple
filterable
remote
reserve-keyword
collapse-tags
collapse-tags-tooltip
placeholder="选择负责人(可多选)"
style="width: 100%"
:loading="editor.stepAssigneeUserOptionsLoading.value"
:remote-method="editor.remoteSearchStepAssigneeUsers"
@visible-change="editor.onStepAssigneeSelectVisible"
>
<el-option
v-for="u in editor.mergedStepAssigneeUserOptions(editor.selectedStep.value)"
:key="u.id"
:label="`${u.nickName}(${u.userNo})`"
:value="u.id"
/>
</el-select>
<p
v-if="!(editor.selectedStep.value.assigneeUserIds || []).length"
class="form-tip"
>
未派发;保存后可在本处或「步骤派发」中指定负责人
</p>
</el-form-item>
<el-form-item
v-else-if="editor.mode.value === 'edit' || editor.mode.value === 'execution'"
label="负责人"
class="step-form-col-half"
>
<template v-if="(editor.selectedStep.value.assignees || []).length">
<el-tag
v-for="a in editor.selectedStep.value.assignees"
:key="a.userId"
size="small"
class="step-assignee-readonly-tag"
>
{{ a.nickName || a.userNo || a.userId }}
</el-tag>
</template>
<span v-else class="form-tip">未派发</span>
</el-form-item>
<el-form-item
v-if="editor.canEditStepDispatch() && !readonly"
label="计划开始时间"
class="step-form-col-half"
>
<template #label
>计划开始时间<span class="form-label-tip">仅展示与排序,不限制执行</span></template
>
<el-date-picker
v-model="editor.selectedStep.value.plannedStartTime"
type="datetime"
placeholder="可选"
format="YYYY-MM-DD HH:mm"
value-format="YYYY-MM-DDTHH:mm:00"
style="width: 100%"
clearable
/>
</el-form-item>
<el-form-item
v-else-if="editor.mode.value === 'edit' || editor.mode.value === 'execution'"
label="计划开始时间"
class="step-form-col-half"
>
<span>{{ editor.selectedStep.value.plannedStartTime || '—' }}</span>
</el-form-item>
<el-form-item label="描述" class="step-form-col-half">
<el-input
v-model="editor.selectedStep.value.description"
@@ -946,6 +1033,10 @@
grid-column: 1 / -1;
}
.step-assignee-readonly-tag {
margin-right: 6px;
}
.step-sop-attachment-row {
margin-top: -4px;
@@ -155,7 +155,7 @@
<div class="execution-step-list-header">
<h3>工序步骤</h3>
<span class="execution-progress-badge"
>{{ editor.completedStepCount.value }}/{{ editor.stepList.value.length }}</span
>{{ editor.completedStepCount.value }}/{{ editor.executionStepList.value.length }}</span
>
</div>
<div class="execution-step-list-body">
@@ -227,12 +227,13 @@
@end="editor.onStepDragEnd"
>
<div
v-for="(element, index) in editor.stepList.value"
v-for="(element, index) in editor.executionStepList.value"
:key="element.id"
class="route-config-step-card"
:class="{
'is-active': editor.selectedStepId.value === element.id,
'is-done': element.stepStatus === 'ywc'
'is-done': element.stepStatus === 'ywc',
'is-readonly': !editor.canEditStep(element)
}"
@click="editor.selectStep(element)"
>
@@ -277,7 +278,7 @@
</div>
</draggable>
<div v-if="!editor.stepList.value.length" class="execution-step-list-empty">
<div v-if="!editor.executionStepList.value.length" class="execution-step-list-empty">
<el-icon :size="32" color="#a8d4c4"><Plus /></el-icon>
<p>从左侧拖拽工序到此处,添加任务步骤</p>
</div>
@@ -716,6 +717,10 @@
.route-config-step-card.is-done {
opacity: 0.6;
}
.route-config-step-card.is-readonly:not(.is-active) {
opacity: 0.72;
cursor: default;
}
/* 右侧详情面板 */
.execution-detail-panel {
@@ -96,11 +96,8 @@
<el-dropdown-item v-if="canEnterExecution(row)" command="view">
<el-icon><View /></el-icon>查看
</el-dropdown-item>
<el-dropdown-item v-if="canForwardTask(row)" command="forward">
<el-icon><Share /></el-icon>转发任务
</el-dropdown-item>
<el-dropdown-item v-if="canReassignTask(row)" command="reassign">
<el-icon><User /></el-icon>改派负责人
<el-dropdown-item v-if="canDispatchSteps(row)" command="stepDispatch">
<el-icon><Position /></el-icon>步骤派发
</el-dropdown-item>
<el-dropdown-item v-if="canEditTask(row)" command="editInfo">
<el-icon><EditPen /></el-icon>编辑信息
@@ -158,24 +155,24 @@
:task-name="executionTaskName"
:readonly="executionReadonly"
:operate-scope="operateScope"
:allow-forward="canForwardInDialog"
:allow-forward="false"
append-to-body
@success="handleTaskMutationSuccess"
/>
<ForwardTaskDialog
v-model:visible="forwardVisible"
:task-id="forwardTaskId"
:mode="forwardMode"
:operate-scope="operateScope"
@success="handleTaskMutationSuccess"
/>
<DispatchTaskDialog
v-if="workOrder"
v-model:visible="dispatchVisible"
:work-order-row="workOrder"
@success="handleTaskMutationSuccess"
@need-step-dispatch="handleNeedStepDispatch"
/>
<DispatchStepDialog
v-model:visible="stepDispatchVisible"
:task-id="stepDispatchTaskId"
:task-name="stepDispatchTaskName"
@success="handleTaskMutationSuccess"
/>
<DispatchTaskDialog
@@ -204,9 +201,7 @@
Position,
EditPen,
More,
Delete,
Share,
User
Delete
} from '@element-plus/icons-vue'
import {
fetchProductionTaskList,
@@ -215,8 +210,8 @@
type ProductionTaskOperateScope
} from '@/api/production-task'
import TaskExecutionDialog from './TaskExecutionDialog.vue'
import ForwardTaskDialog from './ForwardTaskDialog.vue'
import DispatchTaskDialog from './DispatchTaskDialog.vue'
import DispatchStepDialog from './DispatchStepDialog.vue'
import EditTaskInfoDialog from './EditTaskInfoDialog.vue'
import { useUserStore } from '@/store/modules/user'
import {
@@ -274,7 +269,10 @@
function isCurrentAssignee(row: Record<string, any>) {
const uid = String(userStore.info?.id || userStore.info?.userId || '').trim()
return uid && String(row.currentAssigneeUserId || '') === uid
if (!uid) return false
if (String(row.currentAssigneeUserId || '') === uid) return true
if (isMineMode.value && props.listMode !== 'mine-history' && !row.handoverTime) return true
return false
}
function isMineHistoryRow(row: Record<string, any>) {
@@ -290,14 +288,17 @@
return row.taskStatus === 'dpz' || row.taskStatus === 'jxz'
}
function canForwardTask(row: Record<string, any>) {
if (isMineHistoryRow(row)) return false
if (isMineMode.value) return isCurrentAssignee(row)
return operateScope.value === 'manage'
function canForwardTask(_row: Record<string, any>) {
return false
}
function canReassignTask(row: Record<string, any>) {
return !isMineMode.value && operateScope.value === 'manage'
function canReassignTask(_row: Record<string, any>) {
return false
}
function canDispatchSteps(row: Record<string, any>) {
if (isMineMode.value) return false
return row.taskStatus === 'dpz' || row.taskStatus === 'jxz'
}
function canEditTask(row: Record<string, any>) {
@@ -313,7 +314,7 @@
function hasMoreTaskActions(row: Record<string, any>) {
if (canEnterExecution(row)) return true
return canEditTask(row) || canDeleteTask(row)
return canEditTask(row) || canDeleteTask(row) || canDispatchSteps(row)
}
async function loadData() {
@@ -365,17 +366,31 @@
const dispatchVisible = ref(false)
const stepDispatchVisible = ref(false)
const stepDispatchTaskId = ref('')
const stepDispatchTaskName = ref('')
function handleNeedStepDispatch(payload: { taskId: string; taskName: string }) {
stepDispatchTaskId.value = payload.taskId
stepDispatchTaskName.value = payload.taskName
stepDispatchVisible.value = true
}
function openStepDispatch(row: Record<string, any>) {
stepDispatchTaskId.value = row.id
stepDispatchTaskName.value = row.taskName || ''
stepDispatchVisible.value = true
}
const executionDialogVisible = ref(false)
const executionTaskId = ref('')
const executionTaskName = ref('')
const executionReadonly = ref(false)
const canForwardInDialog = ref(false)
function handleEnterExecution(row: Record<string, any>) {
executionTaskId.value = row.id
executionTaskName.value = row.taskName || ''
executionReadonly.value = false
canForwardInDialog.value = canForwardTask(row)
executionDialogVisible.value = true
}
@@ -383,14 +398,9 @@
executionTaskId.value = row.id
executionTaskName.value = row.taskName || ''
executionReadonly.value = true
canForwardInDialog.value = false
executionDialogVisible.value = true
}
const forwardVisible = ref(false)
const forwardTaskId = ref('')
const forwardMode = ref<'forward' | 'reassign'>('forward')
const editInfoVisible = ref(false)
const editInfoTaskId = ref('')
@@ -412,15 +422,8 @@
editRouteTaskName.value = row.taskName || ''
editRouteVisible.value = true
break
case 'forward':
forwardTaskId.value = row.id
forwardMode.value = 'forward'
forwardVisible.value = true
break
case 'reassign':
forwardTaskId.value = row.id
forwardMode.value = 'reassign'
forwardVisible.value = true
case 'stepDispatch':
openStepDispatch(row)
break
case 'delete':
handleDelete(row)
@@ -72,6 +72,14 @@
v-model:visible="dispatchVisible"
:work-order-row="dispatchRow"
@success="refreshActiveTab"
@need-step-dispatch="handleNeedStepDispatch"
/>
<DispatchStepDialog
v-model:visible="stepDispatchVisible"
:task-id="stepDispatchTaskId"
:task-name="stepDispatchTaskName"
@success="refreshActiveTab"
/>
<DispatchQcWorkOrderDialog
@@ -117,6 +125,7 @@
} from '@/utils/production-work-order-tabs'
import ProductionWorkOrderTabPanel from './tabs/ProductionWorkOrderTabPanel.vue'
import DispatchTaskDialog from './DispatchTaskDialog.vue'
import DispatchStepDialog from './DispatchStepDialog.vue'
import DispatchQcWorkOrderDialog from './DispatchQcWorkOrderDialog.vue'
import WorkOrderRemarkDialog from '@/components/business/work-order-remark-dialog/index.vue'
import SampleReceptionDialog from './SampleReceptionDialog.vue'
@@ -210,6 +219,16 @@
const dispatchVisible = ref(false)
const dispatchRow = ref<ProductionWorkOrderItem | null>(null)
const stepDispatchVisible = ref(false)
const stepDispatchTaskId = ref('')
const stepDispatchTaskName = ref('')
function handleNeedStepDispatch(payload: { taskId: string; taskName: string }) {
stepDispatchTaskId.value = payload.taskId
stepDispatchTaskName.value = payload.taskName
stepDispatchVisible.value = true
}
function handleOpenDispatch(row: ProductionWorkOrderItem) {
dispatchRow.value = row
dispatchVisible.value = true
@@ -13,8 +13,10 @@ import {
fetchUpdateProductionTaskStatus,
fetchUpdateProductionTask,
fetchSetTaskInputs,
fetchSetTaskOutputs
fetchSetTaskOutputs,
fetchDispatchProductionTaskSteps
} from '@/api/production-task'
import { fetchUserList } from '@/api/admin'
import {
fetchAllProcesses,
fetchAllProcessCategories,
@@ -37,6 +39,7 @@ import {
} from '@/api/production-material'
import type { FinanceAttachmentItem } from '@/components/business/protocol-finance-confirm-fields/finance-attachments'
import { financeAttachmentsToUrlString } from '@/components/business/protocol-finance-confirm-fields/finance-attachments'
import { useUserStore } from '@/store/modules/user'
// ── helpers ──────────────────────────────────────────────────────────
function parseTaskAttachmentsFromUrls(urls: string): FinanceAttachmentItem[] {
@@ -57,9 +60,20 @@ function fromApiFlag(val: boolean | number | string | undefined): boolean {
return val === true || val === 1 || val === '1'
}
function normalizeStepSubTables(step: Record<string, any>) {
const assigneeUserIds = (step.assigneeUserIds || []).length
? [...step.assigneeUserIds]
: (step.assignees || [])
.map((a: Record<string, any>) => a.userId)
.filter((id: string) => String(id || '').trim())
const plannedStartTime = step.plannedStartTime || null
return {
...step,
equipmentIds: parseEquipmentIds(step.equipmentIds || step.equipmentName),
assigneeUserIds,
assignees: step.assignees || [],
plannedStartTime,
_snapshotAssigneeUserIds: [...assigneeUserIds],
_snapshotPlannedStartTime: plannedStartTime || '',
reagents: (step.reagents || []).map((r: Record<string, any>) => ({
...r,
isKeyMaterial: fromApiFlag(r.isKeyMaterial)
@@ -81,11 +95,46 @@ function parseOrderNum(value: unknown): number {
// ── composable ───────────────────────────────────────────────────────
export function useTaskStepEditor() {
const userStore = useUserStore()
const operateScope = ref<import('@/api/production-task').ProductionTaskOperateScope | undefined>(
undefined
)
const taskId = ref('')
const stepList = ref<Record<string, any>[]>([])
function canEditStep(step: Record<string, any> | null | undefined): boolean {
if (!step) return false
if (operateScope.value !== 'mine') return true
const uid = String(userStore.info?.id || userStore.info?.userId || '').trim()
const ids: string[] = step.assigneeUserIds || []
if (uid && ids.includes(uid)) return true
if (!ids.length && canEditStepOnTaskForMine(uid)) return true
return false
}
/** 步骤负责人与计划开始时间是否可在详情中编辑(执行弹窗 manage / mine 均可) */
function canEditStepDispatch(): boolean {
return true
}
function canEditStepOnTaskForMine(uid: string): boolean {
if (!uid) return false
if (stepList.value.some((s) => (s.assigneeUserIds || []).includes(uid))) return true
const taskAssignee = String(taskDetail.value?.currentAssigneeUserId || '').trim()
return taskAssignee === uid
}
const executionStepList = computed(() => {
if (operateScope.value !== 'mine') return stepList.value
const uid = String(userStore.info?.id || userStore.info?.userId || '').trim()
return stepList.value.filter((s) => {
const ids: string[] = s.assigneeUserIds || []
if (uid && ids.includes(uid)) return true
// 未派发步骤:任务内任一步负责人可在执行弹窗中看见并配置(含工艺库新增)
if (!ids.length && canEditStepOnTaskForMine(uid)) return true
return false
})
})
const selectedStepId = ref('')
const stepListLoading = ref(false)
const processLibraryLoading = ref(false)
@@ -155,6 +204,9 @@ export function useTaskStepEditor() {
const sampleCodeOptions = ref<Api.BizSampleCode.SampleCodeItem[]>([])
const sampleCodeOptionsLoading = ref(false)
const stepAssigneeUserOptions = ref<Api.User.UserItem[]>([])
const stepAssigneeUserOptionsLoading = ref(false)
function mapItemUnitOption(u: { unitName?: string; unitCode?: string }) {
const name = (u.unitName || '').trim()
const code = (u.unitCode || '').trim()
@@ -862,6 +914,7 @@ export function useTaskStepEditor() {
}
}
function selectStep(step: Record<string, any>) {
ensureStepAssigneeFields(step)
selectedStepId.value = step.id
selectedVirtualStep.value = null
}
@@ -901,6 +954,77 @@ export function useTaskStepEditor() {
}
}
function stepDispatchChanged(step: Record<string, any>): boolean {
const curIds = [...(step.assigneeUserIds || [])].sort().join(',')
const snapIds = [...(step._snapshotAssigneeUserIds || [])].sort().join(',')
if (curIds !== snapIds) return true
const curTime = step.plannedStartTime || ''
const snapTime = step._snapshotPlannedStartTime || ''
return curTime !== snapTime
}
function mergedStepAssigneeUserOptions(step: Record<string, any> | null) {
const map = new Map<string, Api.User.UserItem>()
for (const u of stepAssigneeUserOptions.value) map.set(u.id, u)
for (const a of step?.assignees || []) {
const id = String(a.userId || '').trim()
if (!id) continue
map.set(id, {
id,
nickName: a.nickName || '',
userNo: a.userNo || ''
} as Api.User.UserItem)
}
return [...map.values()]
}
async function remoteSearchStepAssigneeUsers(query: string) {
stepAssigneeUserOptionsLoading.value = true
try {
const res = await fetchUserList({
page: 1,
pageSize: 50,
keyword: query?.trim() || undefined,
status: '1'
})
stepAssigneeUserOptions.value = res.list || []
} catch {
stepAssigneeUserOptions.value = []
} finally {
stepAssigneeUserOptionsLoading.value = false
}
}
function onStepAssigneeSelectVisible(visible: boolean) {
if (visible) void remoteSearchStepAssigneeUsers('')
}
function ensureStepAssigneeFields(step: Record<string, any>) {
if (!Array.isArray(step.assigneeUserIds)) step.assigneeUserIds = []
}
async function saveStepDispatch() {
if (!selectedStep.value || !canEditStepDispatch()) return
const step = selectedStep.value
if (!stepDispatchChanged(step)) return
const assigneeUserIds = [...(step.assigneeUserIds || [])]
await fetchDispatchProductionTaskSteps(
taskId.value,
{
steps: [
{
stepId: step.id,
assigneeUserIds,
plannedStartTime: step.plannedStartTime || null
}
]
},
operateScope.value
)
step._snapshotAssigneeUserIds = [...assigneeUserIds]
step._snapshotPlannedStartTime = step.plannedStartTime || ''
}
async function saveStepBasic() {
if (!selectedStep.value) return
try {
@@ -1379,16 +1503,25 @@ export function useTaskStepEditor() {
const taskActionLoading = ref(false)
async function handleManualSave() {
if (!selectedStep.value || manualSaveLoading.value) return
const step = selectedStep.value
const canBasic = canEditStep(step)
const canDispatch = canEditStepDispatch() && stepDispatchChanged(step)
if (!canBasic && !canDispatch) return
manualSaveLoading.value = true
try {
await Promise.all([
saveStepBasic(),
saveReagents(),
saveConsumables(),
saveConfiguredReagents(),
saveOutputs(),
saveDataCollections()
])
if (canBasic) {
await Promise.all([
saveStepBasic(),
saveReagents(),
saveConsumables(),
saveConfiguredReagents(),
saveOutputs(),
saveDataCollections()
])
}
if (canDispatch) {
await saveStepDispatch()
}
ElMessage.success('保存成功')
} catch {
ElMessage.error('保存失败,请重试')
@@ -1399,6 +1532,10 @@ export function useTaskStepEditor() {
async function handleStartStep(step: Record<string, any>) {
if (!taskId.value || !step.id || stepActionLoading.value) return
if (!canEditStep(step)) {
ElMessage.warning('非当前步骤负责人,无法操作')
return
}
stepActionLoading.value = true
try {
await fetchUpdateTaskStep(taskId.value, step.id, { step_status: 'jxz' }, operateScope.value)
@@ -1413,6 +1550,10 @@ export function useTaskStepEditor() {
async function handleCompleteStep(step: Record<string, any>) {
if (!taskId.value || !step.id || stepActionLoading.value) return
if (!canEditStep(step)) {
ElMessage.warning('非当前步骤负责人,无法操作')
return
}
try {
await ElMessageBox.confirm('确定完成该步骤吗?', '提示', { type: 'warning' })
} catch {
@@ -1648,6 +1789,9 @@ export function useTaskStepEditor() {
void loadConfigReferenceData().catch(() => {
/* 工艺库参考数据失败不阻断步骤展示 */
})
if (canEditStepDispatch()) {
void remoteSearchStepAssigneeUsers('')
}
} finally {
stepListLoading.value = false
await nextTick()
@@ -1659,6 +1803,9 @@ export function useTaskStepEditor() {
return {
taskId,
stepList,
executionStepList,
canEditStep,
canEditStepDispatch,
selectedStepId,
selectedStep,
stepListLoading,
@@ -1730,6 +1877,14 @@ export function useTaskStepEditor() {
taskStatusTag,
stepStatusTag,
saveStepBasic,
saveStepDispatch,
stepDispatchChanged,
stepAssigneeUserOptions,
stepAssigneeUserOptionsLoading,
mergedStepAssigneeUserOptions,
remoteSearchStepAssigneeUsers,
onStepAssigneeSelectVisible,
ensureStepAssigneeFields,
onStepEquipmentChange,
onSopIdsChange,
searchItemUnitOptions,