package com.northglass.service.message;
|
|
import java.io.IOException;
|
import java.io.PrintWriter;
|
import java.io.StringWriter;
|
import java.text.DecimalFormat;
|
import java.util.Date;
|
import java.util.List;
|
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.northglass.constants.ShelfTaskType;
|
import com.northglass.constants.StateConstants.LoadMachineRackState;
|
import com.northglass.constants.StateConstants.LoadMachineTaskState;
|
import com.northglass.constants.StateConstants.ShelfRankState;
|
import com.northglass.constants.StateConstants.ShelfTaskState;
|
import com.northglass.entity.LoadMachine;
|
import com.northglass.entity.LoadMachineRack;
|
import com.northglass.entity.LoadMachineTask;
|
import com.northglass.entity.OptPattern;
|
import com.northglass.entity.RawPackage;
|
import com.northglass.entity.ReportTask;
|
import com.northglass.entity.ShelfRank;
|
import com.northglass.entity.ShelfStatu;
|
import com.northglass.entity.ShelfTask;
|
import com.northglass.repository.LoadMachineRackDao;
|
import com.northglass.repository.LoadMachineTaskDao;
|
import com.northglass.repository.OptPatternDao;
|
import com.northglass.repository.RawPackageDao;
|
import com.northglass.repository.ReportTaskDao;
|
import com.northglass.repository.ShelfRankDao;
|
import com.northglass.repository.ShelfStatuDao;
|
import com.northglass.repository.ShelfTaskDao;
|
import com.northglass.service.device.DeviceService;
|
import com.northglass.service.loadmachine.LoadMachineService;
|
import com.northglass.service.shelf.ShelfService;
|
import com.northglass.service.shelfrank.ShelfRankService;
|
import com.northglass.util.HexUtil;
|
|
@Component
|
@Transactional
|
public class LoadMachineMessageProcessor extends AbstractMessageProcessor {
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(LoadMachineMessageProcessor.class);
|
@Autowired
|
private LoadMachineService loadMachineService;
|
|
@Autowired
|
private ShelfService shelfService;
|
|
@Autowired
|
private ShelfRankService shelfRankService;
|
|
@Autowired
|
private RawPackageDao rawPackageDao;
|
|
@Autowired
|
private OptPatternDao optPatternDao;
|
|
@Autowired
|
private LoadMachineTaskDao loadMachineTaskDao;
|
|
@Autowired
|
private ShelfTaskDao shelfTaskDao;
|
|
@Autowired
|
private ShelfStatuDao shelfStatuDao;
|
|
@Autowired
|
private LoadMachineRackDao loadMachineRackDao;
|
|
@Autowired
|
private ShelfRankDao shelfRankDao;
|
|
@Autowired
|
private ReportTaskDao reportTaskDao;
|
|
//请求信号
|
private static final int TASK_ASK_START = 18;
|
private static final int TASK_ASK_END = 21;
|
//请求ID
|
private static final int TASK_ASK_TD_START = 22;
|
private static final int TASK_ASK_ID_END = 25;
|
|
//任务汇报字
|
private static final int TASK_FINISH_PLC_START = 38;
|
private static final int TASK_FINISH_PLC_END = 41;
|
|
//任务汇报ID
|
private static final int TASK_FINISH_PLC_ID_START = 42;
|
private static final int TASK_FINISH_PLC_ID_END = 45;
|
|
//任务发送字
|
private static final int TASK_MES_START = 58;
|
private static final int TASK_MES_END = 61;
|
|
//任务确认字
|
private static final int TASK_SURE_START = 98;
|
private static final int TASK_SURE_END = 101;
|
|
// 任务报警字
|
private static final int TASK_WARN_START = 138;
|
private static final int TASK_WARN_END = 141;
|
|
//完成步骤
|
private static final int FINISH_STEP_START = 178;
|
private static final int FINISH_STEP_END = 181;
|
|
/**
|
* 解析16进制消息,转译为描述信息
|
*
|
* @param messageHex
|
* @return
|
*/
|
public String parse(String messageHex) {
|
LOGGER.trace("> Start parse");
|
|
if (messageHex.length() < 84) {
|
return "无效消息:" + messageHex;
|
}
|
|
String startSign = messageHex.substring(START_SIGN_START, START_SIGN_END + 1);
|
if (!startSign.equals("3c5354413e")) {
|
return "无效消息:" + messageHex;
|
}
|
|
StringBuffer messageDescription = new StringBuffer();
|
|
// 消息长度
|
messageDescription.append(parseInt(messageHex, MESSAGE_LENGTH_START, MESSAGE_LENGTH_END, "消息长度"));
|
|
// 订单编号
|
messageDescription.append(parseString(messageHex, ORDER_NUMBER_START, ORDER_NUMBER_END, "订单编号"));
|
|
// 功能号
|
messageDescription.append(parseString(messageHex, FUNCTION_NUMBER_START, FUNCTION_NUMBER_END, "功能号"));
|
|
// 加密方式
|
messageDescription.append(parseString(messageHex, ENCRYPT_START, ENCRYPT_END, "加密方式"));
|
|
// 发送时刻
|
messageDescription.append(parseTime(messageHex, SEND_TIME_START, SEND_TIME_END, "发送时刻"));
|
|
// 解析数据区
|
messageDescription.append(parseData(messageHex));
|
|
// LOGGER.trace("> End parse");
|
return messageDescription.toString();
|
}
|
|
private String parseData(String messageHex) {
|
return "无法解析数据区";
|
}
|
|
public String generateReturnMessage(String sendMessageHex, LoadMachine loadMachine) {//sendMessageHex 所有的消息 loadMachine上片机器
|
/*LOGGER.debug("-------------------上片机ip: " + loadMachine.getIpAddress());
|
LOGGER.debug("收到上片机的信息:"+sendMessageHex);*/
|
if (sendMessageHex.length() == 24) {
|
String string=sendMessageHex.substring(8,15);
|
if (string.equals("00060010")) {
|
//LOGGER.debug("上次消息发送成功!");
|
return "";
|
}else {
|
//LOGGER.debug("上次消息发送失败!上片机"+loadMachine.getId());
|
return "";
|
}
|
}else if (sendMessageHex.length() == 198) {
|
try {
|
ShelfStatu statu = shelfStatuDao.findByMachine("load"+loadMachine.getId());
|
String message=sendMessageHex.substring(18);
|
statu.setMessage(message);
|
statu.setSetTime(new Date());
|
//找到当前机器保存数据库
|
shelfStatuDao.save(statu);
|
//请求信号
|
String taskAsk = sendMessageHex.substring(TASK_ASK_START, TASK_ASK_END + 1);
|
//请求ID
|
String taskIdAsk = sendMessageHex.substring(TASK_ASK_TD_START, TASK_ASK_ID_END + 1);
|
//任务汇报字
|
String taskFinish = sendMessageHex.substring(TASK_FINISH_PLC_START, TASK_FINISH_PLC_END + 1);
|
//任务汇报字ID
|
String taskFinishId = sendMessageHex.substring(TASK_FINISH_PLC_ID_START, TASK_FINISH_PLC_ID_END + 1);
|
//任务发送字
|
String taskMes = sendMessageHex.substring(TASK_MES_START, TASK_MES_END + 1);
|
//任务确认字
|
String taskSure = sendMessageHex.substring(TASK_SURE_START, TASK_SURE_END + 1);
|
//任务报警字
|
String taskWarning = sendMessageHex.substring(TASK_WARN_START, TASK_WARN_END + 1);
|
//完成步骤
|
String finishStep = sendMessageHex.substring(FINISH_STEP_START, FINISH_STEP_END + 1);
|
|
//
|
|
// 获取上片机正在执行的任务
|
LoadMachineTask workingTask = loadMachineTaskDao.findInWorkTaskByLoadMachine(loadMachine.getId());
|
//收到完成消息
|
if (taskFinish.equals("0001")) {
|
//任务确认
|
if (taskSure.equals("0000")) {
|
if(workingTask != null){
|
OptPattern optPattern = workingTask.getOptPattern();
|
RawPackage rawPackage = workingTask.getRawPackage();
|
ShelfRank shelfRank = shelfRankDao.findRankByRawId(rawPackage.getId());
|
if(rawPackage.getLeftPieces()<1){
|
return "";
|
}
|
rawPackage.setLeftPieces(rawPackage.getLeftPieces() - 1);//数量减一
|
/*String manufacturer = rawPackage.getManufacturer();
|
int manu = 0;
|
if (manufacturer != null && !"".equals(manufacturer)) {
|
manu = Integer.valueOf(manufacturer);
|
}
|
rawPackage.setManufacturer(String.valueOf(manu + 1));//生产厂家加一
|
*/ rawPackageDao.save(rawPackage);
|
shelfRank.setCompletePieces(rawPackage.getPieces()-rawPackage.getLeftPieces());
|
shelfRankDao.save(shelfRank);
|
optPattern.setCompletedPieces(optPattern.getCompletedPieces() + 1);//完成片数加一
|
optPatternDao.save(optPattern);
|
workingTask.setState(LoadMachineTaskState.COMPLETED);//改状态
|
workingTask.setCompleteTime(new Date());
|
loadMachineTaskDao.save(workingTask);
|
|
//把当前的glass数据送入glass表中
|
loadMachineService.bcglass(optPattern.getId());
|
|
DecimalFormat dFormat = new DecimalFormat("######0.00");
|
Double area = (double) (optPattern.getHeight() / 1000)
|
* (double) (optPattern.getWidth() / 1000);
|
area = Double.valueOf(dFormat.format(area));
|
ReportTask reportTask = new ReportTask(workingTask.getDescription(), 1, "已完成", workingTask.getOptPattern().getRawPackageTxt().getCreateTime() , new Date(), null,
|
loadMachine, optPattern, area);
|
reportTaskDao.save(reportTask);
|
System.out.println("上片机"+loadMachine.getId()+"写入内容: [ "
|
+ "吸片完成, "
|
+ "任务ID:"+workingTask.getId()+", "
|
+ "宽:"+optPattern.getWidth()+", "
|
+ "高:"+optPattern.getHeight()+", "
|
+ "厚:"+optPattern.getGlassThickness()+", "
|
+ "玻璃包号:"+workingTask.getRawPackage().getId()+", "
|
+ "剩余片数:"+workingTask.getRawPackage().getLeftPieces());
|
return sendMessage("0001"+taskFinishId,"0014");
|
}else{
|
return sendMessage("0001"+taskFinishId,"0014");
|
}
|
}
|
return "";
|
}else if(taskFinish.equals("0002")){
|
if(taskSure.equals("0000")){
|
if(workingTask != null){
|
workingTask.setState("等待中");
|
workingTask.setCompleteTime(new Date());
|
loadMachineTaskDao.save(workingTask);
|
System.out.println("上片机"+loadMachine.getId()+"写入内容: [ "
|
+ "吸片失败, "
|
+ "任务ID:"+workingTask.getId());
|
return sendMessage("0002"+taskFinishId,"0014");
|
}else{
|
return sendMessage("0002"+taskFinishId,"0014");
|
}
|
}
|
return "";
|
}else if(taskFinish.equals("0003")){
|
if(taskSure.equals("0000")){
|
if(workingTask != null){
|
OptPattern optPattern = workingTask.getOptPattern();
|
RawPackage rawPackage = workingTask.getRawPackage();
|
if(rawPackage.getLeftPieces()<1){
|
return "";
|
}
|
ShelfRank shelfRank = shelfRankDao.findRankByRawId(rawPackage.getId());
|
rawPackage.setLeftPieces(rawPackage.getLeftPieces() - 1);//数量减一
|
rawPackageDao.save(rawPackage);
|
shelfRank.setCompletePieces(rawPackage.getPieces()-rawPackage.getLeftPieces());
|
shelfRankDao.save(shelfRank);
|
optPatternDao.save(optPattern);
|
workingTask.setState("等待中");
|
workingTask.setCompleteTime(new Date());
|
loadMachineTaskDao.save(workingTask);
|
System.out.println("上片机"+loadMachine.getId()+"写入内容: [ "
|
+ "吸片破损, "
|
+ "任务ID:"+workingTask.getId()+", "
|
+ "宽:"+optPattern.getWidth()+", "
|
+ "高:"+optPattern.getHeight()+", "
|
+ "厚:"+optPattern.getGlassThickness()+", "
|
+ "玻璃包号:"+workingTask.getRawPackage().getId()+", "
|
+ "剩余片数:"+workingTask.getRawPackage().getLeftPieces());
|
return sendMessage("0003"+taskFinishId,"0014");
|
}else{
|
return sendMessage("0003"+taskFinishId,"0014");
|
}
|
}
|
return "";
|
}else{
|
if (taskSure.equals("0001")) {
|
return sendMessage("00000000","0014");
|
}else if(taskSure.equals("0002")){
|
return sendMessage("00000000","0014");
|
}else if(taskSure.equals("0003")){
|
return sendMessage("00000000","0014");
|
}
|
}
|
//收到请求
|
if(taskAsk.equals("0001")){
|
/*DeviceService.WriteFile("D:", "上片请求记录",new Date()+"任务id:"+workingTask.getId());*/
|
if (taskMes.equals("0001")) {//信息已经发送,但是PLC程序已改变,不发送信息!
|
/*String startLoadMachine = sendMessage("0000000000000000","000a");
|
LOGGER.debug("清除消息: " + startLoadMachine);
|
return startLoadMachine;*/
|
return "";
|
}else{
|
//当前有任务在执行
|
|
|
List<LoadMachineTask> TaskAll = loadMachineTaskDao.findTaskByLoadMachine(loadMachine.getId());
|
if(!TaskAll.isEmpty()&&workingTask==null){
|
|
LoadMachineTask LoadMachineTaskFisrt=TaskAll.get(0);
|
if(LoadMachineTaskFisrt.getState().equals("等待中")){
|
//拿到所需版面OPT
|
OptPattern optPattern = LoadMachineTaskFisrt.getOptPattern();
|
//获取此上片机的所有上片位
|
List<LoadMachineRack> rackes = loadMachineRackDao.findLoadMachineRacksByLoadMachineId(loadMachine.getId());
|
//获取此机器的第一个上片位
|
LoadMachineRack loadMachineRackOne = rackes.get(0);// 一号工位
|
//直接生成仓储任务
|
|
if(loadMachineRackOne.getRawPackage()==null){
|
ShelfRank shelfRank = shelfRankService.getShelfRankByOptPattern(optPattern);
|
if(shelfRank==null){
|
loadMachineService.setNoRawPackageInLoadMachineRackMessage(loadMachineRackOne,
|
optPattern, loadMachineRackOne.getRawPackage().getLeftPieces());
|
}else{
|
// 清除报警信息
|
loadMachineService.clearMessage(loadMachineRackOne);
|
// 判断从货架到上片位的任务是否已经创建
|
ShelfTask fromShelfRackToLoadMachineRack = shelfTaskDao
|
.findWorkingShelfTaskFromShelfRackToLoadMachineRack(shelfRank.getId(),loadMachineRackOne.getId());
|
// 若没创建,则新建从货架到上片位的任务
|
if (fromShelfRackToLoadMachineRack == null) {
|
fromShelfRackToLoadMachineRack = new ShelfTask(ShelfTaskState.WAITING,
|
ShelfTaskType.FROM_SHELF_RACK_TO_LOAD_MACHINE_RACK, new Date(), "1",
|
shelfRank, loadMachineRackOne);
|
shelfService.saveShelfTask(fromShelfRackToLoadMachineRack);
|
// 设置仓位,上片位状态
|
shelfRank.setState(ShelfRankState.IN_WORKING);
|
loadMachineRackOne.setState(LoadMachineRackState.IN_WORK);
|
loadMachineRackOne.setRawPackage(shelfRank.getRawPackage());
|
loadMachineRackDao.save(loadMachineRackOne);
|
}
|
}
|
}else{
|
//匹配
|
boolean iscopy=shelfRankService.isCopyOptPattern(loadMachineRackOne,optPattern);
|
if(iscopy){
|
//发送任务
|
if(loadMachineRackOne.getState().equals("正在使用")&&loadMachineRackOne.getRawPackage().getLeftPieces()>0){
|
String date="";
|
String bb=HexUtil.intTo2ByteHex(Integer.valueOf(new Double(loadMachineRackOne.getRawPackage().getWidth()).intValue()));
|
String hh=HexUtil.intTo2ByteHex(Integer.valueOf(new Double(loadMachineRackOne.getRawPackage().getHeight()).intValue()));
|
date="0001"+taskIdAsk+"0002"+bb+hh;
|
System.out.println("上片机"+loadMachine.getId()+"写入内容: [ "
|
+ "开始吸片, "
|
+ "任务ID:"+LoadMachineTaskFisrt.getId()+", "
|
+ "宽:"+optPattern.getWidth()+", "
|
+ "高:"+optPattern.getHeight()+", "
|
+ "厚:"+optPattern.getGlassThickness()+", "
|
+ "玻璃包号:"+loadMachineRackOne.getRawPackage().getId()+", "
|
+ "剩余片数:"+loadMachineRackOne.getRawPackage().getLeftPieces());
|
String startLoadMachine = sendMessage(date,"000a");
|
System.out.println(bb+","+hh);
|
LoadMachineTaskFisrt.setState("正在工作");
|
LoadMachineTaskFisrt.setRawPackage(loadMachineRackOne.getRawPackage());
|
loadMachineTaskDao.save(LoadMachineTaskFisrt);
|
return startLoadMachine;
|
}
|
return "";
|
//String date="0001"+taskIdAsk+"00020001";
|
}else{
|
//生成退库
|
// 判断从工位到货架的任务是否已经创建
|
ShelfTask fromLoadMachineRackToShelfRack = shelfTaskDao
|
.findShelfTaskFromLoadMachineRackToShelfRack(loadMachineRackOne.getId(),
|
loadMachineRackOne.getRawPackage().getShelfRank().getId());
|
// 若没创建,则新建从上片位到货架的任务
|
if (fromLoadMachineRackToShelfRack == null) {
|
fromLoadMachineRackToShelfRack = new ShelfTask(ShelfTaskState.WAITING,
|
ShelfTaskType.FROM_LOAD_MACHINE_RACK_TO_SHELF_RACK, new Date(), "1",
|
loadMachineRackOne.getRawPackage().getShelfRank(),
|
loadMachineRackOne);
|
|
shelfService.saveShelfTask(fromLoadMachineRackToShelfRack);
|
}
|
return "";
|
}
|
}
|
}
|
}
|
|
}
|
}else if (taskAsk.equals("0000")) {
|
if(taskMes.equals("0001")){
|
String startLoadMachine = sendMessage("0000000000000000","000a");
|
//LOGGER.debug("清除消息: " + startLoadMachine);
|
return startLoadMachine;
|
}
|
|
}
|
return "";
|
} catch (Exception e) {
|
//System.out.println("请检查LoadMachineMessageProcessor.generateReturnMessage");
|
DeviceService.WriteFile("D:", "上片错误记录",new Date()+"错误原因1:"+getStackTraceInfo(e));
|
}
|
}else {
|
//LOGGER.debug("接收的信息和设置的不一致,请查找原因,长度为:"+sendMessageHex.length());
|
return "";
|
}
|
return "";
|
}
|
|
|
/**
|
* 消息发送
|
*
|
* @param task
|
* @return
|
*/
|
private String sendMessage(String senddate, String address) {
|
String Herd = "0010" + address;
|
int length = senddate.length() / 4;
|
String dates = Herd + HexUtil.intTo2ByteHex(length) + HexUtil.intTo1ByteHex(length * 2) + senddate;
|
int lengths = dates.length() / 2;
|
String date = "00000000" + HexUtil.intTo2ByteHex(lengths) + dates;
|
//LOGGER.debug("发送信息内容:" + date);
|
return date;
|
}
|
|
|
/**
|
* 获取e.printStackTrace() 的具体信息,赋值给String 变量,并返回
|
*
|
* @param e
|
* Exception
|
* @return e.printStackTrace() 中 的信息
|
*/
|
public static String getStackTraceInfo(Exception e) {
|
StringWriter sw = null;
|
PrintWriter pw = null;
|
try {
|
sw = new StringWriter();
|
pw = new PrintWriter(sw);
|
e.printStackTrace(pw);//将出错的栈信息输出到printWriter中
|
pw.flush();
|
sw.flush();
|
return sw.toString();
|
} catch (Exception ex) {
|
return "printStackTrace()转换错误";
|
} finally {
|
if (sw != null) {
|
try {
|
sw.close();
|
} catch (IOException e1){
|
e1.printStackTrace();
|
}
|
}
|
if (pw != null) {
|
pw.close();
|
}
|
}
|
|
}
|
}
|