This commit is contained in:
zlwu committed 2026-07-13 12:11:13 +08:00
1 parent df53d05193
commit f90726927e
50 files changed
+16281 -12780

No files matched your search

+30
View File
@@ -282,6 +282,36 @@ export function fetchSetTaskInputs(
})
}
export interface SpawnTemporaryWorkOrderResult {
workOrder: {
id: string
workOrderNo: string
workOrderStatus: string
remark?: string
}
sourceTaskId: string
sourceTaskNo: string
inputItems: Array<{
inputType: string
inputId?: string
inputCode?: string
inputName?: string
remark?: string
}>
}
export function fetchSpawnTemporaryWorkOrderFromTask(
taskId: string,
data: { remark?: string },
operateScope?: ProductionTaskOperateScope
) {
return request.post<SpawnTemporaryWorkOrderResult>({
url: `/web/admin/production-tasks/${taskId}/spawn-temporary-work-order`,
data,
params: scopeQuery(operateScope)
})
}
export function fetchSetTaskOutputs(
taskId: string,
data: any[] | Record<string, any>,
+8
View File
@@ -44,6 +44,8 @@ export type QcMaterialBatch = {
amount: number
inQty: number
remainingQty: number
outTotal?: number
outCount?: number
qcAttachmentUrls?: string
stockQty: number
warningQty: number
@@ -118,6 +120,12 @@ export function fetchQcMaterialBatchList(params?: {
})
}
export function fetchQcMaterialBatchDetail(batchId: string) {
return request.get<QcMaterialBatch>({
url: `/web/admin/qc-material-batches/${batchId}`
})
}
export function fetchQcMaterialBatchOptions(params?: {
keyword?: string
materialId?: string
@@ -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"}, {"id": "production_work_order_taskexecutiondialog_onsteplistdrop", "label": "onStepListDrop()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L769"}, {"id": "production_work_order_taskexecutiondialog_handleforwardsuccess", "label": "handleForwardSuccess()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L774"}, {"id": "production_work_order_taskexecutiondialog_openforwarddialog", "label": "openForwardDialog()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L780"}, {"id": "production_work_order_taskexecutiondialog_savetaskoutputsmanual", "label": "saveTaskOutputsManual()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L785"}, {"id": "production_work_order_taskexecutiondialog_savetaskattachmentsmanual", "label": "saveTaskAttachmentsManual()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L789"}, {"id": "production_work_order_taskexecutiondialog_savetaskequipmentmanual", "label": "saveTaskEquipmentManual()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L793"}, {"id": "production_work_order_taskexecutiondialog_handlespawntemporaryworkorderclick", "label": "handleSpawnTemporaryWorkOrderClick()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L797"}, {"id": "production_work_order_taskexecutiondialog_submitspawntemporary", "label": "submitSpawnTemporary()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L808"}, {"id": "production_work_order_taskexecutiondialog_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L847"}, {"id": "production_work_order_taskexecutiondialog_stepseqclass", "label": "stepSeqClass()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L866"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_onsteplistdrop", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L769", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_handleforwardsuccess", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L774", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_openforwarddialog", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L780", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_savetaskoutputsmanual", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L785", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_Line 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": "L67"}, {"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": "L77"}, {"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": "L81"}, {"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": "L84"}, {"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": "L111"}, {"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": "L118"}], "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_utils_production_step_assignee", "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_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": "L21", "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": "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_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": "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_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": "L32", "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": "L33", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_prodLine 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_fetchproductiontasksbyworkorderids", "label": "fetchProductionTasksByWorkOrderIds()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L33"}, {"id": "api_production_task_groupproductiontasksbyworkorderid", "label": "groupProductionTasksByWorkOrderId()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L54"}, {"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": "L67"}, {"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": "L90"}, {"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": "L102"}, {"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": "L112"}, {"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": "L130"}, {"id": "api_production_task_fetchproductiontaskeditorinit", "label": "fetchProductionTaskEditorInit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/production-task.ts", "source_location": "L154"}, {"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": "L165"}, {"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": "L169"}, {"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": "L181"}, {"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": "L185"}, {"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": "L197"}, {"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": "L210"}, {"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": "L221"}, {"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": "L234"}, {"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": "L247"}, {"id": "api_production_task_fetchreplacestepdatacollection", "label": "fetchReplLine 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"}, {"id": "production_work_order_taskexecutiondialog_onsteplistdrop", "label": "onStepListDrop()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L760"}, {"id": "production_work_order_taskexecutiondialog_handleforwardsuccess", "label": "handleForwardSuccess()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L765"}, {"id": "production_work_order_taskexecutiondialog_openforwarddialog", "label": "openForwardDialog()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L771"}, {"id": "production_work_order_taskexecutiondialog_savetaskoutputsmanual", "label": "saveTaskOutputsManual()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L776"}, {"id": "production_work_order_taskexecutiondialog_savetaskattachmentsmanual", "label": "saveTaskAttachmentsManual()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L780"}, {"id": "production_work_order_taskexecutiondialog_savetaskequipmentmanual", "label": "saveTaskEquipmentManual()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L784"}, {"id": "production_work_order_taskexecutiondialog_handlespawntemporaryworkorderclick", "label": "handleSpawnTemporaryWorkOrderClick()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L788"}, {"id": "production_work_order_taskexecutiondialog_submitspawntemporary", "label": "submitSpawnTemporary()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L799"}, {"id": "production_work_order_taskexecutiondialog_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L838"}, {"id": "production_work_order_taskexecutiondialog_stepseqclass", "label": "stepSeqClass()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L857"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_onsteplistdrop", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L760", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_handleforwardsuccess", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L765", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_openforwarddialog", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L771", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_work_order_taskexecutiondialog_savetaskoutputsmanual", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/TaskExecutionDialog.vue", "source_location": "L776", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_taskexecutiondialog_vue", "target": "production_Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1"}, {"id": "qc_material_index_ensuretabmounted", "label": "ensureTabMounted()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1263"}, {"id": "qc_material_index_handletabchange", "label": "handleTabChange()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1268"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1200", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1201", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_system_view_dialog_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1216", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_common_amount_input_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1217", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_money_format", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1218", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_utils_qc_material_ui", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1219", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_admin", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1220", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1221", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1234", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_usage", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/index.vue", "source_location": "L1235", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_constants_material_discard", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/qualityLine 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_if", "label": "if()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L442"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_production_production_work_order_dispatchtaskdialog_vue", "target": "production_work_order_dispatchtaskdialog_if", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L442", "weight": 1.0}], "raw_calls": [{"caller_nid": "production_work_order_dispatchtaskdialog_if", "callee": "enterEditPhase", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/production/production-work-order/DispatchTaskDialog.vue", "source_location": "L445"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_qcmaterialusagetab_vue", "label": "QcMaterialUsageTab.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L1"}, {"id": "qc_material_qcmaterialusagetab_ismanualoutrow", "label": "isManualOutRow()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L436"}, {"id": "qc_material_qcmaterialusagetab_isdiscardrow", "label": "isDiscardRow()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L442"}, {"id": "qc_material_qcmaterialusagetab_parsefromremark", "label": "parseFromRemark()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L446"}, {"id": "qc_material_qcmaterialusagetab_displayreceiver", "label": "displayReceiver()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L455"}, {"id": "qc_material_qcmaterialusagetab_displaypurpose", "label": "displayPurpose()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L461"}, {"id": "qc_material_qcmaterialusagetab_displayusetime", "label": "displayUseTime()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L467"}, {"id": "qc_material_qcmaterialusagetab_displayusageqty", "label": "displayUsageQty()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L473"}, {"id": "qc_material_qcmaterialusagetab_displaytaskusageqty", "label": "displayTaskUsageQty()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L479"}, {"id": "qc_material_qcmaterialusagetab_displayqctaskno", "label": "displayQcTaskNo()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L483"}, {"id": "qc_material_qcmaterialusagetab_displaystockbefore", "label": "displayStockBefore()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L488"}, {"id": "qc_material_qcmaterialusagetab_getchangetypelabel", "label": "getChangeTypeLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L495"}, {"id": "qc_material_qcmaterialusagetab_getchangetypetagtype", "label": "getChangeTypeTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L503"}, {"id": "qc_material_qcmaterialusagetab_getsourcetagtype", "label": "getSourceTagType()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L511"}, {"id": "qc_material_qcmaterialusagetab_getsourcelabel", "label": "getSourceLabel()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L521"}, {"id": "qc_material_qcmaterialusagetab_canmarkfullyused", "label": "canMarkFullyUsed()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L533"}, {"id": "qc_material_qcmaterialusagetab_handlemarkfullyused", "label": "handleMarkFullyUsed()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L537"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_quality_inspection_qc_material_qcmaterialusagetab_vue", "target": "qc_material_qcmaterialusagetab_ismanualoutrow", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/quality-inspection/qc-material/QcMaterialUsageTab.vue", "source_location": "L436", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admiLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_ts", "label": "qc-material.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L1"}, {"id": "api_qc_material_fetchqcmaterialbatchlist", "label": "fetchQcMaterialBatchList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L110"}, {"id": "api_qc_material_fetchqcmaterialbatchdetail", "label": "fetchQcMaterialBatchDetail()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L123"}, {"id": "api_qc_material_fetchqcmaterialbatchoptions", "label": "fetchQcMaterialBatchOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L129"}, {"id": "api_qc_material_fetchqcmateriallist", "label": "fetchQcMaterialList()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L140"}, {"id": "api_qc_material_fetchqcmaterialoptions", "label": "fetchQcMaterialOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L152"}, {"id": "api_qc_material_fetchcreateqcmaterial", "label": "fetchCreateQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L158"}, {"id": "api_qc_material_fetchupdateqcmaterial", "label": "fetchUpdateQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L165"}, {"id": "api_qc_material_fetchdeleteqcmaterial", "label": "fetchDeleteQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L172"}, {"id": "api_qc_material_fetchstockinqcmaterial", "label": "fetchStockInQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L178"}, {"id": "api_qc_material_fetchbatchstockinqcmaterial", "label": "fetchBatchStockInQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L185"}, {"id": "api_qc_material_fetchupdateqcmaterialbatch", "label": "fetchUpdateQcMaterialBatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L196"}, {"id": "api_qc_material_fetchdeleteqcmaterialbatch", "label": "fetchDeleteQcMaterialBatch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L203"}, {"id": "api_qc_material_fetchbatchstockoutqcmaterial", "label": "fetchBatchStockOutQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L209"}, {"id": "api_qc_material_fetchbatchdiscardqcmaterial", "label": "fetchBatchDiscardQcMaterial()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L222"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_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-material.ts", "source_location": "L1", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_ts", "target": "api_qc_material_fetchqcmaterialbatchlist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L110", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_ts", "target": "api_qc_material_fetchqcmaterialbatchdetail", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L123", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_ts", "target": "api_qc_material_fetchqcmaterialbatchoptions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L129", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_api_qc_material_ts", "target": "api_qc_material_fetchqcmateriallist", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/api/qc-material.ts", "source_location": "L140", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_webLine truncated
@@ -142,7 +142,7 @@
</el-table-column>
<el-table-column
prop="changeQty"
label="领用数量"
label="变动数量"
min-width="120"
align="center"
header-align="center"
@@ -158,7 +158,7 @@
</el-table-column>
<el-table-column
prop="changeQty"
label="领用数量"
label="变动数量"
min-width="120"
align="center"
header-align="center"
@@ -287,6 +287,7 @@
e: 'needStepDispatch',
payload: { taskId: string; taskName: string; presetSteps?: Record<string, any>[] }
): void
(e: 'taskCreated', payload: { taskId: string; taskName: string }): void
}>()
const dialogVisible = computed({
@@ -413,6 +414,7 @@
presetSteps: stepList.value
})
}
emit('taskCreated', { taskId, taskName: form.taskName })
pendingListRefresh.value = true
} catch {
/* global error handling */
@@ -431,16 +431,36 @@
@search-unit="(q: string) => editor.searchItemUnitOptions(q)"
/>
</div>
<div v-if="!readonly" class="execution-detail-step-footer">
<el-button
class="task-exec-toolbar-btn task-exec-save-btn"
:type="editor.isScopeDirty('output') ? 'primary' : 'danger'"
:loading="editor.outputSaving.value"
@click="saveTaskOutputsManual"
>
<el-icon><Check /></el-icon>
保存
</el-button>
<div v-if="showOutputStepFooter" class="execution-detail-step-footer">
<div class="execution-detail-actions">
<el-tooltip
:disabled="!spawnTemporaryDisabledReason"
:content="spawnTemporaryDisabledReason"
placement="top"
>
<span class="execution-detail-action-wrap">
<el-button
v-if="canShowSpawnTemporaryWorkOrder"
class="btn-ghost task-exec-toolbar-btn"
:disabled="!!spawnTemporaryDisabledReason"
@click="handleSpawnTemporaryWorkOrderClick"
>
<el-icon><Position /></el-icon>
派发临时工单
</el-button>
</span>
</el-tooltip>
<el-button
v-if="!readonly"
class="task-exec-toolbar-btn task-exec-save-btn"
:type="editor.isScopeDirty('output') ? 'primary' : 'danger'"
:loading="editor.outputSaving.value"
@click="saveTaskOutputsManual"
>
<el-icon><Check /></el-icon>
保存
</el-button>
</div>
</div>
</template>
@@ -539,6 +559,56 @@
:operate-scope="operateScope"
@success="handleForwardSuccess"
/>
<el-dialog
v-model="spawnTempVisible"
title="新增临时工单"
width="560px"
class="dialog-form-layout"
align-center
append-to-body
modal-class="protocol-dialog-mask"
destroy-on-close
:close-on-click-modal="false"
>
<el-form label-position="top" class="biz-dialog-form">
<p class="hint-muted spawn-temp-hint">
将复制当前任务已保存的原材料至新临时工单的生产任务。临时工单不关联样本与协议,创建后请派发任务。
</p>
<div class="form-grid-2">
<el-form-item label="备注" class="form-col-span-2">
<el-input
v-model="spawnTempForm.remark"
type="textarea"
:rows="3"
placeholder="选填"
maxlength="512"
/>
</el-form-item>
</div>
</el-form>
<template #footer>
<el-button class="btn-ghost" @click="spawnTempVisible = false">
<el-icon><Close /></el-icon>
取消
</el-button>
<el-button
class="btn-main"
type="primary"
:loading="spawnTempLoading"
@click="submitSpawnTemporary"
>
<el-icon><Check /></el-icon>
确认
</el-button>
</template>
</el-dialog>
<DispatchTaskDialog
v-model:visible="spawnDispatchVisible"
:work-order-row="spawnDispatchWorkOrderRow"
@task-created="handleSpawnTaskCreated"
/>
</div>
</template>
@@ -551,7 +621,9 @@
CopyDocument,
Delete,
Share,
Loading
Loading,
Position,
Close
} from '@element-plus/icons-vue'
import { VueDraggable as draggable } from 'vue-draggable-plus'
import { useTaskStepEditor } from './useTaskStepEditor'
@@ -563,7 +635,14 @@
import TaskEquipmentPanel from './TaskEquipmentPanel.vue'
import CompleteProductionTaskDialog from './CompleteProductionTaskDialog.vue'
import ForwardTaskDialog from './ForwardTaskDialog.vue'
import DispatchTaskDialog from './DispatchTaskDialog.vue'
import type { ProductionTaskOperateScope } from '@/api/production-task'
import {
fetchSetTaskInputs,
fetchSpawnTemporaryWorkOrderFromTask,
type SpawnTemporaryWorkOrderResult
} from '@/api/production-task'
import { ElMessage } from 'element-plus'
import {
productionConclusionLabel,
productionConclusionTagType,
@@ -614,7 +693,11 @@
completeConclusionInitial,
taskActionLoading,
submitCompleteWithConclusion,
taskDetail
taskDetail,
taskInputs,
validateTaskInputs,
isScopeDirty,
guardBeforeLeaveCurrentScope
} = editor
const executionTaskConclusion = computed(
@@ -647,6 +730,36 @@
const forwardVisible = ref(false)
const spawnTempVisible = ref(false)
const spawnTempLoading = ref(false)
const spawnTempForm = reactive({ remark: '' })
const spawnDispatchVisible = ref(false)
const spawnDispatchWorkOrderRow = ref<Record<string, any> | null>(null)
const pendingSpawnInputItems = ref<SpawnTemporaryWorkOrderResult['inputItems']>([])
const canShowSpawnTemporaryWorkOrder = computed(() => {
const status = taskDetail.value?.taskStatus
if (status !== 'dpz' && status !== 'jxz' && status !== 'ywc') return false
// 已完成任务常通过「查看」只读进入,仍允许派发临时工单
if (props.readonly && status !== 'ywc') return false
return true
})
const showOutputStepFooter = computed(
() => !props.readonly || canShowSpawnTemporaryWorkOrder.value
)
const spawnTemporaryDisabledReason = computed(() => {
if (!canShowSpawnTemporaryWorkOrder.value) return ''
if (!taskInputs.value.length) return '请先在原材料中填写至少一条记录'
const inputErr = validateTaskInputs()
if (inputErr) return inputErr
if (taskDetail.value?.taskStatus !== 'ywc' && isScopeDirty('input')) {
return '请先保存原材料后再派发'
}
return ''
})
const isMineScope = computed(() => props.operateScope === 'mine')
const stepDragHandle = computed(() =>
@@ -681,6 +794,55 @@
void editor.saveTaskEquipment()
}
async function handleSpawnTemporaryWorkOrderClick() {
const reason = spawnTemporaryDisabledReason.value
if (reason) {
ElMessage.warning(reason)
return
}
if (!(await guardBeforeLeaveCurrentScope())) return
spawnTempForm.remark = ''
spawnTempVisible.value = true
}
async function submitSpawnTemporary() {
if (!props.taskId) return
spawnTempLoading.value = true
try {
const res = await fetchSpawnTemporaryWorkOrderFromTask(
props.taskId,
{ remark: spawnTempForm.remark?.trim() || undefined },
props.operateScope
)
pendingSpawnInputItems.value = res.inputItems || []
spawnDispatchWorkOrderRow.value = {
id: res.workOrder.id,
workOrderNo: res.workOrder.workOrderNo,
workOrderType: 'temporary'
}
spawnTempVisible.value = false
spawnDispatchVisible.value = true
ElMessage.success(`已创建临时工单 ${res.workOrder.workOrderNo},请派发生产任务`)
} catch {
/* global error handling */
} finally {
spawnTempLoading.value = false
}
}
async function handleSpawnTaskCreated(payload: { taskId: string }) {
const items = pendingSpawnInputItems.value
const taskId = (payload.taskId || '').trim()
pendingSpawnInputItems.value = []
if (!items.length || !taskId) return
try {
await fetchSetTaskInputs(taskId, items, props.operateScope)
ElMessage.success('已复制原材料至新任务')
} catch {
ElMessage.warning('临时任务已创建,但复制原材料失败,请在新任务中手动添加')
}
}
async function handleBeforeClose(done: () => void) {
if (props.readonly) {
done()
@@ -1078,6 +1240,15 @@
border-top: 1px solid #e5e7eb;
background: #fff;
}
.execution-detail-action-wrap {
display: inline-flex;
}
.spawn-temp-hint {
margin: 0 0 12px;
font-size: 13px;
line-height: 1.5;
color: var(--mint-text-muted, #64748b);
}
.execution-detail-actions {
display: flex;
gap: 8px;
@@ -2633,6 +2633,7 @@ export function useTaskStepEditor() {
addTaskInputRow,
removeTaskInputRow,
saveTaskInputs,
validateTaskInputs,
addTaskOutputRow,
removeTaskOutputRow,
saveTaskOutputs,
@@ -38,6 +38,7 @@
<el-option label="出库" value="out" />
<el-option v-if="SHOW_QC_TASK_MATERIAL_USAGE" label="任务使用" value="use" />
<el-option label="废弃" value="discard" />
<el-option v-if="!mineOnly" label="库存调整" value="adjust" />
</el-select>
</el-form-item>
<el-form-item label="时间范围">
@@ -173,7 +174,7 @@
</el-table-column>
<el-table-column
prop="changeQty"
label="领用数量"
label="变动数量"
min-width="120"
align="center"
header-align="center"
@@ -493,6 +494,7 @@
function getChangeTypeLabel(row: QcMaterialUsage) {
if (row.changeType === 'in') return '入库'
if (row.changeType === 'adjust') return '库存调整'
if (isDiscardRow(row)) return '废弃'
if (isManualOutRow(row)) return '出库'
return '任务使用'
@@ -500,6 +502,7 @@
function getChangeTypeTagType(row: QcMaterialUsage) {
if (row.changeType === 'in') return 'success'
if (row.changeType === 'adjust') return 'warning'
if (isDiscardRow(row)) return 'danger'
if (isManualOutRow(row)) return 'warning'
return 'primary'
@@ -511,6 +514,7 @@
if (sourceType === 'manual_out') return 'warning'
if (sourceType === 'manual_discard') return 'danger'
if (sourceType === 'outbound_handover') return 'primary'
if (sourceType === 'batch_qty_edit') return 'warning'
return 'info'
}
@@ -520,6 +524,7 @@
if (sourceType === 'manual_out') return '手动出库'
if (sourceType === 'manual_discard') return '手动废弃'
if (sourceType === 'outbound_handover') return '出库交接'
if (sourceType === 'batch_qty_edit') return '批次数量修正'
return sourceType || '-'
}
@@ -332,8 +332,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="入库数量">
<el-input :model-value="String(formData.inQty ?? 0)" disabled />
<el-form-item label="入库数量" prop="inQty">
<DecimalInput
v-model="formData.inQty"
:min="0.01"
:precision="4"
style="width: 100%"
@change="onEditInQtyChange"
/>
</el-form-item>
<el-form-item v-if="showAmountColumns" label="单价(元)" prop="unitPrice">
<AmountInput
@@ -351,8 +357,51 @@
@change="formData.amountManual = true"
/>
</el-form-item>
<el-form-item label="剩余数量">
<el-input :model-value="String(formData.remainingQty ?? 0)" disabled />
<el-form-item label="剩余数量" prop="remainingQty">
<DecimalInput
v-model="formData.remainingQty"
:min="0"
:precision="4"
style="width: 100%"
@change="onEditRemainingQtyChange"
/>
</el-form-item>
<el-form-item>
<template #label>
已出库总量
<span class="form-label-tip">含出库、废弃及任务扣减</span>
</template>
<el-input :model-value="String(formData.outTotal ?? 0)" disabled />
</el-form-item>
<el-form-item label="理论剩余">
<el-input :model-value="String(editTheoreticalRemaining)" disabled />
</el-form-item>
<el-form-item v-if="editOutTotal > 0" class="form-col-span-3">
<el-alert
type="info"
:closable="false"
show-icon
:title="`该批次已出库/废弃共 ${editOutTotal}${formData.unit || ''}。修改入库数量后,若未手工改动剩余数量,将自动调整为 ${editTheoreticalRemaining}${formData.unit || ''}。`"
/>
</el-form-item>
<el-form-item v-if="editInQtyChanged" class="form-col-span-3">
<el-alert
type="info"
:closable="false"
show-icon
title="修改入库数量后,保存时将写入一条「编辑修正入库数量」的库存调整记录;原入库流水保持不变。"
/>
</el-form-item>
<el-form-item
v-if="editRemainingQtyChanged && editRemainingDiffersFromTheoretical"
class="form-col-span-3"
>
<el-alert
type="warning"
:closable="false"
show-icon
title="剩余数量与「入库数量 − 已出库」不一致,保存时将额外写入一条「编辑修正剩余数量」的库存调整记录。"
/>
</el-form-item>
<el-form-item label="备注" class="form-col-span-3">
<el-input v-model="formData.remark" type="textarea" :rows="2" placeholder="可选" />
@@ -1184,6 +1233,7 @@
fetchQcMaterialBatchList,
fetchQcMaterialOptions,
fetchQcMaterialBatchOptions,
fetchQcMaterialBatchDetail,
fetchCreateQcMaterial,
fetchUpdateQcMaterialBatch,
fetchDeleteQcMaterialBatch,
@@ -1336,6 +1386,7 @@
amountManual: false,
inQty: 0,
remainingQty: 0,
outTotal: 0,
materialCode: '',
materialName: '',
specModel: '',
@@ -1344,6 +1395,27 @@
status: '1',
remark: ''
})
const remainingQtyTouched = ref(false)
const editInitialInQty = ref(0)
const editInitialRemainingQty = ref(0)
const editOutTotal = computed(() => Number(formData.outTotal) || 0)
const editTheoreticalRemaining = computed(() => {
const inQty = Number(formData.inQty) || 0
return Math.max(0, Math.round((inQty - editOutTotal.value) * 10000) / 10000)
})
const editRemainingDiffersFromTheoretical = computed(() => {
const remaining = Number(formData.remainingQty) || 0
return Math.abs(remaining - editTheoreticalRemaining.value) > 0.0001
})
const editInQtyChanged = computed(() => {
const inQty = Number(formData.inQty) || 0
return Math.abs(inQty - editInitialInQty.value) > 0.0001
})
const editRemainingQtyChanged = computed(() => {
const remaining = Number(formData.remainingQty) || 0
return Math.abs(remaining - editInitialRemainingQty.value) > 0.0001
})
const formRules = computed(() => {
const rules: Record<string, unknown[]> = {
@@ -1354,7 +1426,9 @@
batchNo: [{ required: true, message: '请输入批号', trigger: 'blur' }],
manufacturer: [{ required: true, message: '请输入厂家', trigger: 'blur' }],
materialCode: [{ required: true, message: '请输入物料编码', trigger: 'blur' }],
materialName: [{ required: true, message: '请输入物料名称', trigger: 'blur' }]
materialName: [{ required: true, message: '请输入物料名称', trigger: 'blur' }],
inQty: [{ required: true, message: '请输入入库数量', trigger: 'change' }],
remainingQty: [{ required: true, message: '请输入剩余数量', trigger: 'change' }]
}
if (showAmountColumns.value) {
rules.unitPrice = [{ required: true, message: '请输入单价', trigger: 'change' }]
@@ -1736,13 +1810,23 @@
formData.amount = calcAmount(formData.unitPrice ?? 0, formData.inQty)
}
function onEditInQtyChange() {
if (!remainingQtyTouched.value) {
formData.remainingQty = editTheoreticalRemaining.value
}
onEditPriceQtyChange()
}
function onEditRemainingQtyChange() {
remainingQtyTouched.value = true
}
function handleOpenAttachment(row: QcMaterialBatch) {
attachmentBatch.value = row
attachmentDialogVisible.value = true
}
function handleEdit(row: QcMaterialBatch) {
editingBatchId.value = row.batchId || row.id
function fillEditFormFromBatch(row: QcMaterialBatch) {
formData.stockInNo = row.stockInNo || ''
formData.stockInDate = row.stockInDate || ''
formData.expireDate = row.expireDate || ''
@@ -1754,6 +1838,7 @@
formData.amountManual = false
formData.inQty = row.inQty ?? 0
formData.remainingQty = row.remainingQty ?? 0
formData.outTotal = row.outTotal ?? 0
formData.materialCode = row.materialCode || ''
formData.materialName = row.materialName || ''
formData.specModel = row.specModel || ''
@@ -1761,15 +1846,53 @@
formData.warningQty = row.warningQty ?? 0
formData.status = row.status || '1'
formData.remark = row.remark || ''
editInitialInQty.value = row.inQty ?? 0
editInitialRemainingQty.value = row.remainingQty ?? 0
remainingQtyTouched.value = false
}
async function handleEdit(row: QcMaterialBatch) {
editingBatchId.value = row.batchId || row.id
fillEditFormFromBatch(row)
ensureUnitOption(row.unit || '')
dialogVisible.value = true
void searchUnitOptions('')
formRef.value?.clearValidate?.()
const batchId = editingBatchId.value
if (!batchId) return
try {
const detail = await fetchQcMaterialBatchDetail(batchId)
fillEditFormFromBatch(detail)
ensureUnitOption(detail.unit || '')
} catch {
/* 列表行数据仍可编辑 */
}
}
async function handleSubmit() {
await formRef.value?.validate?.()
if (!editingBatchId.value) return
const inQty = Number(formData.inQty) || 0
const remainingQty = Number(formData.remainingQty) || 0
const outTotal = editOutTotal.value
if (inQty <= 0) {
ElMessage.warning('入库数量必须大于 0')
return
}
if (remainingQty < 0) {
ElMessage.warning('剩余数量不能为负数')
return
}
if (remainingQty > inQty) {
ElMessage.warning('剩余数量不能大于入库数量')
return
}
if (inQty < outTotal) {
ElMessage.warning(`入库数量不能小于已出库量 ${outTotal}`)
return
}
submitLoading.value = true
try {
const payload: Record<string, unknown> = {
@@ -1785,7 +1908,9 @@
unit: formData.unit?.trim() || undefined,
warningQty: formData.warningQty,
status: String(formData.status ?? '1'),
remark: formData.remark?.trim() || undefined
remark: formData.remark?.trim() || undefined,
inQty,
remainingQty
}
if (showAmountColumns.value) {
payload.unitPrice = Number(formData.unitPrice) || 0