﻿import type { PageParam, PageResult } from '@vben/request';

import { requestClient } from '#/api/request';

export namespace MesWmBatchApi {
  /** MES 批次 */
  export interface Batch {
    id?: number; // 批次 ID
    code?: string; // 批次编码
    itemId?: number; // 物料 ID
    itemCode?: string; // 物料编码
    itemName?: string; // 物料名称
    itemSpecification?: string; // 规格型号
    unitName?: string; // 单位名称
    produceDate?: Date; // 生产日期
    expireDate?: Date; // 有效期
    receiptDate?: Date; // 入库日期
    vendorId?: number; // 供应商 ID
    vendorCode?: string; // 供应商编码
    vendorName?: string; // 供应商名称
    clientId?: number; // 客户 ID
    clientCode?: string; // 客户编码
    clientName?: string; // 客户名称
    purchaseOrderCode?: string; // 采购订单编号
    salesOrderCode?: string; // 销售订单编号
    workOrderId?: number; // 生产订单 ID
    workOrderCode?: string; // 生产订单编号
    taskId?: number; // 生产任务 ID
    taskCode?: string; // 生产任务编号
    workstationId?: number; // 工作站 ID
    workstationCode?: string; // 工作站编码
    toolId?: number; // 工具 ID
    toolCode?: string; // 工具编号
    moldId?: number; // 模具 ID
    lotNumber?: string; // 生产批号
    qualityStatus?: number; // 质量状态
    remark?: string; // 备注
  }

  /** MES 批次分页查询参数 */
  export interface PageParams extends PageParam {
    code?: string; // 批次号
    itemId?: number; // 物料编号
    vendorId?: number; // 供应商编号
    clientId?: number; // 客户编号
    workOrderId?: number; // 订单编号
    taskId?: number; // 生产任务编号
    workstationId?: number; // 工作站编号
    toolId?: number; // 工具编号
    moldId?: number; // 模具编号
    salesOrderCode?: string; // 销售订单号
    purchaseOrderCode?: string; // 采购订单号
    lotNumber?: string; // 批号
    qualityStatus?: number; // 质量状态
    produceDate?: string[]; // 生产日期
    expireDate?: string[]; // 过期日期
    receiptDate?: string[]; // 入库日期
  }

  /** MES 批次采购来源（采购入库单 + IQC） */
  export interface PurchaseSource {
    receiptCode?: string; // 采购入库单号
    receiptDate?: Date; // 入库日期
    purchaseOrderCode?: string; // 采购订单编号
    vendorId?: number; // 供应商 ID
    vendorCode?: string; // 供应商编码
    vendorName?: string; // 供应商名称
    iqcCode?: string; // IQC 检验单号
    checkResult?: number; // IQC 检验结论（字典 mes_qc_check_result）
    itemId?: number; // 物料 ID
    itemCode?: string; // 物料编码
    itemName?: string; // 物料名称
    batchCode?: string; // 批次号
    receivedQuantity?: number; // 入库数量
  }

  /** MES 批次销售去向（销售出库单 + OQC） */
  export interface SalesTarget {
    salesCode?: string; // 销售出库单号
    salesDate?: Date; // 出库日期
    salesOrderCode?: string; // 销售订单编号
    clientId?: number; // 客户 ID
    clientCode?: string; // 客户编码
    clientName?: string; // 客户名称
    oqcCode?: string; // OQC 检验单号
    checkResult?: number; // OQC 检验结论（字典 mes_qc_check_result）
    itemId?: number; // 物料 ID
    itemCode?: string; // 物料编码
    itemName?: string; // 物料名称
    batchCode?: string; // 批次号
    quantity?: number; // 出库数量
    qualityStatus?: number; // 质量状态（字典 mes_wm_quality_status）
  }

  /** MES 批次工序流转（产出/投入事件） */
  export interface ProcessTrace {
    eventType?: 'OUT' | 'IN'; // 事件类型：OUT-产出 / IN-投入
    workOrderId?: number; // 生产工单 ID
    workOrderCode?: string; // 生产工单编号
    processId?: number; // 工序 ID
    processCode?: string; // 工序编码
    processName?: string; // 工序名称
    batchCode?: string; // 批次号
    quantity?: number; // 数量
    qualityStatus?: number; // 质量状态（字典 mes_wm_quality_status），仅产出侧有值
    eventTime?: Date; // 事件时间
    processSort?: number; // 工序序号
  }
}

/** 查询批次详情 */
export function getBatch(id: number) {
  return requestClient.get<MesWmBatchApi.Batch>(`/mes/wm/batch/get?id=${id}`);
}

/** 查询批次分页 */
export function getBatchPage(params: MesWmBatchApi.PageParams) {
  return requestClient.get<PageResult<MesWmBatchApi.Batch>>(
    '/mes/wm/batch/page',
    { params },
  );
}

/** 批次向前追溯 */
export function getForwardBatchList(code: string) {
  return requestClient.get<MesWmBatchApi.Batch[]>(
    '/mes/wm/batch/forward-list',
    {
      params: { code },
    },
  );
}

/** 批次向后追溯 */
export function getBackwardBatchList(code: string) {
  return requestClient.get<MesWmBatchApi.Batch[]>(
    '/mes/wm/batch/backward-list',
    { params: { code } },
  );
}

/** 批次采购来源（采购入库单 + IQC） */
export function getPurchaseSourceList(code: string) {
  return requestClient.get<MesWmBatchApi.PurchaseSource[]>(
    '/mes/wm/batch/purchase-sources',
    { params: { code } },
  );
}

/** 批次销售去向（销售出库单 + OQC） */
export function getSalesTargetList(code: string) {
  return requestClient.get<MesWmBatchApi.SalesTarget[]>(
    '/mes/wm/batch/sales-targets',
    { params: { code } },
  );
}

/** 批次工序流转（产出/投入事件） */
export function getProcessTraceList(code: string) {
  return requestClient.get<MesWmBatchApi.ProcessTrace[]>(
    '/mes/wm/batch/process-trace',
    { params: { code } },
  );
}

/** 根据 SN 码反查批次 */
export function getBatchBySn(sn: string) {
  return requestClient.get<MesWmBatchApi.Batch | null>('/mes/wm/batch/get-by-sn', {
    params: { sn },
  });
}
