gaoluyang
7 天以前 7bd10d34e8a8dc2437ec8551eb511e37634d7306
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;
@@ -13,6 +15,7 @@
import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService;
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.common.bpm.MesBpmProcessService;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderProgressRespVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
@@ -46,6 +49,11 @@
@Service
@Validated
public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
    @Resource
    private MesBpmProcessService mesBpmProcessService;
    private static final String BPM_PROCESS_DEFINITION_CATEGORY_CODE = "mes_pro_feedback_audit";
    @Resource
    private MesProWorkOrderMapper workOrderMapper;
@@ -150,6 +158,13 @@
    }
    @Override
    public List<Map<String, Object>> getWorkOrderApproveProcessDefinitionList() {
        return mesBpmProcessService.getApproveProcessDefinitionList(BPM_PROCESS_DEFINITION_CATEGORY_CODE);
    }
    @Override
    public MesProWorkOrderDO getWorkOrder(Long id) {
        return workOrderMapper.selectById(id);
    }
@@ -161,9 +176,12 @@
    @Override
    public PageResult<MesProWorkOrderDO> getWorkOrderPage(MesProWorkOrderPageReqVO pageReqVO) {
        // 获取用户有权限的客户 ID 列表
        List<Long> permittedClientIds = customerApi.getPermittedCustomerIds();
        return workOrderMapper.selectPage(pageReqVO, permittedClientIds);
        return workOrderMapper.selectPage(pageReqVO, (List<Long>) null);
    }
    @Override
    public PageResult<MesProWorkOrderDO> getWorkOrderSchedulePage(MesProWorkOrderPageReqVO pageReqVO) {
        return workOrderMapper.selectSchedulePage(pageReqVO, (List<Long>) null);
    }
    @Override
@@ -198,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. 校验存在 + 只有已确认状态才能完成