diff --git a/web-admin/src/api/production-task-set.ts b/web-admin/src/api/production-task-set.ts new file mode 100644 index 00000000..0def4ecb --- /dev/null +++ b/web-admin/src/api/production-task-set.ts @@ -0,0 +1,95 @@ +import request from '@/utils/http' + +type PageList = { + list: T[] + total: number + page: number + pageSize: number + totalPages: number +} + +export type ProductionTaskSetItem = { + id?: string + taskName: string + routeId?: string + routeName?: string + description?: string + remark?: string + orderNum?: number +} + +export type ProductionTaskSet = { + id: string + setName: string + status: string + itemCount?: number + items?: ProductionTaskSetItem[] + remark?: string + createTime?: string + skippedEmptyNameCount?: number +} + +export type ProductionTaskSetPayload = { + setName: string + status?: string + remark?: string + items: Array<{ + taskName: string + routeId?: string + description?: string + remark?: string + }> +} + +export function fetchProductionTaskSetList(params?: { + page?: number + pageSize?: number + keyword?: string + status?: string +}) { + return request.get>({ + url: '/web/admin/production-task-sets', + params + }) +} + +export function fetchProductionTaskSetsActive() { + return request.get<{ list: ProductionTaskSet[] }>({ + url: '/web/admin/production-task-sets/active' + }) +} + +export function fetchProductionTaskSetDetail(id: string) { + return request.get({ + url: `/web/admin/production-task-sets/${id}` + }) +} + +export function fetchCreateProductionTaskSet(data: ProductionTaskSetPayload) { + return request.post({ + url: '/web/admin/production-task-sets', + params: data + }) +} + +export function fetchUpdateProductionTaskSet(id: string, data: Partial) { + return request.put({ + url: `/web/admin/production-task-sets/${id}`, + params: data + }) +} + +export function fetchDeleteProductionTaskSet(id: string) { + return request.del({ url: `/web/admin/production-task-sets/${id}` }) +} + +export function fetchCreateProductionTaskSetFromWorkOrder(data: { + workOrderId: string + setName: string + remark?: string +}) { + return request.post({ + url: '/web/admin/production-task-sets/from-work-order', + params: data + }) +} diff --git a/web-admin/src/api/production-task.ts b/web-admin/src/api/production-task.ts index a25d702f..0492d9f0 100644 --- a/web-admin/src/api/production-task.ts +++ b/web-admin/src/api/production-task.ts @@ -10,6 +10,13 @@ export function fetchCreateProductionTask(data: Record) { return request.post({ url: '/web/admin/production-tasks', params: data }) } +export function fetchCreateProductionTasksFromSet(data: { workOrderId: string; setId: string }) { + return request.post<{ createdCount: number; list: any[] }>({ + url: '/web/admin/production-tasks/from-set', + params: data + }) +} + export function fetchProductionTaskList(params?: { page?: number pageSize?: number diff --git a/web-admin/src/utils/production-task-set.test.ts b/web-admin/src/utils/production-task-set.test.ts new file mode 100644 index 00000000..f0bc50b2 --- /dev/null +++ b/web-admin/src/utils/production-task-set.test.ts @@ -0,0 +1,30 @@ +import { describe, it } from 'node:test' +import assert from 'node:assert/strict' +import { mapWorkOrderTasksToSetItems } from './production-task-set' + +describe('mapWorkOrderTasksToSetItems', () => { + it('skips empty names and keeps route/description/remark', () => { + const { items, skippedEmptyNameCount } = mapWorkOrderTasksToSetItems([ + { taskName: '分离', routeId: 'r1', routeName: '路线A', description: 'd', remark: 'm' }, + { taskName: ' ', routeId: 'r2' }, + { taskName: '培养' } + ]) + assert.equal(skippedEmptyNameCount, 1) + assert.deepEqual(items, [ + { + taskName: '分离', + routeId: 'r1', + routeName: '路线A', + description: 'd', + remark: 'm' + }, + { + taskName: '培养', + routeId: '', + routeName: '', + description: '', + remark: '' + } + ]) + }) +}) diff --git a/web-admin/src/utils/production-task-set.ts b/web-admin/src/utils/production-task-set.ts new file mode 100644 index 00000000..54b76ca3 --- /dev/null +++ b/web-admin/src/utils/production-task-set.ts @@ -0,0 +1,30 @@ +export type ProductionTaskSetItemPreview = { + taskName: string + routeId: string + routeName: string + description: string + remark: string +} + +export function mapWorkOrderTasksToSetItems(tasks: Record[] | undefined): { + items: ProductionTaskSetItemPreview[] + skippedEmptyNameCount: number +} { + const items: ProductionTaskSetItemPreview[] = [] + let skippedEmptyNameCount = 0 + for (const row of tasks || []) { + const taskName = String(row.taskName || '').trim() + if (!taskName) { + skippedEmptyNameCount += 1 + continue + } + items.push({ + taskName, + routeId: String(row.routeId || '').trim(), + routeName: String(row.routeName || '').trim(), + description: String(row.description || '').trim(), + remark: String(row.remark || '').trim() + }) + } + return { items, skippedEmptyNameCount } +}