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.MesProMpsPreparationCheckRespVO; 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); /** * 提交审核 * * 草稿状态 → 审核中,并启动 BPM 流程,审批在协同办公完成 * * @param id MPS 编号 */ void submitMps(Long id); /** * 处理 BPM 审批结果(协同办公审批完成后回调) * * 审核中 → 已审核(通过)/ 草稿(驳回) * * @param id MPS 编号 * @param bpmResult BPM 审批结果 * @param reason 审批意见(驳回原因) * @param auditUserId 审核人编号 */ void handleBpmProcessResult(Long id, Integer bpmResult, String reason, Long auditUserId); /** * 获得计划的辅料需求明细(含库存、在途、是否充足) * * @param id MPS 编号 * @return 物料需求列表 */ List getMpsItemList(Long id); /** * 生产准备检查:基于生产计划检查物料、设备是否齐备 * * @param id MPS 编号 * @return 检查结果 */ MesProMpsPreparationCheckRespVO getPreparationCheck(Long id); /** * 根据计划的辅料缺口生成采购申请单(草稿) * * @param id MPS 编号 * @return 生成的采购申请单编号 */ Long generatePurchaseRequest(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); }