package com.dy.pmsStation.workOrder; 
 | 
  
 | 
import com.alibaba.excel.util.StringUtils; 
 | 
import com.dy.pmsGlobal.daoBa.BaUserMapper; 
 | 
import com.dy.pmsGlobal.daoPlt.PltProductMapper; 
 | 
import com.dy.pmsGlobal.daoPlt.PltProductionLineMapper; 
 | 
import com.dy.pmsGlobal.daoPlt.PltStationMapper; 
 | 
import com.dy.pmsGlobal.daoPr.PrAssemblyPlanMapper; 
 | 
import com.dy.pmsGlobal.daoPr.PrProductionNodeMapper; 
 | 
import com.dy.pmsGlobal.daoSta.StaAssemblyWorkHistoryMapper; 
 | 
import com.dy.pmsGlobal.daoSta.StaAssemblyWorkLastMapper; 
 | 
import com.dy.pmsGlobal.pojoBa.BaUser; 
 | 
import com.dy.pmsGlobal.pojoPlt.PltProduct; 
 | 
import com.dy.pmsGlobal.pojoPlt.PltProductionLine; 
 | 
import com.dy.pmsGlobal.pojoPlt.PltStation; 
 | 
import com.dy.pmsGlobal.pojoPr.PrAssemblyPlan; 
 | 
import com.dy.pmsGlobal.pojoPr.PrProductionNode; 
 | 
import com.dy.pmsGlobal.pojoSta.StaAssemblyWorkHistory; 
 | 
import com.dy.pmsGlobal.pojoSta.StaAssemblyWorkLast; 
 | 
import com.dy.pmsGlobal.util.QrCodeConstant; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
@Slf4j 
 | 
@Service 
 | 
public class WorkOrderSv { 
 | 
    private static final int STATUS_NORMAL = 1; 
 | 
    private static final int STATUS_WORK_LAST_LOGOUT = 2; 
 | 
    private static final int STATUS_REPAIR = 3; 
 | 
    private static final int STATUS_WASTE = 4; 
 | 
  
 | 
    private static final String WORK_TYPE_ASSEMBLY = "1"; 
 | 
    private static final String WORK_TYPE_TEST = "2"; 
 | 
    private static final String WORK_TYPE_INSPECTION = "3"; 
 | 
    private static final String WORK_TYPE_REPAIR = "4"; 
 | 
  
 | 
    private static final String USER_PREFIX = "101"; 
 | 
    private static final String STATION_PREFIX = "103"; 
 | 
  
 | 
    private PrAssemblyPlanMapper assemblyDao; 
 | 
    private BaUserMapper baUserDao; 
 | 
    private PltStationMapper pltStationDao; 
 | 
    private StaAssemblyWorkLastMapper assemblyWorkLastDao; 
 | 
    private StaAssemblyWorkHistoryMapper assemblyWorkHistoryDao; 
 | 
    private PrProductionNodeMapper nodeDao; 
 | 
    private PltProductMapper productDao; 
 | 
    private PltProductionLineMapper lineDao; 
 | 
  
 | 
    @Autowired 
 | 
    public void setAssemblyDao(PrAssemblyPlanMapper assemblyDao) { 
 | 
        this.assemblyDao = assemblyDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    private void setBaUserDao(BaUserMapper baUserDao) { 
 | 
        this.baUserDao = baUserDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    private void setPltStationDao(PltStationMapper pltStationDao) { 
 | 
        this.pltStationDao = pltStationDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    private void setStaAssemblyWorkHistoryDao(StaAssemblyWorkHistoryMapper assemblyWorkHistoryDao) { 
 | 
        this.assemblyWorkHistoryDao = assemblyWorkHistoryDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    private void setStaAssemblyWorkLastDao(StaAssemblyWorkLastMapper assemblyWorkLastDao) { 
 | 
        this.assemblyWorkLastDao = assemblyWorkLastDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    public void setNodeDao(PrProductionNodeMapper nodeDao) { 
 | 
        this.nodeDao = nodeDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    public void setPltProductDao(PltProductMapper productDao) { 
 | 
        this.productDao = productDao; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    public void setLineDao(PltProductionLineMapper lineDao) { 
 | 
        this.lineDao = lineDao; 
 | 
    } 
 | 
  
 | 
    public BaUser getUserInfo(String id) { 
 | 
        Long userId = null; 
 | 
        if (StringUtils.isBlank(id)) { 
 | 
            throw new RuntimeException("员工编码不能为空"); 
 | 
        } 
 | 
        //用户101 
 | 
        if (id.startsWith(USER_PREFIX)) { 
 | 
            userId = Long.parseLong(id.toString().substring(3)); 
 | 
        } else { 
 | 
            userId = Long.parseLong(id.toString()); 
 | 
        } 
 | 
        BaUser userInfo = baUserDao.selectByPrimaryKey(userId); 
 | 
        if (userInfo == null) { 
 | 
            throw new RuntimeException("员工编码:" + userId + "不在系统中,请先维护员工信息"); 
 | 
        } else if (userInfo.getDisabled()) { 
 | 
            throw new RuntimeException("员工(" + userInfo.getName() + ")编码:" + userId + "在系统已禁用,请先启用员工"); 
 | 
        } 
 | 
        return userInfo; 
 | 
    } 
 | 
  
 | 
    public PltStation getStationInfo(String id) { 
 | 
        //仅检查工站信息以及工站占用情况 
 | 
        Long stationId = null; 
 | 
        if (StringUtils.isBlank(id)) { 
 | 
            throw new RuntimeException("工站编码不能为空"); 
 | 
        } 
 | 
        //工站103 
 | 
        if (id.startsWith(STATION_PREFIX)) { 
 | 
            stationId = Long.parseLong(id.toString().substring(3)); 
 | 
        } else { 
 | 
            stationId = Long.parseLong(id.toString()); 
 | 
        } 
 | 
        PltStation stationInfo = pltStationDao.selectByPrimaryKey(stationId); 
 | 
        if (stationInfo == null) { 
 | 
            throw new RuntimeException("工站编码:" + stationId + "不在系统中,请先维护工站信息"); 
 | 
        } else if (stationInfo.getDisabled()) { 
 | 
            throw new RuntimeException("工站(" + stationInfo.getName() + ")编码:" + stationId + "在系统已禁用,请先启用工站"); 
 | 
        } 
 | 
        //检查线体是否被禁用 
 | 
        PltProductionLine lineInfo = lineDao.selectByPrimaryKey(stationInfo.getLineId()); 
 | 
        if (lineInfo == null ) { 
 | 
            throw new RuntimeException("工站(" + stationInfo.getName() + ")编码:" + stationId + "所在线体编码:" + lineInfo.getId() + "在系统不存在,请先找管理人员检查"); 
 | 
        }else if(lineInfo.getDisabled()){ 
 | 
            throw new RuntimeException("工站(" + stationInfo.getName() + ")编码:" + stationId + "所在线体编码:" + lineInfo.getName() + "在系统已禁用,请先启用线体"); 
 | 
        } 
 | 
        return stationInfo; 
 | 
    } 
 | 
  
 | 
    public StaAssemblyWorkLast checkUserAndStationUsed(QueryVo vo) { 
 | 
        StaAssemblyWorkLast result = new StaAssemblyWorkLast(); 
 | 
        PltStation stationInfo = null; 
 | 
        BaUser userInfo = null; 
 | 
        if (StringUtils.isBlank(vo.getStationId()) || StringUtils.isBlank(vo.getUserId())) { 
 | 
            throw new RuntimeException("工站编码或员工编码均不能为空,请检查"); 
 | 
        } 
 | 
        //工站103 
 | 
        if (vo.getStationId().startsWith(USER_PREFIX)) { 
 | 
            userInfo = getUserInfo(vo.getStationId()); 
 | 
        } else { 
 | 
            stationInfo = getStationInfo(vo.getStationId()); 
 | 
        } 
 | 
        if (vo.getUserId().startsWith(STATION_PREFIX)) { 
 | 
            stationInfo = getStationInfo(vo.getUserId()); 
 | 
        } else { 
 | 
            userInfo = getUserInfo(vo.getUserId()); 
 | 
        } 
 | 
        if (userInfo == null && stationInfo == null) { 
 | 
            throw new RuntimeException("员工编码:" + vo.getUserId() + "和工站编码:" + vo.getStationId() + "不正确,请检查"); 
 | 
        } else if (userInfo == null) { 
 | 
            throw new RuntimeException("员工编码:" + vo.getUserId() + "不正确,请检查"); 
 | 
        } else if (stationInfo == null) { 
 | 
            throw new RuntimeException("工站编码:" + vo.getStationId() + "不正确,请检查"); 
 | 
        } 
 | 
        //检查表中stationId是否已经存在 
 | 
        StaAssemblyWorkLast param = new StaAssemblyWorkLast(); 
 | 
        param.setStationId(stationInfo.getId()); 
 | 
        param.setStatus(STATUS_NORMAL); 
 | 
        List<StaAssemblyWorkLast> workLasts = assemblyWorkLastDao.selectList(param); 
 | 
        //long userId = userInfo.getId(); 
 | 
        if (workLasts.size() > 0) { 
 | 
            StaAssemblyWorkLast paramQuery = new StaAssemblyWorkLast(); 
 | 
            paramQuery.setUserId(userInfo.getId()); 
 | 
            paramQuery.setStationId(stationInfo.getId()); 
 | 
            paramQuery.setPlanId(vo.getPlanId()); 
 | 
            paramQuery.setProcessId(vo.getProcessId()); 
 | 
            paramQuery.setNodeId(vo.getNodeId()); 
 | 
            paramQuery.setWorkType(vo.getWorkType()); 
 | 
            StaAssemblyWorkLast userStation =  assemblyWorkLastDao.existsEntity(paramQuery); 
 | 
            //List<StaAssemblyWorkLast> userStationList = workLasts.stream().filter(item -> userId == item.getUserId()).collect(Collectors.toList()); 
 | 
            if (userStation == null) { 
 | 
                //删除工站登录信息 
 | 
                for (int i = 0; i < workLasts.size(); i++) { 
 | 
                    logout(workLasts.get(i).getId().toString()); 
 | 
                } 
 | 
                //throw new RuntimeException("员工(" +userInfo.getName() + ")编码:" + workLasts.get(0).getUserId() + "已经绑定该工站(" + stationInfo.getName() + ")编码:" + workLasts.get(0).getStationId() + ".请先让其解绑"); 
 | 
            } else { 
 | 
                BeanUtils.copyProperties(userStation, result); 
 | 
            } 
 | 
        } 
 | 
        if (result.getId() == null) { 
 | 
            result.setUserId(userInfo.getId()); 
 | 
            result.setUserName(userInfo.getName()); 
 | 
            result.setStationId(stationInfo.getId()); 
 | 
            result.setStationName(stationInfo.getName()); 
 | 
            result.setLineId(stationInfo.getLineId()); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    public StaAssemblyWorkLast getWorkLast(String workId) { 
 | 
        if (StringUtils.isBlank(workId)) { 
 | 
            throw new RuntimeException("登录ID为空,请联系管理员查看并解决问题."); 
 | 
        } 
 | 
        StaAssemblyWorkLast result = assemblyWorkLastDao.selectByPrimaryKey(Long.parseLong(workId)); 
 | 
        if (result == null) { 
 | 
            throw new RuntimeException("系统中没有该条登录信息"); 
 | 
            //return null; 
 | 
        } 
 | 
        BaUser userInfo = getUserInfo(result.getUserId().toString()); 
 | 
        PltStation stationInfo = getStationInfo(result.getStationId().toString()); 
 | 
        //如果是无任务计划 如维修work_type 没有 planId processId nodeId 
 | 
        if (result.getPlanId() != null) { 
 | 
            //校验planId processId nodeId 
 | 
            PrAssemblyPlan assyPlan = assemblyDao.selectByPrimaryKey(result.getPlanId()); 
 | 
            boolean hasNodeId = assyPlan.getProcess().getNodes().stream() 
 | 
                    .anyMatch(node -> node.id.equals(result.getNodeId())); 
 | 
            if (userInfo == null || stationInfo == null || assyPlan == null || (!hasNodeId)) { 
 | 
                //直接删除记录 
 | 
                logout(result.getId().toString()); 
 | 
                result.setId(null); 
 | 
                result.setStatus(STATUS_WORK_LAST_LOGOUT); 
 | 
                if (userInfo == null) { 
 | 
                    result.setUserId(null); 
 | 
                    result.setUserName(""); 
 | 
                } 
 | 
                if (stationInfo == null) { 
 | 
                    result.setStationId(null); 
 | 
                    result.setStationName(""); 
 | 
                } 
 | 
                if (assyPlan == null) { 
 | 
                    result.setPlanId(null); 
 | 
                    result.setPlanName(""); 
 | 
                } 
 | 
                if (!hasNodeId) { 
 | 
                    result.setNodeId(null); 
 | 
                    result.setNodeName(""); 
 | 
                } 
 | 
                return result; 
 | 
            } else { 
 | 
                result.setPlanName(assyPlan.getName()); 
 | 
                result.setProcessName(assyPlan.getProcessName()); 
 | 
                result.setNodeName(assyPlan.getProcess().getNodes().get(0).getContent()); 
 | 
                //找到对应的产品信息 
 | 
                PltProduct product = productDao.selectByPrimaryKey(assyPlan.getProId()); 
 | 
                if (product != null) { 
 | 
                    result.setProId(product.getId()); 
 | 
                    result.setProName(product.getName()); 
 | 
                    String devicePrefix = QrCodeConstant.TypeProduct + product.getCode() + assyPlan.getBatchNo(); 
 | 
                    result.setDevicePrefix(devicePrefix); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        result.setStationId(stationInfo.getId()); 
 | 
        result.setStationName(stationInfo.getName()); 
 | 
        result.setLineId(stationInfo.getLineId()); 
 | 
        result.setLineName(stationInfo.getLineName()); 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    public StaAssemblyWorkLast checkStationUsed(String stationId) { 
 | 
        StaAssemblyWorkLast result = new StaAssemblyWorkLast(); 
 | 
        PltStation stationInfo = null; 
 | 
        if (StringUtils.isBlank(stationId)) { 
 | 
            throw new RuntimeException("工站编码不能为空,请检查"); 
 | 
        } 
 | 
        stationInfo = getStationInfo(stationId); 
 | 
        //检查表中stationId是否已经存在 
 | 
        StaAssemblyWorkLast param = new StaAssemblyWorkLast(); 
 | 
        param.setStationId(stationInfo.getId()); 
 | 
        param.setStatus(STATUS_NORMAL); 
 | 
        List<StaAssemblyWorkLast> workLasts = assemblyWorkLastDao.selectList(param); 
 | 
        if (workLasts.size() > 0) { 
 | 
            result = getWorkLast(workLasts.get(0).getId().toString()); 
 | 
        } 
 | 
        result.setStationId(stationInfo.getId()); 
 | 
        result.setStationName(stationInfo.getName()); 
 | 
        result.setLineId(stationInfo.getLineId()); 
 | 
        result.setLineName(stationInfo.getLineName()); 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    public StaAssemblyWorkLast save(QueryVo vo) { 
 | 
        //先check 
 | 
        StaAssemblyWorkLast checkResult = checkUserAndStationUsed(vo); 
 | 
        //校验planId processId nodeId 
 | 
        PrAssemblyPlan assyPlan = null; 
 | 
        if (vo.getPlanId() != null) { 
 | 
            assyPlan = assemblyDao.selectByPrimaryKey(vo.getPlanId()); 
 | 
            if (assyPlan == null) { 
 | 
                throw new RuntimeException("组装任务已经在系统中删除请检查,刷新并重新选择任务"); 
 | 
            } 
 | 
            boolean hasNodeId = assyPlan.getProcess().getNodes().stream() 
 | 
                    .anyMatch(node -> node.id.equals(vo.getNodeId())); 
 | 
            if (!hasNodeId) { 
 | 
                throw new RuntimeException("节点信息有误或被其他人员修改,请重新选择节点信息"); 
 | 
            } 
 | 
        } 
 | 
        StaAssemblyWorkLast result = new StaAssemblyWorkLast(); 
 | 
        //查询到当前的信息 如果登录信息一模一样,不会更新 
 | 
        if (checkResult.getId() != null) { 
 | 
            BeanUtils.copyProperties(checkResult, result);//checkResult拷贝到result 
 | 
        }else{ 
 | 
            //逐个封装保存 
 | 
            BeanUtils.copyProperties(vo, result);//vo拷贝到result 
 | 
            result.setUserId(checkResult.getUserId()); 
 | 
            result.setStationId(checkResult.getStationId()); 
 | 
            result.setLineId(checkResult.getLineId()); 
 | 
            result.setStatus(STATUS_NORMAL); 
 | 
            result.setStartTime(new Date()); 
 | 
            if (vo.getPlanId() != null) { 
 | 
                result.setPlanId(assyPlan.getId()); 
 | 
                result.setProcessId(assyPlan.getProcess().getId()); 
 | 
                result.setNodeId(vo.getNodeId()); 
 | 
            } 
 | 
            int count =  assemblyWorkLastDao.insertSelective(result); 
 | 
            if (count <= 0) { 
 | 
                throw new RuntimeException("数据库存储失败"); 
 | 
            } 
 | 
        } 
 | 
        if (assyPlan != null) { 
 | 
            List<PrProductionNode> nodeInfo = assyPlan.getProcess().getNodes().stream() 
 | 
                    .filter(node -> node.id.equals(vo.getNodeId())).collect(Collectors.toList()); 
 | 
            result.setPlanName(assyPlan.getName()); 
 | 
            result.setProcessName(assyPlan.getProcessName()); 
 | 
            result.setNodeName(assyPlan.getProcess().getNodes().get(0).getContent()); 
 | 
            //找到对应的产品信息 
 | 
            PltProduct product = productDao.selectByPrimaryKey(assyPlan.getProId()); 
 | 
            if (product == null) { 
 | 
                throw new RuntimeException("产品信息有误或被其他人员修改,请登录管理系统查看任务关联产品ID为:" + assyPlan.getProId()); 
 | 
            } 
 | 
            result.setProId(product.getId()); 
 | 
            result.setProName(product.getName()); 
 | 
            String devicePrefix = QrCodeConstant.TypeProduct + product.getCode() + assyPlan.getBatchNo(); 
 | 
            result.setDevicePrefix(devicePrefix); 
 | 
        } 
 | 
        return result; 
 | 
    } 
 | 
  
 | 
    @Transactional 
 | 
    public int logout(String id) { 
 | 
        //找到登录记录 
 | 
        StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(Long.parseLong(id)); 
 | 
        if (workLast == null) { 
 | 
            throw new RuntimeException("系统中没有该条登录信息"); 
 | 
        } 
 | 
        //更新登录记录 
 | 
        workLast.setStatus(STATUS_WORK_LAST_LOGOUT); 
 | 
        workLast.setEndTime(new Date()); 
 | 
        // 保存history 
 | 
        StaAssemblyWorkHistory history = new StaAssemblyWorkHistory(); 
 | 
        BeanUtils.copyProperties(workLast, history); 
 | 
        history.setWorkId(workLast.getId()); 
 | 
        //history.setId(null); 
 | 
        int count = assemblyWorkHistoryDao.insertSelective(history); 
 | 
        //删除last 
 | 
        assemblyWorkLastDao.deleteByPrimaryKey(Long.parseLong(id)); 
 | 
        return count; 
 | 
    } 
 | 
  
 | 
    public List<PrAssemblyPlan> selectAssyPlanList(PrAssemblyPlan params) { 
 | 
        List<PrAssemblyPlan> planList = assemblyDao.selectAssyPlanSimplify(params); 
 | 
        /* planList.stream().forEach(process -> { 
 | 
            process.getProcess().getNodes().forEach(node -> { 
 | 
                if(node.instruction != null){ 
 | 
                    addUrl(node.instruction); 
 | 
                } 
 | 
            }); 
 | 
        });*/ 
 | 
        return planList; 
 | 
    } 
 | 
  
 | 
    public int addAssistant(String workId, String assistant) { 
 | 
        //找到workId 
 | 
        StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(Long.parseLong(workId)); 
 | 
        if (workLast == null) { 
 | 
            throw new RuntimeException("系统中没有当前登录信息,请检查或重新登录"); 
 | 
        } 
 | 
        BaUser userInfo = getUserInfo(assistant); 
 | 
        //当前登录人不能是辅助人员 
 | 
        if (workLast.getUserId() == userInfo.getId()) { 
 | 
            throw new RuntimeException(userInfo.getName() + "是当前登录人员,不必添加为辅助人员."); 
 | 
        } 
 | 
        String userId = userInfo.getId().toString(); 
 | 
        if (StringUtils.isBlank(workLast.getAssistants())) { 
 | 
            workLast.setAssistants(userId); 
 | 
        } else { 
 | 
            //已经添加的辅助人员 不必重复添加 
 | 
            String assistants = workLast.getAssistants(); 
 | 
            String[] assistantArr = assistants.split(","); 
 | 
            for (String item : assistantArr) { 
 | 
                if (userId.equals(item)) { 
 | 
                    throw new RuntimeException(userInfo.getName() + "已经添加为辅助人员,不必重复添加."); 
 | 
                } 
 | 
            } 
 | 
            workLast.setAssistants(assistants + "," + userId); 
 | 
        } 
 | 
        int count = assemblyWorkLastDao.updateByPrimaryKey(workLast); 
 | 
        return count; 
 | 
    } 
 | 
  
 | 
    public int removeAssistant(String workId, String assistant) { 
 | 
        //找到workId 
 | 
        StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(Long.parseLong(workId)); 
 | 
        if (workLast == null) { 
 | 
            throw new RuntimeException("系统中没有当前登录信息,请检查或重新登录"); 
 | 
        } 
 | 
        if ((!StringUtils.isBlank(assistant)) && assistant.startsWith(USER_PREFIX)) { 
 | 
            assistant = assistant.substring(3); 
 | 
        } 
 | 
        if (!StringUtils.isBlank(workLast.getAssistants())) { 
 | 
            StringBuilder sb = new StringBuilder(); 
 | 
            String[] assistantArr = workLast.getAssistants().split(","); 
 | 
            for (String item : assistantArr) { 
 | 
                if ((!StringUtils.isBlank(assistant)) && (!assistant.equals(item))) { 
 | 
                    sb.append(item).append(","); 
 | 
                } 
 | 
            } 
 | 
            String assistantStr = sb.length() > 0 ? sb.deleteCharAt(sb.length() - 1).toString() : ""; 
 | 
            workLast.setAssistants(assistantStr); 
 | 
        } 
 | 
        int count = assemblyWorkLastDao.updateByPrimaryKey(workLast); 
 | 
        return count; 
 | 
    } 
 | 
  
 | 
    public List<BaUser> getAssistantList(String workId) { 
 | 
        //找到workId 
 | 
        StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(Long.parseLong(workId)); 
 | 
        if (workLast == null) { 
 | 
            throw new RuntimeException("系统中没有当前登录信息,请检查或重新登录"); 
 | 
        } 
 | 
        List<BaUser> assistantList = baUserDao.selectByAssistants(workLast.getAssistants()); 
 | 
        return assistantList; 
 | 
    } 
 | 
} 
 |