|
@@ -1,401 +1,401 @@
|
|
-package com.github.zuihou.job;
|
|
|
|
-
|
|
|
|
-import com.alibaba.fastjson.JSONObject;
|
|
|
|
-import com.github.zuihou.authority.service.common.ParameterService;
|
|
|
|
-import com.github.zuihou.base.R;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.dao.OrderMapper;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.dao.PlanMapper;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.dao.TTaskMapper;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.dao.TaskNodeMapper;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.entity.Order;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.entity.TTask;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.entity.TaskNode;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.service.TaskNodeService;
|
|
|
|
-import com.github.zuihou.business.operationManagementCenter.service.TaskService;
|
|
|
|
-import com.github.zuihou.business.productionReadyCenter.dao.AutoNodeLogMapper;
|
|
|
|
-import com.github.zuihou.business.productionReadyCenter.dao.AutoNodeMapper;
|
|
|
|
-import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureProgramGroupMapper;
|
|
|
|
-import com.github.zuihou.business.productionReadyCenter.entity.AAutoNodeLog;
|
|
|
|
-import com.github.zuihou.business.productionReadyCenter.entity.BomProcedureProgramGroup;
|
|
|
|
-import com.github.zuihou.business.productionReadyCenter.service.AutoNodeService;
|
|
|
|
-import com.github.zuihou.business.websocket.WebSocketServer;
|
|
|
|
-import com.github.zuihou.common.constant.CacheKey;
|
|
|
|
-import com.github.zuihou.common.constant.ParameterKey;
|
|
|
|
-import com.github.zuihou.context.BaseContextHandler;
|
|
|
|
-import com.github.zuihou.database.mybatis.conditions.Wraps;
|
|
|
|
-import org.slf4j.Logger;
|
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
-import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
-import org.springframework.stereotype.Component;
|
|
|
|
-import org.springframework.web.client.RestTemplate;
|
|
|
|
-
|
|
|
|
-import java.text.NumberFormat;
|
|
|
|
-import java.util.Date;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-
|
|
|
|
-@Component
|
|
|
|
-public class TaskJobs1 {
|
|
|
|
- @Autowired
|
|
|
|
- private TaskService taskService;
|
|
|
|
- @Autowired
|
|
|
|
- private AutoNodeService autoNodeService;
|
|
|
|
- @Autowired
|
|
|
|
- private OrderMapper orderMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private PlanMapper planMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private AutoNodeMapper autoNodeMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private TTaskMapper taskMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private AutoNodeLogMapper autoNodeLogMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private BomProcedureProgramGroupMapper bomProcedureProgramGroupMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private ParameterService parameterService;
|
|
|
|
- @Autowired
|
|
|
|
- private RestTemplate restTemplate;
|
|
|
|
- @Autowired
|
|
|
|
- private RedisTemplate<String,Object> redisTemplate;
|
|
|
|
- @Autowired
|
|
|
|
- private TaskNodeService taskNodeService;
|
|
|
|
-
|
|
|
|
- @Autowired
|
|
|
|
- private TaskNodeMapper taskNodeMapper;
|
|
|
|
- @Autowired
|
|
|
|
- private WebSocketServer webSocketServer;
|
|
|
|
- private static Logger logger = LoggerFactory.getLogger(TaskJobs1.class);
|
|
|
|
- //@Scheduled(cron="*/9 * * * * ?") //9秒执行一次
|
|
|
|
- public void updateTaskStatusJob1(){
|
|
|
|
- BaseContextHandler.setTenant("0000");
|
|
|
|
-
|
|
|
|
- String temUrl = parameterService.getValue(ParameterKey.AUTOPROGRAMEURL, null);
|
|
|
|
- //String autoProgrameUrl = parameterService.getValue(ParameterKey.AUTOPROGRAMEURL, null);
|
|
|
|
- //查出待执行的任务
|
|
|
|
- //List<TTask> taskList = taskService.list(Wraps.<TTask>lbQ().eq(TTask::getStatus,"1").eq(TTask::getDraftFlag,"0").le(TTask::getExpectStartTime,new Date()));
|
|
|
|
- Map qMap = new HashMap();
|
|
|
|
- qMap.put("mulstatus","1");
|
|
|
|
- List<TTask> taskList = taskMapper.getPrepareTask(qMap);
|
|
|
|
-
|
|
|
|
- //计划,订单MAP,用做提升性能,本次更新过的就不更新了
|
|
|
|
- Map<String,String>planMap = new HashMap<String,String>();
|
|
|
|
- Map<String,String>OrderMap = new HashMap<String,String>();
|
|
|
|
- if(taskList!=null&&taskList.size()>0){
|
|
|
|
- for(TTask task:taskList){
|
|
|
|
- try{
|
|
|
|
- //把本次待执行任务全部改成进行中
|
|
|
|
- //taskMapper.updateTaskBegin();
|
|
|
|
- task.setStatus("2");
|
|
|
|
- task.setStartTime(new Date());
|
|
|
|
- taskMapper.updateById(task);
|
|
|
|
- if(!planMap.containsKey(String.valueOf(task.getPlanId()))){
|
|
|
|
- //设置计划开始
|
|
|
|
- planMapper.updateproduceStatusBegin();
|
|
|
|
- planMap.put(String.valueOf(task.getPlanId()),String.valueOf(task.getPlanId()));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(!OrderMap.containsKey(String.valueOf(task.getOrderId()))){
|
|
|
|
- ////设置订单开始
|
|
|
|
- orderMapper.updateproduceStatusBegin();
|
|
|
|
- OrderMap.put(String.valueOf(task.getOrderId()),String.valueOf(task.getOrderId()));
|
|
|
|
- }
|
|
|
|
- redisTemplate.opsForValue().set(CacheKey.PRESOURCE_CURRENT_TASK+"_"+task.getResourceId(), task.getId());
|
|
|
|
- redisTemplate.opsForValue().set(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT+"_"+task.getResourceId(), task);
|
|
|
|
- boolean f = false;
|
|
|
|
- //执行任务对应的自动化程序
|
|
|
|
- /*AutoNode model = new AutoNode();
|
|
|
|
- model.setProcedureId(task.getProcedureId());
|
|
|
|
- List<AutoNode> autoNodeList = autoNodeMapper.getNodeList(model);*/
|
|
|
|
- Map map = new HashMap();
|
|
|
|
- map.put("taskId",task.getId());
|
|
|
|
- List<TaskNode>taskNodeList = taskNodeService.getTaskNodeList(map);
|
|
|
|
-
|
|
|
|
- if(taskNodeList!=null&&taskNodeList.size()>0){
|
|
|
|
- Map queryMap = new HashMap<>();
|
|
|
|
- queryMap.put("procedureId",task.getProcedureId());
|
|
|
|
- queryMap.put("haveFile","1");
|
|
|
|
- List<BomProcedureProgramGroup>bomProcedureProgramGroupList = bomProcedureProgramGroupMapper.getProgramGroupList(queryMap);
|
|
|
|
- for(int i = 0;i<taskNodeList.size();i++){
|
|
|
|
- String autoProgrameUrl = temUrl;
|
|
|
|
- TaskNode taskNode = taskNodeList.get(i);
|
|
|
|
- //把当前节点存放缓存
|
|
|
|
- redisTemplate.opsForValue().set(CacheKey.TASK_CURRENT_NODE+"_"+task.getResourceId(), taskNode.getAutoNodeId());
|
|
|
|
- String code = taskNode.getAutoNodeCode();
|
|
|
|
- autoProgrameUrl+="?func="+code;
|
|
|
|
- autoProgrameUrl+="&ip="+task.getIp()+"&port="+task.getPort();
|
|
|
|
- String fileName = "";
|
|
|
|
- if(bomProcedureProgramGroupList!=null&&bomProcedureProgramGroupList.size()>0){
|
|
|
|
- fileName = bomProcedureProgramGroupList.get(0).getSubmittedFileName();
|
|
|
|
- autoProgrameUrl+="&fileName="+fileName;
|
|
|
|
- }
|
|
|
|
- List<AAutoNodeLog> autoNodeLogList = autoNodeLogMapper.selectList(Wraps.<AAutoNodeLog>lbQ().eq(AAutoNodeLog::getAutoNodeId,taskNode.getAutoNodeId()).eq(AAutoNodeLog::getTaskId,task.getId()));
|
|
|
|
- //插入执行日志
|
|
|
|
- AAutoNodeLog log = new AAutoNodeLog();
|
|
|
|
- if(autoNodeLogList==null||autoNodeLogList.size()==0){
|
|
|
|
- log.setAutoNodeId(taskNode.getAutoNodeId());
|
|
|
|
- log.setOrderId(task.getOrderId());
|
|
|
|
- log.setTaskId(task.getId());
|
|
|
|
- log.setExeStatus("2");
|
|
|
|
- log.setStartTime(new Date());
|
|
|
|
- log.setFeedbackFile(fileName);
|
|
|
|
- autoNodeLogMapper.insert(log);
|
|
|
|
- }else{
|
|
|
|
- log = autoNodeLogList.get(0);
|
|
|
|
- log.setFeedbackFile(fileName);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //更新节点任务
|
|
|
|
- taskNode.setExeStatus("2");
|
|
|
|
- taskNode.setStartTime(new Date());
|
|
|
|
- taskNodeMapper.updateAllById(taskNode);
|
|
|
|
-
|
|
|
|
- //推送
|
|
|
|
- this.pushTask(task);
|
|
|
|
-
|
|
|
|
- logger.info("===============================请求地址"+autoProgrameUrl);
|
|
|
|
- String returnData = "";
|
|
|
|
- try {
|
|
|
|
- if(!"0".equals(taskNode.getNodeType())){//人工上下料或质检
|
|
|
|
- //不用调接口,直接返回成功
|
|
|
|
- returnData = "success";
|
|
|
|
- }else{
|
|
|
|
- returnData = restTemplate.getForObject(autoProgrameUrl, String.class);
|
|
|
|
- }
|
|
|
|
- }catch(Exception e){
|
|
|
|
- e.printStackTrace();
|
|
|
|
- logger.error("调用接口发生异常"+e.getMessage());
|
|
|
|
- }
|
|
|
|
- logger.info("===============================接口返回"+returnData);
|
|
|
|
- //if("success".equals(returnData)){
|
|
|
|
- //TODO
|
|
|
|
- if(1==1){
|
|
|
|
- //判断值是否需要循环自检
|
|
|
|
- if(!"0".equals(taskNode.getNodeType())){//人工上下料或质检
|
|
|
|
- redisTemplate.opsForValue().set(CacheKey.TASK_CURRENT_NODE_STATUS+"_"+taskNode.getId(), "0");
|
|
|
|
- String b = checkLoading(taskNode);
|
|
|
|
- }else{//调用机器
|
|
|
|
- if("1".equals(taskNode.getSelfExamine())){//需要自检的,需要停顿一会,避免取数不及时
|
|
|
|
- Thread.sleep(1500L);
|
|
|
|
- String b = polling(task,taskNode,fileName);
|
|
|
|
- if("0".equals(b)){//需要跳出
|
|
|
|
- //插入执行日志
|
|
|
|
- log.setExeResult("0");
|
|
|
|
- autoNodeLogMapper.updateAllById(log);
|
|
|
|
- f = true;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //处理出库入库
|
|
|
|
- R<String> r = taskNodeService.taskNodeStock(taskNode, task);
|
|
|
|
- //插入执行日志
|
|
|
|
- log.setExeStatus("3");
|
|
|
|
- if(r.getIsSuccess()){
|
|
|
|
- log.setExeResult("1");
|
|
|
|
- log.setEndTime(new Date());
|
|
|
|
- autoNodeLogMapper.updateAllById(log);
|
|
|
|
- }else{
|
|
|
|
- log.setExeResult("0");
|
|
|
|
- log.setFeedback(r.getMsg());
|
|
|
|
- log.setEndTime(new Date());
|
|
|
|
- autoNodeLogMapper.updateAllById(log);
|
|
|
|
- f = true;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //更新节点任务
|
|
|
|
- taskNode.setExeStatus("3");
|
|
|
|
- taskNode.setExeResult("1");
|
|
|
|
- taskNode.setEndTime(new Date());
|
|
|
|
- taskNodeMapper.updateAllById(taskNode);
|
|
|
|
-
|
|
|
|
- //把当前完成的节点放入缓存,用于推送任务完成的百分比
|
|
|
|
- NumberFormat numberFormat = NumberFormat.getInstance();
|
|
|
|
- numberFormat.setMaximumFractionDigits(2);
|
|
|
|
- redisTemplate.opsForValue().set(CacheKey.TASK_CURRENT_NODE_PERCENT+"_"+task.getResourceId(), numberFormat.format(100*(float)(i+1) /(float)taskNodeList.size()));
|
|
|
|
- task.setProcess(Double.parseDouble(numberFormat.format(100*(float)(i+1) /(float)taskNodeList.size())));
|
|
|
|
- if(i==taskNodeList.size()-1){
|
|
|
|
- task.setStatus("3");
|
|
|
|
- task.setEndTime(new Date());
|
|
|
|
- taskMapper.updateById(task);
|
|
|
|
- //推送
|
|
|
|
- //删除正在执行的缓存
|
|
|
|
- redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK+"_"+task.getResourceId());
|
|
|
|
- redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT+"_"+task.getResourceId());
|
|
|
|
- redisTemplate.delete(CacheKey.TASK_CURRENT_NODE+"_"+task.getResourceId());
|
|
|
|
- this.pushTask(task);
|
|
|
|
- }else{//主要更新完成比例
|
|
|
|
- taskMapper.updateById(task);
|
|
|
|
- }
|
|
|
|
- }else{//TODO
|
|
|
|
- //插入执行日志
|
|
|
|
- log.setExeResult("0");
|
|
|
|
- autoNodeLogMapper.updateAllById(log);
|
|
|
|
- f = true;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //更新订单表里的完成数量等等字段
|
|
|
|
- if(i==0&&"1".equals(task.getFirstProcedureFlag())){
|
|
|
|
- Order order = orderMapper.selectById(task.getOrderId());
|
|
|
|
- order.setProduceNum((order.getProduceNum()==null?0:order.getProduceNum())+1);
|
|
|
|
- orderMapper.updateAllById(order);
|
|
|
|
- }
|
|
|
|
- //更新订单表里的完成数量等等字段
|
|
|
|
- if(i==taskNodeList.size()-1&&"1".equals(task.getLastProcedureFlag())){
|
|
|
|
- Order order = orderMapper.selectById(task.getOrderId());
|
|
|
|
- order.setCompleteNum((order.getCompleteNum()==null?0:order.getCompleteNum())+1);
|
|
|
|
- orderMapper.updateAllById(order);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }else{//没有节点直接改成已完成
|
|
|
|
- task.setStatus("3");
|
|
|
|
- task.setEndTime(new Date());
|
|
|
|
- taskMapper.updateById(task);
|
|
|
|
- }
|
|
|
|
- if(f){
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }catch (Exception e){
|
|
|
|
- e.printStackTrace();
|
|
|
|
- logger.info("===============================接口返回",e);
|
|
|
|
- }finally {
|
|
|
|
- //删除正在执行的缓存
|
|
|
|
- redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK+"_"+task.getResourceId());
|
|
|
|
- redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT+"_"+task.getResourceId());
|
|
|
|
- redisTemplate.delete(CacheKey.TASK_CURRENT_NODE+"_"+task.getResourceId());
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //设置计划结束
|
|
|
|
- planMapper.updateproduceStatusFinish();
|
|
|
|
- ////设置订单结束
|
|
|
|
- orderMapper.updateproduceStatusFinish();
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- public String checkLoading(TaskNode taskNode)throws Exception{
|
|
|
|
- String redisData = "";
|
|
|
|
- try {
|
|
|
|
- redisData = redisTemplate.opsForValue().get(CacheKey.TASK_CURRENT_NODE_STATUS+"_"+taskNode.getId()).toString();
|
|
|
|
- }catch (Exception e){
|
|
|
|
- Thread.sleep(1000);
|
|
|
|
- logger.error("缓存获取异常",e);
|
|
|
|
- return checkLoading(taskNode);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(!"1".equals(redisData)){
|
|
|
|
- Thread.sleep(1000);
|
|
|
|
- return checkLoading(taskNode);
|
|
|
|
- }else{
|
|
|
|
- redisTemplate.delete(CacheKey.TASK_CURRENT_NODE_STATUS+"_"+taskNode.getId());
|
|
|
|
- return "1";
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public String polling(TTask task,TaskNode taskNode,String fileName)throws Exception{
|
|
|
|
- String ip = task.getIp();
|
|
|
|
- String port = task.getPort();
|
|
|
|
- String redisData = "";
|
|
|
|
- try {
|
|
|
|
- redisData = redisTemplate.opsForValue().get(ip+":"+port).toString();
|
|
|
|
- }catch (Exception e){
|
|
|
|
- Thread.sleep(1000);
|
|
|
|
- logger.error("缓存获取异常",e);
|
|
|
|
- return polling(task,taskNode,fileName);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- JSONObject returnJson = JSONObject.parseObject(redisData);
|
|
|
|
- String conf = taskNode.getExamineMatchConf();
|
|
|
|
- JSONObject confJson = JSONObject.parseObject(conf);
|
|
|
|
-
|
|
|
|
- /*if(!testbreak(returnJson,confJson)){//需要跳出
|
|
|
|
- return "0";
|
|
|
|
- }*/
|
|
|
|
-
|
|
|
|
- if(!testSuccess(returnJson,confJson,fileName)){//尚未成功
|
|
|
|
- Thread.sleep(1000);
|
|
|
|
- return polling(task,taskNode,fileName);
|
|
|
|
- }else{
|
|
|
|
- return "1";
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 自检的数据,从缓存验证是否成功
|
|
|
|
- * @param returnJson
|
|
|
|
- * @param confJson
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public boolean testbreak(JSONObject returnJson,JSONObject confJson){
|
|
|
|
- boolean f = true;
|
|
|
|
- String proRunState = returnJson.get("ProRunState")==null?"":returnJson.get("ProRunState").toString();
|
|
|
|
- //先写死,后面要考虑怎么配置。
|
|
|
|
- if("2".equals(proRunState)||"3".equals(proRunState)){
|
|
|
|
- f = false;
|
|
|
|
- }
|
|
|
|
- /*for(String key:confJson.keySet()){
|
|
|
|
- if(returnJson.containsKey(key)){
|
|
|
|
- if(returnJson.getString(key)!=null&&returnJson.getString(key).equals(confJson.getString(key))){
|
|
|
|
- f = false;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }*/
|
|
|
|
- return f;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 自检的数据,从缓存验证是否成功
|
|
|
|
- * @param returnJson
|
|
|
|
- * @param confJson
|
|
|
|
- * @return
|
|
|
|
- */
|
|
|
|
- public boolean testSuccess(JSONObject returnJson,JSONObject confJson,String fileName){
|
|
|
|
- boolean f = true;
|
|
|
|
- String mainProgNo = returnJson.getString("MainProgNo").toUpperCase();
|
|
|
|
- String tmpFileName = fileName.replace(".","_").toUpperCase();
|
|
|
|
-
|
|
|
|
- for(String key:confJson.keySet()){
|
|
|
|
- if(!mainProgNo.endsWith(tmpFileName)){
|
|
|
|
- logger.info("================================hhh"+mainProgNo);
|
|
|
|
- logger.info("*****************************"+tmpFileName);
|
|
|
|
- f = false;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- if(returnJson.containsKey(key)){
|
|
|
|
- if(returnJson.getString(key)!=null&&!returnJson.getString(key).equals(confJson.getString(key))){
|
|
|
|
- f = false;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- return f;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- public void pushTask(TTask task){
|
|
|
|
- Map<String,Object>rmap = new HashMap<>();
|
|
|
|
- rmap.put("id",task.getResourceId());
|
|
|
|
- Map<String,Object> pmap = taskService.getExeTaskByResourceList(rmap);
|
|
|
|
- try {
|
|
|
|
- Object o = pmap.get("orderList");
|
|
|
|
- Map<String,Object >pushMap = new HashMap<>();
|
|
|
|
- pushMap.put("type",WebSocketServer.PUSH_TYPE_RESOURCE_TASK);
|
|
|
|
- pushMap.put(String.valueOf(task.getResourceId()),pmap);
|
|
|
|
- String pushMsg = JSONObject.toJSONString(pushMap);
|
|
|
|
- webSocketServer.BroadCastInfo(pushMsg);
|
|
|
|
- }catch (Exception e){
|
|
|
|
- logger.error("推送异常======"+logger);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
|
|
+//package com.github.zuihou.job;
|
|
|
|
+//
|
|
|
|
+//import com.alibaba.fastjson.JSONObject;
|
|
|
|
+//import com.github.zuihou.authority.service.common.ParameterService;
|
|
|
|
+//import com.github.zuihou.base.R;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.dao.OrderMapper;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.dao.PlanMapper;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.dao.TTaskMapper;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.dao.TaskNodeMapper;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.entity.Order;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.entity.TTask;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.entity.TaskNode;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.service.TaskNodeService;
|
|
|
|
+//import com.github.zuihou.business.operationManagementCenter.service.TaskService;
|
|
|
|
+//import com.github.zuihou.business.productionReadyCenter.dao.AutoNodeLogMapper;
|
|
|
|
+//import com.github.zuihou.business.productionReadyCenter.dao.AutoNodeMapper;
|
|
|
|
+//import com.github.zuihou.business.productionReadyCenter.dao.BomProcedureProgramGroupMapper;
|
|
|
|
+//import com.github.zuihou.business.productionReadyCenter.entity.AAutoNodeLog;
|
|
|
|
+//import com.github.zuihou.business.productionReadyCenter.entity.BomProcedureProgramGroup;
|
|
|
|
+//import com.github.zuihou.business.productionReadyCenter.service.AutoNodeService;
|
|
|
|
+//import com.github.zuihou.business.websocket.WebSocketServer;
|
|
|
|
+//import com.github.zuihou.common.constant.CacheKey;
|
|
|
|
+//import com.github.zuihou.common.constant.ParameterKey;
|
|
|
|
+//import com.github.zuihou.context.BaseContextHandler;
|
|
|
|
+//import com.github.zuihou.database.mybatis.conditions.Wraps;
|
|
|
|
+//import org.slf4j.Logger;
|
|
|
|
+//import org.slf4j.LoggerFactory;
|
|
|
|
+//import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+//import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
+//import org.springframework.stereotype.Component;
|
|
|
|
+//import org.springframework.web.client.RestTemplate;
|
|
|
|
+//
|
|
|
|
+//import java.text.NumberFormat;
|
|
|
|
+//import java.util.Date;
|
|
|
|
+//import java.util.HashMap;
|
|
|
|
+//import java.util.List;
|
|
|
|
+//import java.util.Map;
|
|
|
|
+//
|
|
|
|
+//@Component
|
|
|
|
+//public class TaskJobs1 {
|
|
|
|
+// @Autowired
|
|
|
|
+// private TaskService taskService;
|
|
|
|
+// @Autowired
|
|
|
|
+// private AutoNodeService autoNodeService;
|
|
|
|
+// @Autowired
|
|
|
|
+// private OrderMapper orderMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private PlanMapper planMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private AutoNodeMapper autoNodeMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private TTaskMapper taskMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private AutoNodeLogMapper autoNodeLogMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private BomProcedureProgramGroupMapper bomProcedureProgramGroupMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private ParameterService parameterService;
|
|
|
|
+// @Autowired
|
|
|
|
+// private RestTemplate restTemplate;
|
|
|
|
+// @Autowired
|
|
|
|
+// private RedisTemplate<String,Object> redisTemplate;
|
|
|
|
+// @Autowired
|
|
|
|
+// private TaskNodeService taskNodeService;
|
|
|
|
+//
|
|
|
|
+// @Autowired
|
|
|
|
+// private TaskNodeMapper taskNodeMapper;
|
|
|
|
+// @Autowired
|
|
|
|
+// private WebSocketServer webSocketServer;
|
|
|
|
+// private static Logger logger = LoggerFactory.getLogger(TaskJobs1.class);
|
|
|
|
+// //@Scheduled(cron="*/9 * * * * ?") //9秒执行一次
|
|
|
|
+// public void updateTaskStatusJob1(){
|
|
|
|
+// BaseContextHandler.setTenant("0000");
|
|
|
|
+//
|
|
|
|
+// String temUrl = parameterService.getValue(ParameterKey.AUTOPROGRAMEURL, null);
|
|
|
|
+// //String autoProgrameUrl = parameterService.getValue(ParameterKey.AUTOPROGRAMEURL, null);
|
|
|
|
+// //查出待执行的任务
|
|
|
|
+// //List<TTask> taskList = taskService.list(Wraps.<TTask>lbQ().eq(TTask::getStatus,"1").eq(TTask::getDraftFlag,"0").le(TTask::getExpectStartTime,new Date()));
|
|
|
|
+// Map qMap = new HashMap();
|
|
|
|
+// qMap.put("mulstatus","1");
|
|
|
|
+// List<TTask> taskList = taskMapper.getPrepareTask(qMap);
|
|
|
|
+//
|
|
|
|
+// //计划,订单MAP,用做提升性能,本次更新过的就不更新了
|
|
|
|
+// Map<String,String>planMap = new HashMap<String,String>();
|
|
|
|
+// Map<String,String>OrderMap = new HashMap<String,String>();
|
|
|
|
+// if(taskList!=null&&taskList.size()>0){
|
|
|
|
+// for(TTask task:taskList){
|
|
|
|
+// try{
|
|
|
|
+// //把本次待执行任务全部改成进行中
|
|
|
|
+// //taskMapper.updateTaskBegin();
|
|
|
|
+// task.setStatus("2");
|
|
|
|
+// task.setStartTime(new Date());
|
|
|
|
+// taskMapper.updateById(task);
|
|
|
|
+// if(!planMap.containsKey(String.valueOf(task.getPlanId()))){
|
|
|
|
+// //设置计划开始
|
|
|
|
+// planMapper.updateproduceStatusBegin();
|
|
|
|
+// planMap.put(String.valueOf(task.getPlanId()),String.valueOf(task.getPlanId()));
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// if(!OrderMap.containsKey(String.valueOf(task.getOrderId()))){
|
|
|
|
+// ////设置订单开始
|
|
|
|
+// orderMapper.updateproduceStatusBegin();
|
|
|
|
+// OrderMap.put(String.valueOf(task.getOrderId()),String.valueOf(task.getOrderId()));
|
|
|
|
+// }
|
|
|
|
+// redisTemplate.opsForValue().set(CacheKey.PRESOURCE_CURRENT_TASK+"_"+task.getResourceId(), task.getId());
|
|
|
|
+// redisTemplate.opsForValue().set(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT+"_"+task.getResourceId(), task);
|
|
|
|
+// boolean f = false;
|
|
|
|
+// //执行任务对应的自动化程序
|
|
|
|
+// /*AutoNode model = new AutoNode();
|
|
|
|
+// model.setProcedureId(task.getProcedureId());
|
|
|
|
+// List<AutoNode> autoNodeList = autoNodeMapper.getNodeList(model);*/
|
|
|
|
+// Map map = new HashMap();
|
|
|
|
+// map.put("taskId",task.getId());
|
|
|
|
+// List<TaskNode>taskNodeList = taskNodeService.getTaskNodeList(map);
|
|
|
|
+//
|
|
|
|
+// if(taskNodeList!=null&&taskNodeList.size()>0){
|
|
|
|
+// Map queryMap = new HashMap<>();
|
|
|
|
+// queryMap.put("procedureId",task.getProcedureId());
|
|
|
|
+// queryMap.put("haveFile","1");
|
|
|
|
+// List<BomProcedureProgramGroup>bomProcedureProgramGroupList = bomProcedureProgramGroupMapper.getProgramGroupList(queryMap);
|
|
|
|
+// for(int i = 0;i<taskNodeList.size();i++){
|
|
|
|
+// String autoProgrameUrl = temUrl;
|
|
|
|
+// TaskNode taskNode = taskNodeList.get(i);
|
|
|
|
+// //把当前节点存放缓存
|
|
|
|
+// redisTemplate.opsForValue().set(CacheKey.TASK_CURRENT_NODE+"_"+task.getResourceId(), taskNode.getAutoNodeId());
|
|
|
|
+// String code = taskNode.getAutoNodeCode();
|
|
|
|
+// autoProgrameUrl+="?func="+code;
|
|
|
|
+// autoProgrameUrl+="&ip="+task.getIp()+"&port="+task.getPort();
|
|
|
|
+// String fileName = "";
|
|
|
|
+// if(bomProcedureProgramGroupList!=null&&bomProcedureProgramGroupList.size()>0){
|
|
|
|
+// fileName = bomProcedureProgramGroupList.get(0).getSubmittedFileName();
|
|
|
|
+// autoProgrameUrl+="&fileName="+fileName;
|
|
|
|
+// }
|
|
|
|
+// List<AAutoNodeLog> autoNodeLogList = autoNodeLogMapper.selectList(Wraps.<AAutoNodeLog>lbQ().eq(AAutoNodeLog::getAutoNodeId,taskNode.getAutoNodeId()).eq(AAutoNodeLog::getTaskId,task.getId()));
|
|
|
|
+// //插入执行日志
|
|
|
|
+// AAutoNodeLog log = new AAutoNodeLog();
|
|
|
|
+// if(autoNodeLogList==null||autoNodeLogList.size()==0){
|
|
|
|
+// log.setAutoNodeId(taskNode.getAutoNodeId());
|
|
|
|
+// log.setOrderId(task.getOrderId());
|
|
|
|
+// log.setTaskId(task.getId());
|
|
|
|
+// log.setExeStatus("2");
|
|
|
|
+// log.setStartTime(new Date());
|
|
|
|
+// log.setFeedbackFile(fileName);
|
|
|
|
+// autoNodeLogMapper.insert(log);
|
|
|
|
+// }else{
|
|
|
|
+// log = autoNodeLogList.get(0);
|
|
|
|
+// log.setFeedbackFile(fileName);
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// //更新节点任务
|
|
|
|
+// taskNode.setExeStatus("2");
|
|
|
|
+// taskNode.setStartTime(new Date());
|
|
|
|
+// taskNodeMapper.updateAllById(taskNode);
|
|
|
|
+//
|
|
|
|
+// //推送
|
|
|
|
+// this.pushTask(task);
|
|
|
|
+//
|
|
|
|
+// logger.info("===============================请求地址"+autoProgrameUrl);
|
|
|
|
+// String returnData = "";
|
|
|
|
+// try {
|
|
|
|
+// if(!"0".equals(taskNode.getNodeType())){//人工上下料或质检
|
|
|
|
+// //不用调接口,直接返回成功
|
|
|
|
+// returnData = "success";
|
|
|
|
+// }else{
|
|
|
|
+// returnData = restTemplate.getForObject(autoProgrameUrl, String.class);
|
|
|
|
+// }
|
|
|
|
+// }catch(Exception e){
|
|
|
|
+// e.printStackTrace();
|
|
|
|
+// logger.error("调用接口发生异常"+e.getMessage());
|
|
|
|
+// }
|
|
|
|
+// logger.info("===============================接口返回"+returnData);
|
|
|
|
+// //if("success".equals(returnData)){
|
|
|
|
+// //TODO
|
|
|
|
+// if(1==1){
|
|
|
|
+// //判断值是否需要循环自检
|
|
|
|
+// if(!"0".equals(taskNode.getNodeType())){//人工上下料或质检
|
|
|
|
+// redisTemplate.opsForValue().set(CacheKey.TASK_CURRENT_NODE_STATUS+"_"+taskNode.getId(), "0");
|
|
|
|
+// String b = checkLoading(taskNode);
|
|
|
|
+// }else{//调用机器
|
|
|
|
+// if("1".equals(taskNode.getSelfExamine())){//需要自检的,需要停顿一会,避免取数不及时
|
|
|
|
+// Thread.sleep(1500L);
|
|
|
|
+// String b = polling(task,taskNode,fileName);
|
|
|
|
+// if("0".equals(b)){//需要跳出
|
|
|
|
+// //插入执行日志
|
|
|
|
+// log.setExeResult("0");
|
|
|
|
+// autoNodeLogMapper.updateAllById(log);
|
|
|
|
+// f = true;
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// //处理出库入库
|
|
|
|
+// R<String> r = taskNodeService.taskNodeStock(taskNode, task);
|
|
|
|
+// //插入执行日志
|
|
|
|
+// log.setExeStatus("3");
|
|
|
|
+// if(r.getIsSuccess()){
|
|
|
|
+// log.setExeResult("1");
|
|
|
|
+// log.setEndTime(new Date());
|
|
|
|
+// autoNodeLogMapper.updateAllById(log);
|
|
|
|
+// }else{
|
|
|
|
+// log.setExeResult("0");
|
|
|
|
+// log.setFeedback(r.getMsg());
|
|
|
|
+// log.setEndTime(new Date());
|
|
|
|
+// autoNodeLogMapper.updateAllById(log);
|
|
|
|
+// f = true;
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// //更新节点任务
|
|
|
|
+// taskNode.setExeStatus("3");
|
|
|
|
+// taskNode.setExeResult("1");
|
|
|
|
+// taskNode.setEndTime(new Date());
|
|
|
|
+// taskNodeMapper.updateAllById(taskNode);
|
|
|
|
+//
|
|
|
|
+// //把当前完成的节点放入缓存,用于推送任务完成的百分比
|
|
|
|
+// NumberFormat numberFormat = NumberFormat.getInstance();
|
|
|
|
+// numberFormat.setMaximumFractionDigits(2);
|
|
|
|
+// redisTemplate.opsForValue().set(CacheKey.TASK_CURRENT_NODE_PERCENT+"_"+task.getResourceId(), numberFormat.format(100*(float)(i+1) /(float)taskNodeList.size()));
|
|
|
|
+// task.setProcess(Double.parseDouble(numberFormat.format(100*(float)(i+1) /(float)taskNodeList.size())));
|
|
|
|
+// if(i==taskNodeList.size()-1){
|
|
|
|
+// task.setStatus("3");
|
|
|
|
+// task.setEndTime(new Date());
|
|
|
|
+// taskMapper.updateById(task);
|
|
|
|
+// //推送
|
|
|
|
+// //删除正在执行的缓存
|
|
|
|
+// redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK+"_"+task.getResourceId());
|
|
|
|
+// redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT+"_"+task.getResourceId());
|
|
|
|
+// redisTemplate.delete(CacheKey.TASK_CURRENT_NODE+"_"+task.getResourceId());
|
|
|
|
+// this.pushTask(task);
|
|
|
|
+// }else{//主要更新完成比例
|
|
|
|
+// taskMapper.updateById(task);
|
|
|
|
+// }
|
|
|
|
+// }else{//TODO
|
|
|
|
+// //插入执行日志
|
|
|
|
+// log.setExeResult("0");
|
|
|
|
+// autoNodeLogMapper.updateAllById(log);
|
|
|
|
+// f = true;
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// //更新订单表里的完成数量等等字段
|
|
|
|
+// if(i==0&&"1".equals(task.getFirstProcedureFlag())){
|
|
|
|
+// Order order = orderMapper.selectById(task.getOrderId());
|
|
|
|
+// order.setProduceNum((order.getProduceNum()==null?0:order.getProduceNum())+1);
|
|
|
|
+// orderMapper.updateAllById(order);
|
|
|
|
+// }
|
|
|
|
+// //更新订单表里的完成数量等等字段
|
|
|
|
+// if(i==taskNodeList.size()-1&&"1".equals(task.getLastProcedureFlag())){
|
|
|
|
+// Order order = orderMapper.selectById(task.getOrderId());
|
|
|
|
+// order.setCompleteNum((order.getCompleteNum()==null?0:order.getCompleteNum())+1);
|
|
|
|
+// orderMapper.updateAllById(order);
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// }else{//没有节点直接改成已完成
|
|
|
|
+// task.setStatus("3");
|
|
|
|
+// task.setEndTime(new Date());
|
|
|
|
+// taskMapper.updateById(task);
|
|
|
|
+// }
|
|
|
|
+// if(f){
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+// }catch (Exception e){
|
|
|
|
+// e.printStackTrace();
|
|
|
|
+// logger.info("===============================接口返回",e);
|
|
|
|
+// }finally {
|
|
|
|
+// //删除正在执行的缓存
|
|
|
|
+// redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK+"_"+task.getResourceId());
|
|
|
|
+// redisTemplate.delete(CacheKey.PRESOURCE_CURRENT_TASK_OBJECT+"_"+task.getResourceId());
|
|
|
|
+// redisTemplate.delete(CacheKey.TASK_CURRENT_NODE+"_"+task.getResourceId());
|
|
|
|
+//
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// //设置计划结束
|
|
|
|
+// planMapper.updateproduceStatusFinish();
|
|
|
|
+// ////设置订单结束
|
|
|
|
+// orderMapper.updateproduceStatusFinish();
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// public String checkLoading(TaskNode taskNode)throws Exception{
|
|
|
|
+// String redisData = "";
|
|
|
|
+// try {
|
|
|
|
+// redisData = redisTemplate.opsForValue().get(CacheKey.TASK_CURRENT_NODE_STATUS+"_"+taskNode.getId()).toString();
|
|
|
|
+// }catch (Exception e){
|
|
|
|
+// Thread.sleep(1000);
|
|
|
|
+// logger.error("缓存获取异常",e);
|
|
|
|
+// return checkLoading(taskNode);
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// if(!"1".equals(redisData)){
|
|
|
|
+// Thread.sleep(1000);
|
|
|
|
+// return checkLoading(taskNode);
|
|
|
|
+// }else{
|
|
|
|
+// redisTemplate.delete(CacheKey.TASK_CURRENT_NODE_STATUS+"_"+taskNode.getId());
|
|
|
|
+// return "1";
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// public String polling(TTask task,TaskNode taskNode,String fileName)throws Exception{
|
|
|
|
+// String ip = task.getIp();
|
|
|
|
+// String port = task.getPort();
|
|
|
|
+// String redisData = "";
|
|
|
|
+// try {
|
|
|
|
+// redisData = redisTemplate.opsForValue().get(ip+":"+port).toString();
|
|
|
|
+// }catch (Exception e){
|
|
|
|
+// Thread.sleep(1000);
|
|
|
|
+// logger.error("缓存获取异常",e);
|
|
|
|
+// return polling(task,taskNode,fileName);
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// JSONObject returnJson = JSONObject.parseObject(redisData);
|
|
|
|
+// String conf = taskNode.getExamineMatchConf();
|
|
|
|
+// JSONObject confJson = JSONObject.parseObject(conf);
|
|
|
|
+//
|
|
|
|
+// /*if(!testbreak(returnJson,confJson)){//需要跳出
|
|
|
|
+// return "0";
|
|
|
|
+// }*/
|
|
|
|
+//
|
|
|
|
+// if(!testSuccess(returnJson,confJson,fileName)){//尚未成功
|
|
|
|
+// Thread.sleep(1000);
|
|
|
|
+// return polling(task,taskNode,fileName);
|
|
|
|
+// }else{
|
|
|
|
+// return "1";
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// /**
|
|
|
|
+// * 自检的数据,从缓存验证是否成功
|
|
|
|
+// * @param returnJson
|
|
|
|
+// * @param confJson
|
|
|
|
+// * @return
|
|
|
|
+// */
|
|
|
|
+// public boolean testbreak(JSONObject returnJson,JSONObject confJson){
|
|
|
|
+// boolean f = true;
|
|
|
|
+// String proRunState = returnJson.get("ProRunState")==null?"":returnJson.get("ProRunState").toString();
|
|
|
|
+// //先写死,后面要考虑怎么配置。
|
|
|
|
+// if("2".equals(proRunState)||"3".equals(proRunState)){
|
|
|
|
+// f = false;
|
|
|
|
+// }
|
|
|
|
+// /*for(String key:confJson.keySet()){
|
|
|
|
+// if(returnJson.containsKey(key)){
|
|
|
|
+// if(returnJson.getString(key)!=null&&returnJson.getString(key).equals(confJson.getString(key))){
|
|
|
|
+// f = false;
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// }*/
|
|
|
|
+// return f;
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+// /**
|
|
|
|
+// * 自检的数据,从缓存验证是否成功
|
|
|
|
+// * @param returnJson
|
|
|
|
+// * @param confJson
|
|
|
|
+// * @return
|
|
|
|
+// */
|
|
|
|
+// public boolean testSuccess(JSONObject returnJson,JSONObject confJson,String fileName){
|
|
|
|
+// boolean f = true;
|
|
|
|
+// String mainProgNo = returnJson.getString("MainProgNo").toUpperCase();
|
|
|
|
+// String tmpFileName = fileName.replace(".","_").toUpperCase();
|
|
|
|
+//
|
|
|
|
+// for(String key:confJson.keySet()){
|
|
|
|
+// if(!mainProgNo.endsWith(tmpFileName)){
|
|
|
|
+// logger.info("================================hhh"+mainProgNo);
|
|
|
|
+// logger.info("*****************************"+tmpFileName);
|
|
|
|
+// f = false;
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+// if(returnJson.containsKey(key)){
|
|
|
|
+// if(returnJson.getString(key)!=null&&!returnJson.getString(key).equals(confJson.getString(key))){
|
|
|
|
+// f = false;
|
|
|
|
+// break;
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// return f;
|
|
|
|
+// }
|
|
|
|
+//
|
|
|
|
+//
|
|
|
|
+// public void pushTask(TTask task){
|
|
|
|
+// Map<String,Object>rmap = new HashMap<>();
|
|
|
|
+// rmap.put("id",task.getResourceId());
|
|
|
|
+// Map<String,Object> pmap = taskService.getExeTaskByResourceList(rmap);
|
|
|
|
+// try {
|
|
|
|
+// Object o = pmap.get("orderList");
|
|
|
|
+// Map<String,Object >pushMap = new HashMap<>();
|
|
|
|
+// pushMap.put("type",WebSocketServer.PUSH_TYPE_RESOURCE_TASK);
|
|
|
|
+// pushMap.put(String.valueOf(task.getResourceId()),pmap);
|
|
|
|
+// String pushMsg = JSONObject.toJSONString(pushMap);
|
|
|
|
+// webSocketServer.BroadCastInfo(pushMsg);
|
|
|
|
+// }catch (Exception e){
|
|
|
|
+// logger.error("推送异常======"+logger);
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+//}
|
|
|
|
+//
|