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.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.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 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 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; @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; } 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 + "在系统已禁用,请先启用工站"); } return stationInfo; } public StaAssemblyWorkLast checkStationUsed(String id) { StaAssemblyWorkLast result = new StaAssemblyWorkLast(); PltStation stationInfo = null; if (StringUtils.isBlank(id)) { throw new RuntimeException("工站编码不能为空,请检查"); } stationInfo = getStationInfo(id); //检查表中stationId是否已经存在 StaAssemblyWorkLast param = new StaAssemblyWorkLast(); param.setStationId(stationInfo.getId()); param.setStatus(STATUS_NORMAL); List workLasts = assemblyWorkLastDao.selectList(param); if (workLasts.size() > 0) { BeanUtils.copyProperties(workLasts.get(0), result); //校验planId processId nodeId /*PrAssemblyPlan assyPlan = assemblyDao.selectByPrimaryKey(workLasts.get(0).getPlanId()); if (assyPlan == null) { throw new RuntimeException("组装任务已经在系统中删除请检查,请先到登出界面解除工站占用 ,再重新扫描"); } boolean hasNodeId = assyPlan.getProcess().getNodes().stream() .anyMatch(node -> node.id.equals(workLasts.get(0).getNodeId())); if (!hasNodeId) { throw new RuntimeException("节点信息有误或被其他人员修改,,请先到登出界面解除工站占用 ,再重新扫描"); } result.setPlan(assyPlan);*/ } else { result.setStationId(stationInfo.getId()); result.setStationName(stationInfo.getName()); result.setLineId(stationInfo.getLineId()); result.setLineName(stationInfo.getLineName()); } return result; } 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 workLasts = assemblyWorkLastDao.selectList(param); long userId = userInfo.getId(); if (workLasts.size() > 0) { List userStationList = workLasts.stream().filter(item -> userId == item.getUserId()).collect(Collectors.toList()); if (userStationList.size() == 0) { throw new RuntimeException("员工(" + workLasts.get(0).getUserName() + ")编码:" + workLasts.get(0).getUserId() + "已经绑定该工站(" + workLasts.get(0).getStationName() + ")编码:" + workLasts.get(0).getStationId() + ".请先让其解绑"); } else { BeanUtils.copyProperties(userStationList.get(0), result); } } else { result.setUserId(userInfo.getId()); result.setUserName(userInfo.getName()); result.setStationId(stationInfo.getId()); result.setStationName(stationInfo.getName()); result.setLineId(stationInfo.getLineId()); } return result; } @Transactional public StaAssemblyWorkLast save(QueryVo vo) { //先check StaAssemblyWorkLast checkResult = checkUserAndStationUsed(vo); //校验planId processId nodeId PrAssemblyPlan 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("节点信息有误或被其他人员修改,请重新选择节点信息"); } //怎么将只包含这个节点的信息全部回传呢 vo.setLineId(checkResult.getLineId()); StaAssemblyWorkLast staLast = new StaAssemblyWorkLast(); BeanUtils.copyProperties(vo, staLast); staLast.setUserId(checkResult.getUserId()); staLast.setStationId(checkResult.getStationId()); int count = 0; if (checkResult.getId() == null) { BeanUtils.copyProperties(vo, staLast); staLast.setUserId(checkResult.getUserId()); staLast.setStationId(checkResult.getStationId()); staLast.setStatus(STATUS_NORMAL); staLast.setStartTime(new Date()); count = assemblyWorkLastDao.insertSelective(staLast); } else { //保存一条history? BeanUtils.copyProperties(checkResult, staLast); staLast.setPlanId(assyPlan.getId()); staLast.setProcessId(assyPlan.getProcess().getId()); staLast.setNodeId(vo.getNodeId()); staLast.setStatus(STATUS_NORMAL); staLast.setStartTime(new Date()); count = assemblyWorkLastDao.updateByPrimaryKeySelective(staLast); } if (count <= 0) { throw new RuntimeException("数据库存储失败"); } StaAssemblyWorkLast result = assemblyWorkLastDao.selectByPrimaryKey(staLast.getId()); List nodeInfo = assyPlan.getProcess().getNodes().stream() .filter(node -> node.id.equals(vo.getNodeId())).collect(Collectors.toList()); assyPlan.getProcess().setNodes(nodeInfo); result.setPlan(assyPlan); 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.setId(null); int count = assemblyWorkHistoryDao.insertSelective(history); //删除last assemblyWorkLastDao.deleteByPrimaryKey(Long.parseLong(id)); return count; } public List selectAssyPlanList(PrAssemblyPlan params) { List planList = assemblyDao.selectAssyPlanSimplify(params); /* planList.stream().forEach(process -> { process.getProcess().getNodes().forEach(node -> { if(node.instruction != null){ addUrl(node.instruction); } }); });*/ return planList; } //workId assistants 传的是单个的userId 必传参数 public List updateAssistant(QueryVo vo) { //找到workId StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(vo.getWorkId()); if (workLast == null) { throw new RuntimeException("系统中没有该条登录信息,请检查或重新登录"); } //如果assistants 有101 则删掉 StringBuilder sb = new StringBuilder(); String[] assistantArr = vo.getAssistants().split(","); for (String item : assistantArr) { if (item.startsWith(USER_PREFIX)) { sb.append(item.substring(3)).append(","); } else { sb.append(item).append(","); } } String assistantStr = assistantArr.length > 0 ? sb.deleteCharAt(sb.length() - 1).toString() : ""; List userInfo = baUserDao.selectByAssistants(vo.getAssistants()); return userInfo; } 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 getAssistantList(String workId) { //找到workId StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(Long.parseLong(workId)); if (workLast == null) { throw new RuntimeException("系统中没有当前登录信息,请检查或重新登录"); } List assistantList = baUserDao.selectByAssistants(workLast.getAssistants()); return assistantList; } }