gaoluyang
7 天以前 8e4eee5ad4d74e1a4e6ab4de3a9c28000700dce0
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java
@@ -2,8 +2,10 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO;
@@ -214,6 +216,39 @@
    }
    @Override
    public void startWorkOrder(Long id) {
        // 1. 校验存在 + 只有已确认状态才能开工
        MesProWorkOrderDO workOrder = validateWorkOrderExists(id);
        if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.CONFIRMED.getStatus())) {
            throw exception(PRO_WORK_ORDER_NOT_CONFIRMED);
        }
        // 2. 已开工的不允许重复启动,避免开工时间被覆盖
        if (workOrder.getActualStartTime() != null) {
            throw exception(PRO_WORK_ORDER_ALREADY_STARTED);
        }
        // 3. 写入开工时间与开工人,工单由此进入「生产中」
        workOrderMapper.updateById(new MesProWorkOrderDO().setId(id)
                .setActualStartTime(LocalDateTime.now())
                .setStartUserId(SecurityFrameworkUtils.getLoginUserId()));
    }
    @Override
    public void updateWorkOrderBatch(Long id, String batchCode) {
        // 1. 校验存在
        MesProWorkOrderDO workOrder = validateWorkOrderExists(id);
        // 2. 已完成/已取消的工单不允许再改批次
        if (MesProWorkOrderStatusEnum.FINISHED.getStatus().equals(workOrder.getStatus())
                || MesProWorkOrderStatusEnum.CANCELED.getStatus().equals(workOrder.getStatus())) {
            throw new ServiceException(PRO_WORK_ORDER_BATCH_NOT_EDITABLE.getCode(),
                    String.format("工单[%s]当前状态为[%s],只有未完工的工单可以管理批次。请确认工单状态后重试。",
                            workOrder.getCode(),
                            MesProWorkOrderStatusEnum.FINISHED.getStatus().equals(workOrder.getStatus()) ? "已完成" : "已取消"));
        }
        // 3. 更新批次号
        workOrderMapper.updateById(new MesProWorkOrderDO().setId(id).setBatchCode(batchCode));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void finishWorkOrder(Long id) {
        // 1. 校验存在 + 只有已确认状态才能完成