- Integrated a combobox for selecting employees, allowing users to assign tasks more efficiently. - Implemented fetching of employee data to populate the selection options, improving user experience. - Added functionality to filter tasks based on the current user's related tasks, enhancing task management capabilities. - Updated the modal states for better handling of designer assignments and task interactions. These changes aim to streamline the design task management process, facilitating better organization and assignment of tasks within the application.
277 lines
7.5 KiB
TypeScript
277 lines
7.5 KiB
TypeScript
/**
|
|
* 공정정보관리 API 클라이언트
|
|
*/
|
|
|
|
import { apiClient } from "./client";
|
|
|
|
// ═══ Types ═══
|
|
|
|
export interface ProcessMaster {
|
|
id: string;
|
|
company_code: string;
|
|
process_code: string;
|
|
process_name: string;
|
|
process_type: string;
|
|
standard_time: string;
|
|
worker_count: string;
|
|
use_yn: string;
|
|
}
|
|
|
|
export interface ProcessEquipment {
|
|
id: string;
|
|
process_code: string;
|
|
equipment_code: string;
|
|
equipment_name?: string;
|
|
}
|
|
|
|
export interface Equipment {
|
|
id: string;
|
|
equipment_code: string;
|
|
equipment_name: string;
|
|
}
|
|
|
|
export interface ItemForRouting {
|
|
id: string;
|
|
item_number: string;
|
|
item_name: string;
|
|
size: string;
|
|
unit: string;
|
|
type: string;
|
|
}
|
|
|
|
export interface RoutingVersion {
|
|
id: string;
|
|
item_code: string;
|
|
version_name: string;
|
|
description: string;
|
|
is_default: boolean;
|
|
}
|
|
|
|
export interface RoutingDetail {
|
|
id: string;
|
|
routing_version_id: string;
|
|
seq_no: string;
|
|
process_code: string;
|
|
process_name?: string;
|
|
is_required: string;
|
|
is_fixed_order: string;
|
|
work_type: string;
|
|
standard_time: string;
|
|
outsource_supplier: string;
|
|
}
|
|
|
|
interface ApiResponse<T> {
|
|
success: boolean;
|
|
data?: T;
|
|
message?: string;
|
|
}
|
|
|
|
const BASE = "/process-info";
|
|
|
|
// ═══ 공정 마스터 ═══
|
|
|
|
export async function getProcessList(params?: {
|
|
processCode?: string;
|
|
processName?: string;
|
|
processType?: string;
|
|
useYn?: string;
|
|
}): Promise<ApiResponse<ProcessMaster[]>> {
|
|
try {
|
|
const qp = new URLSearchParams();
|
|
if (params?.processCode) qp.append("processCode", params.processCode);
|
|
if (params?.processName) qp.append("processName", params.processName);
|
|
if (params?.processType) qp.append("processType", params.processType);
|
|
if (params?.useYn) qp.append("useYn", params.useYn);
|
|
const qs = qp.toString();
|
|
const res = await apiClient.get(`${BASE}/processes${qs ? `?${qs}` : ""}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function createProcess(data: Partial<ProcessMaster>): Promise<ApiResponse<ProcessMaster>> {
|
|
try {
|
|
const res = await apiClient.post(`${BASE}/processes`, data);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.response?.data?.message || e.message };
|
|
}
|
|
}
|
|
|
|
export async function updateProcess(id: string, data: Partial<ProcessMaster>): Promise<ApiResponse<ProcessMaster>> {
|
|
try {
|
|
const res = await apiClient.put(`${BASE}/processes/${id}`, data);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.response?.data?.message || e.message };
|
|
}
|
|
}
|
|
|
|
export async function deleteProcesses(ids: string[]): Promise<ApiResponse<{ deletedCount: number }>> {
|
|
try {
|
|
const res = await apiClient.post(`${BASE}/processes/delete`, { ids });
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
// ═══ 공정별 설비 ═══
|
|
|
|
export async function getProcessEquipments(processCode: string): Promise<ApiResponse<ProcessEquipment[]>> {
|
|
try {
|
|
const res = await apiClient.get(`${BASE}/processes/${processCode}/equipments`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function addProcessEquipment(data: { process_code: string; equipment_code: string }): Promise<ApiResponse<ProcessEquipment>> {
|
|
try {
|
|
const res = await apiClient.post(`${BASE}/process-equipments`, data);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.response?.data?.message || e.message };
|
|
}
|
|
}
|
|
|
|
export async function removeProcessEquipment(id: string): Promise<ApiResponse<void>> {
|
|
try {
|
|
const res = await apiClient.delete(`${BASE}/process-equipments/${id}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function getEquipmentList(): Promise<ApiResponse<Equipment[]>> {
|
|
try {
|
|
const res = await apiClient.get(`${BASE}/equipments`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
// ═══ 등록 품목 관리 (item_routing_registered) ═══
|
|
|
|
export const ROUTING_SCREEN_CODE = "screen_1599";
|
|
|
|
export interface RegisteredItem {
|
|
registered_id: string;
|
|
sort_order: string;
|
|
id: string;
|
|
item_name: string;
|
|
item_code: string;
|
|
routing_count: string;
|
|
}
|
|
|
|
const PWS_BASE = "/process-work-standard";
|
|
|
|
export async function getRegisteredItems(search?: string): Promise<ApiResponse<RegisteredItem[]>> {
|
|
try {
|
|
const qs = new URLSearchParams({
|
|
tableName: "item_info",
|
|
nameColumn: "item_name",
|
|
codeColumn: "item_number",
|
|
routingTable: "item_routing_version",
|
|
routingFkColumn: "item_code",
|
|
});
|
|
if (search) qs.set("search", search);
|
|
const res = await apiClient.get(`${PWS_BASE}/registered-items/${ROUTING_SCREEN_CODE}?${qs.toString()}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function registerItemsBatch(
|
|
items: Array<{ itemId: string; itemCode: string }>
|
|
): Promise<ApiResponse<any[]>> {
|
|
try {
|
|
const res = await apiClient.post(`${PWS_BASE}/registered-items/batch`, {
|
|
screenCode: ROUTING_SCREEN_CODE,
|
|
items,
|
|
});
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.response?.data?.message || e.message };
|
|
}
|
|
}
|
|
|
|
export async function unregisterItem(registeredId: string): Promise<ApiResponse<void>> {
|
|
try {
|
|
const res = await apiClient.delete(`${PWS_BASE}/registered-items/${registeredId}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
// ═══ 품목별 라우팅 ═══
|
|
|
|
export async function searchAllItems(search?: string): Promise<ApiResponse<ItemForRouting[]>> {
|
|
try {
|
|
const qs = search ? `?search=${encodeURIComponent(search)}` : "";
|
|
const res = await apiClient.get(`${BASE}/items/search-all${qs}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function getRoutingVersions(itemCode: string): Promise<ApiResponse<RoutingVersion[]>> {
|
|
try {
|
|
const res = await apiClient.get(`${BASE}/routing-versions/${itemCode}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function createRoutingVersion(data: {
|
|
item_code: string;
|
|
version_name: string;
|
|
description?: string;
|
|
is_default?: boolean;
|
|
}): Promise<ApiResponse<RoutingVersion>> {
|
|
try {
|
|
const res = await apiClient.post(`${BASE}/routing-versions`, data);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function deleteRoutingVersion(id: string): Promise<ApiResponse<void>> {
|
|
try {
|
|
const res = await apiClient.delete(`${BASE}/routing-versions/${id}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function getRoutingDetails(versionId: string): Promise<ApiResponse<RoutingDetail[]>> {
|
|
try {
|
|
const res = await apiClient.get(`${BASE}/routing-details/${versionId}`);
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|
|
|
|
export async function saveRoutingDetails(
|
|
versionId: string,
|
|
details: Partial<RoutingDetail>[]
|
|
): Promise<ApiResponse<void>> {
|
|
try {
|
|
const res = await apiClient.put(`${BASE}/routing-details/${versionId}`, { details });
|
|
return res.data;
|
|
} catch (e: any) {
|
|
return { success: false, message: e.message };
|
|
}
|
|
}
|