package cn.iocoder.yudao.module.mes.service.pro.mps; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.mps.vo.MesProMpsSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.mps.MesProMpsDO; import jakarta.validation.Valid; import java.math.BigDecimal; import java.util.Collection; import java.util.List; /** * MES 生产主计划(MPS)Service 接口 * * @author 芋道源码 */ public interface MesProMpsService { /** * 创建 MPS(供 API 调用,自动映射物料) * * @param saleOrderId 销售订单ID * @param saleOrderNo 销售订单号 * @param saleOrderItemId 销售订单明细ID * @param mdmItemId MDM 物料ID * @param productName 产品名称(用于错误提示) * @param quantity 计划数量 * @param clientId 客户ID * @param requestDate 需求日期 * @param remark 备注 * @return MPS 编号,如果 MES 产品不存在返回 null * @throws cn.iocoder.yudao.framework.common.exception.ServiceException 如果 MES 产品不存在 */ Long createMps(Long saleOrderId, String saleOrderNo, Long saleOrderItemId, Long mdmItemId, String productName, BigDecimal quantity, Long clientId, String requestDate, String remark); /** * 创建 MPS * * @param createReqVO 创建信息 * @return MPS 编号 */ Long createMps(@Valid MesProMpsSaveReqVO createReqVO); /** * 更新 MPS * * @param updateReqVO 更新信息 */ void updateMps(@Valid MesProMpsSaveReqVO updateReqVO); /** * 删除 MPS(仅草稿状态) * * @param id 编号 */ void deleteMps(Long id); /** * 下发单条 MPS * * @param id MPS 编号 * @return 生成的工单 ID */ Long issueMps(Long id); /** * 合并下发多条 MPS * 将多条相同产品的 MPS 合并生成一条生产工单 * * @param mpsIds MPS 编号列表 * @return 生成的工单 ID */ Long mergeAndIssueMps(List mpsIds); /** * 取消 MPS * * @param id 编号 */ void cancelMps(Long id); /** * 完成 MPS(由生产工单完成时触发) * * @param id 编号 */ void finishMps(Long id); /** * 根据销售订单明细获取 MPS * * @param saleOrderItemId 销售订单明细ID * @return MPS */ MesProMpsDO getMpsBySaleOrderItemId(Long saleOrderItemId); /** * 获取 MPS * * @param id 编号 * @return MPS */ MesProMpsDO getMps(Long id); /** * 获取 MPS 分页 * * @param pageReqVO 分页查询 * @return 分页结果 */ PageResult getMpsPage(MesProMpsPageReqVO pageReqVO); /** * 获取 MPS 列表 * * @param ids 编号列表 * @return MPS 列表 */ List getMpsList(Collection ids); /** * 根据销售订单明细ID列表获取 MPS 列表 * * @param saleOrderItemIds 销售订单明细ID列表 * @return MPS 列表 */ List getMpsListBySaleOrderItemIds(Collection saleOrderItemIds); /** * 获取可合并的 MPS 列表(相同产品、草稿状态) * * @param productId 产品ID * @return MPS 列表 */ List getMergeableMpsList(Long productId); /** * 更新已生产数量 * * @param id MPS 编号 * @param incrQuantity 增量 */ void updateProducedQuantity(Long id, BigDecimal incrQuantity); /** * 检查销售订单的所有 MPS 是否已完成生产 * * 完成条件: * 1. 已生产数量 >= 计划数量 * 2. 所有报工单状态为 FINISHED(确保质检完成) * * @param saleOrderId 销售订单ID * @return true=全部完成,false=未全部完成 */ Boolean checkSaleOrderProductionFinished(Long saleOrderId); /** * 根据工单ID获取 MPS * * @param workOrderId 工单ID * @return MPS */ MesProMpsDO getMpsByWorkOrderId(Long workOrderId); /** * 检查并自动完成 MPS * * 如果 MPS 满足完成条件(已生产数量 >= 计划数量 且 所有报工已完成), * 则自动将 MPS 状态更新为已完成 * * @param mpsId MPS 编号 * @return true=已完成或本次自动完成,false=未完成 */ Boolean checkAndFinishMps(Long mpsId); }