Commit 11a719d7 sunke

Http请求时添加UTF-8编码

泰治状态修正
1 个父辈 bc987b9c
正在显示 28 个修改的文件 包含 1082 行增加164 行删除
......@@ -8,6 +8,7 @@ import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Locale;
......@@ -33,7 +34,9 @@ public class ResultBean<T> {
result.setParams(params);
result.setMsg(MessageUtils.getText(msgKey, params, new Locale(SecurityUtils.getCurrentUserLanguage()), msg));
if (writeLog) {
log.info(result.getMsg());
if(Strings.isNotBlank(result.getMsg())){
log.info(result.getMsg());
}
}
return result;
}
......
......@@ -45,13 +45,21 @@ public class MainTimer {
log.info("开始加载未完成的任务...");
List<DataLog> unExecuteTasks = dataLogManager.findUnFinishedTasks();
for (DataLog unExecuteTask : unExecuteTasks) {
if (unExecuteTask.isExecuting() || unExecuteTask.isWait()) {
try {
try {
if(unExecuteTask.isPutInTask()){
//入库
taskService.addTaskToExecute(unExecuteTask);
}catch (Exception e){
log.error("初始化任务["+unExecuteTask+"]出错:"+e);
}else{
if(unExecuteTask.isWait() || unExecuteTask.isExecuting()){
taskService.addTaskToExecute(unExecuteTask);
}else{
taskService.updateFinishedTask(unExecuteTask);
}
}
}catch (Exception e){
log.error("初始化任务["+unExecuteTask+"]出错:"+e);
}
}
log.info("加载未完成的任务完成,共[" + unExecuteTasks.size() + "]条数据...");
}
......
......@@ -38,10 +38,10 @@ public class HttpHelper {
ObjectMapper mapper = new ObjectMapper();
try {
String requestBody = mapper.writeValueAsString(params);
httpPost.setEntity(new StringEntity(requestBody));
httpPost.setEntity(new StringEntity(requestBody,"utf-8"));
} catch (JsonProcessingException e) {
throw new ApiException("Request params to [" + url + "] failed:" + e.getMessage());
} catch (UnsupportedEncodingException e) {
} catch (Exception e) {
throw new ApiException("Request params to [" + url + "] failed:" + e.getMessage());
}
}
......
package com.neotel.smfcore.common.utils;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
public class JsonUtil {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
static{
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
/**
* 将对象转换成json字符串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String toJsonStr(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (Exception e) {
log.info("转换JSON字符串出错:",e);
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonStr json数据
* @param beanType 对象中的object类型
* @return
*/
public static <T> T toObj(String jsonStr, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonStr, beanType);
return t;
} catch (Exception e) {
log.info(jsonStr + "转换对象出错:",e);
}
return null;
}
/**
* 将json数据转换成对象list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonStr
* @param beanType
* @return
*/
public static <T> List<T> toList(String jsonStr, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonStr, javaType);
return list;
} catch (Exception e) {
log.info(jsonStr + "转换List出错:",e);
}
return new ArrayList<>();
}
public static Map<String, Object> toMap(String jsonStr){
//JavaType javaType = MAPPER.getTypeFactory().constructParametricType(HashMap.class, String.class, String.class);
try {
//Map<String, String> map = MAPPER.readValue(jsonStr, javaType);
Map<String, Object> map = MAPPER.readValue(jsonStr, Map.class);
return map;
} catch (Exception e) {
log.info(jsonStr + "转换Map出错:",e);
}
return new HashMap<>();
}
}
......@@ -414,4 +414,33 @@ public class StatusBean {
}
}
public int getTaiZhiStatus(){
int taiZhiStatus = 0;
if(boxStatus != null){
Collection<BoxStatusBean> boxList = boxStatus.values();
for (BoxStatusBean theBox : boxList) {
int theStatus = theBox.getStatus();
//设备状态:0:离线;1:空闲;2:急停;3:故障;4:工作中;5:调试中
if(theStatus == 1){
taiZhiStatus = 1;
}else if(theStatus == 2){
taiZhiStatus = 2;
}else if(theStatus == 3 || theStatus == 4){
taiZhiStatus = 3;
}else if(theStatus == 5){
taiZhiStatus = 5;
}else if(theStatus >= 6 && theStatus <= 11){
taiZhiStatus = 4;
}
break;
}
}
if(!Strings.isNullOrEmpty(getMsg()) && taiZhiStatus != 2){
taiZhiStatus = 3;
}
return taiZhiStatus;
}
}
......@@ -104,4 +104,9 @@ public class BOX_STATUS {
* 22 搅拌完成放回原来的仓中
*/
public final static int MIX_END = 22;
/**
* 23出库失败(放到料仓门口后,未检测到有料盘)
*/
public final static int OUT_FAILED = 23;
}
......@@ -35,6 +35,10 @@ public enum OP_STATUS {
*/
END,
/**
* 已从仓位中取出
*/
OUTBOX,
/**
* 机器人正在移栽中
*/
INROBOT,
......
......@@ -43,6 +43,7 @@ import com.neotel.smfcore.core.system.service.po.Humiture;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.taizhi.TaiZhiApi;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -224,7 +225,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
}
}
ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode());
//ReelLockPosUtil.removeReelLockPosInfo(barcodeSave.getBarcode());
return taskService.addPutInTaskToExecute(storage, barcodeSave, storagePos);
}
}
......@@ -316,7 +317,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
/**
* 从API接口验证条码是否可以入库
*/
protected Barcode verifyPutInFromApi(Barcode barcode) throws ValidateException {
public Barcode verifyPutInFromApi(Barcode barcode) throws ValidateException {
for (IOpAuthApi opAuthApi : opAuthApiList) {
Barcode responseBarcode = opAuthApi.canPutIn(barcode);
if(responseBarcode != null){
......@@ -498,7 +499,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
updatePosExecuteTime(posName,executeTime);
}
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+executeTime+"]秒");
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
//ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
DataLog cancelTask = taskService.findFinishedTask(cid, posName);
if (cancelTask != null && cancelTask.isCancel()) {
//将相同库位已经取消的任务从完成队列里删除
......@@ -665,7 +666,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
log.warn("任务:" + task.getId() + " 仓位:" + task.getPosId() + " 的 Barcode 为null, 之前可能处理过,结束任务后直接返回");
//记录日志
task.setStatus(OP_STATUS.FINISHED.name());
task.setStatus(OP_STATUS.OUTBOX.name());
taskService.updateFinishedTask(task);
return;
}
......@@ -696,7 +697,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
dataCache.updateInventory(storagePos, barcode);
//记录日志
task.setStatus(OP_STATUS.FINISHED.name());
task.setStatus(OP_STATUS.OUTBOX.name());
taskService.updateFinishedTask(task);
}
......@@ -748,6 +749,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else {
needSaveToMongo = statusBean.needSaveToMongo();
}
if(statusBean.getTaiZhiStatus() != statusBeanToSave.getTaiZhiStatus()){
TaiZhiApi.deviceStatusChange(statusBeanToSave.getCid(),statusBeanToSave.getTaiZhiStatus());
}
statusBean.setTime(System.currentTimeMillis());
Map<String, BoxStatusBean> statusOfBoxes = statusBeanToSave.getBoxStatus();
......@@ -769,12 +773,14 @@ public class BaseDeviceHandler implements IDeviceHandler {
if (statusOfBoxes != null) {
for (BoxStatusBean boxStatus : statusOfBoxes.values()) {
String humidity = boxStatus.getHumidity();
String temperature = boxStatus.getTemperature();
if (needSaveToMongo) {
TaiZhiApi.tempEnv(cid,temperature,humidity);
//保存温湿度到数据库
Humiture humiture = new Humiture();
humiture.setCid(cid);
String humidity = boxStatus.getHumidity();
String temperature = boxStatus.getTemperature();
if (!Strings.isNullOrEmpty(humidity) && !Strings.isNullOrEmpty(temperature)) {
humiture.setHumidity(humidity);
humiture.setTemperature(temperature);
......
......@@ -178,8 +178,7 @@ public class NLPShelfHandler extends BaseDeviceHandler{
}
return null;
}
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost());
......
......@@ -11,8 +11,11 @@ import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
......@@ -54,7 +57,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
statusBean.setClientIp(request.getRemoteHost());
handleMsg(statusBean);
statusBean = saveAlarmAndHumidity(statusBean);
statusBean = handleInOutFinished(statusBean);
statusBean = handleFinished(statusBean);
StatusBean humidityResult = handleHumidity(statusBean);
if (humidityResult != null) {
return humidityResult;
......@@ -63,16 +66,148 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if (statusBean.getOp() == OP.PUT_IN) {
log.debug("入库:" + statusBean.toString());
statusBean = putInLine(storage, statusBean);
//判断是否有放在门口状态的入库任务
Collection<DataLog> queueTasks = taskService.getQueueTasks();
for (DataLog queueTask : queueTasks) {
if(queueTask.getCid().equals(statusBean.getCid()) && queueTask.isPutInTask() && queueTask.isBoxdoor()){
String posId = queueTask.getPosName();
String reelId = queueTask.getBarcode();
Barcode barcode = barcodeManager.findByBarcode(reelId);
int plateW = barcode.getPlateSize();
int plateH = barcode.getHeight();
statusBean.addPosInfo(reelId, posId, plateW, plateH, false);
log.info(reelId + "[" + plateW + "x" + plateH + "]开始入库到" + storage.getCid() + "[" + posId + "]");
return statusBean;
}
}
//statusBean = putInLine(storage, statusBean);
} else {
//查看是否有要出库的操作
statusBean =findCheckOutTask(storage, statusBean);
}
return statusBean;
}
/**
* 出库处理
*/
public StatusBean findCheckOutTask(Storage storage, StatusBean statusBean) {
try {
//准备更新暂停出入库
if (dataCache.getCache(Constants.CACHE_StopOut)) {
return statusBean;
}
String cid = statusBean.getCid();
Collection<DataLog> queueTasks = taskService.getQueueTasks();
int executingOutTaskSize = 0;
DataLog outTask = null;
for (DataLog queueTask : queueTasks) {
if(queueTask.getCid().equals(cid)){
//有入库任务不分配出库任务
if(queueTask.isPutInTask()){
return statusBean;
}else{
if(queueTask.isExecuting()){
executingOutTaskSize ++;
//已经有出库任务正在执行,超过60秒仍未完成的出库再次发送到客户端
if(queueTask.needReSendToClient()){
outTask = queueTask;
log.error("cid[" + cid + "]的出库任务[" + queueTask.getPosName() + "]超过60秒仍未完成,重新发送到客户端!");
queueTask.setUpdateDate(new Date());
break;
}
}else if(queueTask.isWait()){
if (executingOutTaskSize >= 2) {
//log.error("cid["+cid + "]的BOX["+ boxId+"]的出库任务已经超过2个,不再分配!");
outTask = null;
break;
}
outTask = queueTask;
if(queueTask.isUrgentReel()){
break;
}
}
}
}
}
//没有入库任务时才处理出库
statusBean =taskService.checkOut(storage, statusBean);
if(outTask != null){
log.info("分配出库任务" + outTask.getBarcode() + "[" + outTask.getPosName() + "]到 " + cid);
outTask.setStatus(OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(outTask);
statusBean.setOp(OP.CHECKOUT);
String posName = outTask.getPosName();
Barcode codeObj = barcodeManager.findByBarcode(outTask.getBarcode());
int plateW = 0;
int plateH = 0;
if (codeObj != null) {
plateW = codeObj.getPlateSize();
plateH = codeObj.getHeight();
} else {
log.warn("出库无料仓位" + storage.getName() + "[" + posName + "]");
}
statusBean.addPosInfo(outTask.getBarcode(), posName, plateW, plateH, false);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + outTask.getBarcode() + "] 发送到客户端" + cid);
}
} catch (Exception e) {
log.error("出库出错", e);
}
return statusBean;
}
protected StatusBean handleFinished(StatusBean statusBean) {
Map<String, BoxStatusBean> statusOfBoxes = statusBean.getBoxStatus();
if (statusOfBoxes != null) {
for (BoxStatusBean boxStatus : statusOfBoxes.values()) {
try {
//出库入库完成处理
int status = boxStatus.getStatus();
String posName = boxStatus.getPosId();
int executeTime=boxStatus.getExecuteTime();
if (!Strings.isNullOrEmpty(posName)) {//客户端发一次完成之后,会发空的 posName,不需要处理
if (BOX_STATUS.IN_FINISHED == status) {//入仓完成
finishedPutIn(statusBean.getCid(),posName,executeTime);
} else if (BOX_STATUS.IN_FAILED == status) {//入库失败
//暂不处理
} else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
finishedOutPos(statusBean.getCid(),posName,executeTime);
} else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
//更改出库状态为OUT_DOOR
List<DataLog> finishedTasks = taskService.getFinishedTasks();
for (DataLog finishedTask : finishedTasks) {
if(finishedTask.getCid().equals(statusBean.getCid()) && finishedTask.isCheckOutTask() && finishedTask.isOutBox()){
if(posName.equals(finishedTask.getPosName())){
//已出仓但未放到门口,更改状态
finishedTask.setStatus(OP_STATUS.BOXDOOR.name());
taskService.updateFinishedTask(finishedTask);
log.info("物料" + finishedTask.getBarcode() + "已从库位"+ finishedTask.getPosName() + "取出放到门口");
return statusBean;
}
}
}
log.error(posName + "出库放到门口时,未找到对应的出库任务");
} else if(BOX_STATUS.OUT_FAILED == status){
log.error(posName + "出库放到门口时,未感应到料盘");
//通知
}
}
} catch (ValidateException e) {
log.error("更新状态时出错" + e.getMessage());
}
}
}
return statusBean;
}
@ApiOperation("扫码后获取库位号")
@PostMapping(value = "/service/store/robotBox/emptyPosForPutin")
@ResponseBody
......@@ -110,12 +245,10 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if (Strings.isNullOrEmpty(cids)) {
//自动获取在线的料仓列表
cidList=dataCache.getAvailableStorageIds(this.getDeviceType());
// resultMap.put("result", "101");
// resultMap.put("msg", "未指定料仓 cids ");
} else {
cidList = Lists.newArrayList();
cidList = Lists.newArrayList(cids.split(","));
}
for (String cid : cids.split(",")) {
for (String cid : cidList) {
String notIntoCids = dataCache.getSettings().getNotIntoCids();
if (notIntoCids != null) {
if (notIntoCids.contains(cid)) {
......@@ -123,25 +256,9 @@ public class RobotBoxHandler extends BaseDeviceHandler {
continue;
}
}
boolean hasOutTask = false;
//判断是否有正在执行的出库任务,有的话不能入库
Storage storage = dataCache.getStorage(cid);
if (!storage.isRobotBox()) {
Collection<DataLog> tasks = taskService.getQueueTasks();
for (DataLog task : tasks) {
if (task.isCheckOutTask() && task.getStorageId().equals(storage.getId())) {
if (task.isExecuting() || task.isBoxdoor() ) {
hasOutTask = true;
break;
}
}
}
}
if (storage != null && (!hasOutTask)) {
if (storage != null) {
storageList.add(storage);
cidList.add(cid);
}
}
if (storageList.isEmpty()) {
......@@ -149,7 +266,6 @@ public class RobotBoxHandler extends BaseDeviceHandler {
errorMsg = "无可用的料仓";
resultMap.put("msg", errorMsg);
} else {
try {
Barcode barcode = codeResolve.resolveOneValideBarcode(code);
......@@ -163,6 +279,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
resultMap.put("pos", dataLog.getPosName());
resultMap.put("barcode", barcode.getBarcode());
resultMap.put("cid", dataLog.getCid());
resultMap.put("taskId", dataLog.getId());
return resultMap;
} else {
//已有出库任务
......@@ -187,67 +304,52 @@ public class RobotBoxHandler extends BaseDeviceHandler {
resultMap.put("barcode", dataLog.getBarcode());
boolean smallReel = barcode.isSmallReel();
resultMap.put("smallReel", smallReel + "");
resultMap.put("taskId", dataLog.getId());
return resultMap;
}
// }
}
}
try{
barcode = verifyPutInFromApi(barcode);
}catch (ValidateException ex){
lineMsg = "不允许入库," + ex.getDefaultMsg();
DeviceMessageUtil.updateLineMsg(lineMsg, code, cids, "", "smfcore.linemsg.update", null);
resultMap.put("result", "107");
resultMap.put("msg", lineMsg);
return resultMap;
}
StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode, "", lastPosId);
if (pos != null) {
Storage theStorage = dataCache.getStorageById(pos.getStorageId());
resultMap.put("result", "0");
resultMap.put("msg", "");
okMsg = "[" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "]优先级[" + pos.getPriority() + "] 上个库位号[" + lastPosId + "]";
ReelLockPosInfo oldLockInfo = ReelLockPosUtil.getLockPosInfoByCode(barcode.getBarcode());
if (oldLockInfo != null) {
if (!oldLockInfo.getBarcode().equals(barcode.getBarcode())) {
String result = "-1";
okMsg = "[" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "],清理旧有锁定信息";
resultMap.put("result", result);
resultMap.put("msg", okMsg);
//已经锁定过库位,但不是同一个条码,需要把对应位置的锁定信息清理掉
ReelLockPosUtil.removeReelLockPosInfo(oldLockInfo.getBarcode());
log.info("清理锁定库位:库位号[" + oldLockInfo.getLockPosName() + "]上物料[" + oldLockInfo.getBarcode() + "]锁定的库位");
Storage storage = dataCache.getStorageById(pos.getStorageId());
//如果所在料仓有出库任务未完成,暂停入库
Collection<DataLog> tasks = taskService.getAllTasks();
for (DataLog task : tasks) {
if(task.isCheckOutTask() && task.getStorageId().equals(pos.getStorageId())){
if(!task.isFinished() && !task.isInRobot()){
errorMsg = "库位["+ pos.getPosName() + "]所在料仓有出库任务,暂停入库";
lineMsg = errorMsg;
resultMap.put("result","99");
resultMap.put("msg",errorMsg);
return resultMap;
}
}
}
log.info(okMsg + oldLockInfo);
ReelLockPosInfo reelLocInfo = new ReelLockPosInfo();
reelLocInfo.setBarcode(barcode.getBarcode());
reelLocInfo.setCid(theStorage.getCid());
reelLocInfo.setLockPosName(pos.getPosName());
reelLocInfo.setLockPosId(pos.getId());
reelLocInfo = ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, cidList);
if (reelLocInfo == null) {
errorMsg = "[" + barcode.getBarcode() + "]库位[" + reelLocInfo.getLockPosName() + "]已被锁定,暂停入库";
lineMsg = errorMsg;
resultMap.put("result", "0");
resultMap.put("msg", "ok");
DataLog newTask = taskService.addPutInTaskToExecute(storage, barcode, pos);
DeviceMessageUtil.updateLineMsg(lineMsg, code, cids, reelLocInfo.getLockPosName(), "smfcore.linemsg.posLock", new String[]{barcode.getBarcode(), reelLocInfo.getLockPosName()});
resultMap.put("result", "99");
resultMap.put("msg", errorMsg);
return resultMap;
} else {
resultMap.put("pos", pos.getPosName());
resultMap.put("barcode", barcode.getBarcode());
resultMap.put("cid", theStorage.getCid());
okMsg = "[" + barcode.getBarcode() + "]锁定库位[" + pos.getPosName() + "]优先级[" + pos.getPriority() + "] 上个库位号[" + lastPosId + "]";
//TODO 创建入库任务,状态执行中
Storage storage = dataCache.getStorageById(pos.getStorageId());
taskService.addPutInTaskToExecute(storage, barcode, pos);
}
log.info(okMsg);
resultMap.put("pos", pos.getPosName());
resultMap.put("barcode", barcode.getBarcode());
resultMap.put("cid", storage.getCid());
resultMap.put("taskId", newTask.getId());
} else {
resultMap.put("result", "104");
......@@ -297,6 +399,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
@ResponseBody
@AnonymousAccess
public ResultBean updateLocInfo(HttpServletRequest request) {
String taskId = request.getParameter("taskId");
String barcode = request.getParameter("barcode");
String statusStr = request.getParameter("status");
String locInfo = request.getParameter("locInfo");
......@@ -305,22 +408,29 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if(ObjectUtil.isEmpty(locInfo)){
locInfo=statusStr;
}
DataLog task = taskService.findTask(barcode);
if (task == null) {
DataLog opTask = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if(task.getId().equals(taskId) && task.getBarcode().equals(barcode)){
opTask = task;
break;
}
}
if (opTask == null) {
return ResultBean.newErrorResult(301, "smfcore.task.notExist", "任务不存在");
}
if (task.isFinished()) {
if (opTask.isFinished()) {
return ResultBean.newErrorResult(302, "smfcore.task.hasEnd", "任务已完成");
}
if (task.isCancel()) {
return ResultBean.newErrorResult(303, "smfcore.task.hasCancel", "更新状态时{0}的出库任务[{1}]已被取消", new String[]{task.getBarcode(), task.getId()});
}
// if (opTask.isCancel()) {
// return ResultBean.newErrorResult(303, "smfcore.task.hasCancel", "更新状态时{0}的出库任务[{1}]已被取消", new String[]{opTask.getBarcode(), opTask.getId()});
// }
statusStr = statusStr.toUpperCase();
log.info("更新料盘[" + barcode + "]的任务状态[" + task.getStatus() + "=" + task.getLocInfo() + "]为[" + statusStr + "=" + locInfo + "]");
task.setStatus(statusStr);
task.setLocInfo(locInfo);
log.info("更新料盘[" + barcode + "]的任务状态[" + opTask.getStatus() + "=" + opTask.getLocInfo() + "]为[" + statusStr + "=" + locInfo + "]");
opTask.setStatus(statusStr);
opTask.setLocInfo(locInfo);
//如果是出库任务并且放到料仓门口,需要发送任务给料仓
......@@ -341,7 +451,12 @@ public class RobotBoxHandler extends BaseDeviceHandler {
// }
// }
task = taskService.updateQueueTask(task);
if(opTask.isPutInTask()){
taskService.updateQueueTask(opTask);
}else{
taskService.updateFinishedTask(opTask);
}
return ResultBean.newOkResult("");
}
......@@ -354,14 +469,14 @@ public class RobotBoxHandler extends BaseDeviceHandler {
//TODO 先查找是否有出库任务
Collection<DataLog> datalogs = taskService.getQueueTasks();
Collection<DataLog> datalogs = taskService.getAllTasks();
//先查找已在机器人的
for (DataLog task : datalogs) {
if (task.isInRobot()) {
//获取任务失败,还有未完成的任务
return ResultBean.newErrorResult(1, "smfcore.task.lastNotEnd", "上个任务未结束{0}{1}", new String[]{task.getPosName(), task.getBarcode()});
}
}
// for (DataLog task : datalogs) {
// if (task.isInRobot()) {
// //获取任务失败,还有未完成的任务
// return ResultBean.newErrorResult(1, "smfcore.task.lastNotEnd", "上个任务未结束{0}{1}", new String[]{task.getPosName(), task.getBarcode()});
// }
// }
//查找出库已经到门口的
for (DataLog task : datalogs) {
if (task.isCheckOutTask()) {
......@@ -383,6 +498,7 @@ public class RobotBoxHandler extends BaseDeviceHandler {
taskMap.put("plateW", plateW + "");
taskMap.put("plateH", plateH + "");
taskMap.put("barcode", task.getBarcode());
taskMap.put("taskId", task.getId());
return ResultBean.newOkResult(taskMap);
}
......@@ -414,10 +530,9 @@ public class RobotBoxHandler extends BaseDeviceHandler {
if (task.isBoxdoor()) {
return ResultBean.newErrorResult(-1, "smfcore.robotBox.boxHasTask", "任务[{0}][{1}]类型{2}状态{3}", new String[]{task.getPosName(), task.getBarcode(),task.getType()+"", task.getStatus()});
}
else if(task.isPutInTask()&&task.isInRobot()){
return ResultBean.newErrorResult(-1, "smfcore.robotBox.boxHasTask", "任务[{0}][{1}]类型{2}状态{3}", new String[]{task.getPosName(), task.getBarcode(),task.getType()+"", task.getStatus()});
}
// else if(task.isPutInTask()&&task.isInRobot()){
// return ResultBean.newErrorResult(-1, "smfcore.robotBox.boxHasTask", "任务[{0}][{1}]类型{2}状态{3}", new String[]{task.getPosName(), task.getBarcode(),task.getType()+"", task.getStatus()});
// }
}
}
return ResultBean.newOkResult("");
......
......@@ -666,13 +666,12 @@ public class DataCache {
if(storage.getType().equals(deviceType.name())) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut()) {
if (bean == null || bean.timeOut() || bean.isAvailable()) {
continue;
}
if (bean.getStatus() == 1) {
//if (bean.getStatus() == 1) {
availableStorageIds.add(storage.getId());
}
//}
}
}
return availableStorageIds;
......
......@@ -128,8 +128,7 @@ public class BoxKanbanController {
}
List<DataLog> allTasks=taskService.getAllTasks();
List<BoxTaskDto> dtos=new ArrayList<>();
for (DataLog datalog :
allTasks) {
for (DataLog datalog : allTasks) {
//判断类型
if (criteria.getType() != null && (!criteria.getType().equals(datalog.getType()))) {
continue;
......@@ -150,12 +149,12 @@ public class BoxKanbanController {
Date lastUpdateTime = new Date((new Date().getTime()) - 10 * 60 * 1000);
//正常
if (criteria.getTaskStatus() == 1) {
if (lastUpdateTime.before(datalog.getUpdateDate()) && datalog.getStatus().equals(OP_STATUS.EXECUTING.name())) {
if (lastUpdateTime.before(datalog.getUpdateDate())) {
statusOk = true;
}
}//异常
else if (criteria.getTaskStatus() == 2) {
if (lastUpdateTime.after(datalog.getUpdateDate()) && datalog.getStatus().equals(OP_STATUS.EXECUTING.name())) {
if (lastUpdateTime.after(datalog.getUpdateDate()) && !datalog.getStatus().equals(OP_STATUS.WAIT.name())) {
statusOk = true;
}
}//等待
......@@ -396,14 +395,14 @@ public class BoxKanbanController {
int allcount=0;
int waitCount=0;
for (DataLog data : allTasks) {
if (data.isFinished() || data.isCancel()) {
continue;
}
// if (data.isFinished() || data.isCancel()) {
// continue;
// }
if(data.isWait()){
waitCount++;
}
//超过10分钟未更新为异常
else if (data.isAbnormal() ) {
else if (data.isAbnormal()) {
abnormal++;
} else {
normal++;
......@@ -463,7 +462,7 @@ public class BoxKanbanController {
String temperature = boxStatus.getTemperature();
boxDto.setHumidity(humidity);
boxDto.setTemperature(temperature);
boxDto.setStatus(bean.getStatus());
boxDto.setStatus(boxStatus.getStatus());
boxDto.setMsg(bean.getShowMsg(locale));
boxDto.setBarcode(bean.getCode());
boxDto.setPosName(bean.getPosId());
......
......@@ -8,10 +8,14 @@ import com.neotel.smfcore.core.message.service.manager.IMessageManager;
import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.taizhi.TaiZhiApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class DeviceMessageUtil {
......@@ -63,6 +67,8 @@ public class DeviceMessageUtil {
}
Message message=Message.newMsg(MessageType.ERROR ,storage.getName(), storage.getId(), moudle, code,msg,msgParam);
messageManager.save(message);
TaiZhiApi.onDeviceAlarm(cid,msg);
}
}
......@@ -79,7 +85,8 @@ public class DeviceMessageUtil {
Storage storage = dataCache.getStorage(cid);
if (storage != null) {
Message message=Message.newMsg(MessageType.INFO,storage.getName(), storage.getId(), moudle, "smfcore.messages.offline","离线",null);
Message message=Message.newMsg(MessageType.ERROR,storage.getName(), storage.getId(), moudle, "smfcore.messages.offline","离线",null);
TaiZhiApi.deviceStatusChange(cid,0);
messageManager.save(message);
}
......
......@@ -27,6 +27,7 @@ import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.taizhi.TaiZhiApi;
import javafx.concurrent.Task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -146,7 +147,6 @@ public class LiteOrderCache implements ITaskListener {
}
}
public ResultBean checkOutOrder(LiteOrder liteOrder) throws ValidateException {
ORDER_COLOR nextColor = getNextColor();
......@@ -280,6 +280,7 @@ public class LiteOrderCache implements ITaskListener {
}
liteOrderManager.save(order);
liteOrderMap.put(orderNo, order);
TaiZhiApi.orderStatusChange(order);
} else {
log.error("完成任务时,未找到工单[" + orderNo + "]信息");
}
......@@ -332,6 +333,7 @@ public class LiteOrderCache implements ITaskListener {
}
log.info("开始执行工单[" + orderNo + "] outBom=" + outBom);
TaiZhiApi.orderStatusChange(cacheOrder);
cacheOrder.setTaskReelCount(0);
cacheOrder.setTaskFinishedTime(-1);
cacheOrder.setFinishedReelCount(0);
......@@ -393,6 +395,10 @@ public class LiteOrderCache implements ITaskListener {
task.setSubSourceId(orderItem.getId());
task.setSubSourceInfo(orderItem.getFeederInfo());
task.setType(OP.CHECKOUT);
//jobType 任务种类:M 常规发料;P 改机发料(优先级最高)
if(cacheOrder.getJobType().equals("P")){
task.setUrgentReel(true);
}
task.setLightColor(nextColor.getRgb());
task.setStatus(OP_STATUS.WAIT.name());
// task = dataLogDao.save(task);
......@@ -429,9 +435,9 @@ public class LiteOrderCache implements ITaskListener {
*/
public Collection<String> excludePosIds() {
//排除掉正在执行的仓位
List<DataLog> allTasks = taskService.getAllTasks();
Collection<DataLog> queueTasks = taskService.getQueueTasks();
Collection<String> operatingPosIds = new HashSet<>();
for (DataLog task : allTasks) {
for (DataLog task : queueTasks) {
String posId = task.getPosId();
if (!Strings.isNullOrEmpty(posId)) {
operatingPosIds.add(task.getPosId());
......
......@@ -94,6 +94,11 @@ public class LiteOrder extends BasePo implements Serializable {
private float orderTimes = 1f;
/**
* 任务类型
*/
private String jobType = "";
/**
* 工单类型,默认1=PN,2=RI
*/
private int type=1;
......
......@@ -139,7 +139,7 @@ public class MaterialController {
@ApiOperation("物料分组界面")
@GetMapping("/labelOuput")
@PreAuthorize("@el.check('labelOuput')")
public PageData<StoragePosDto> storagePosFind(StoragePosFindCriteria criteria, Pageable pageable, HttpServletRequest request) {
public PageData<StoragePosDto> labelOuput(StoragePosFindCriteria criteria, Pageable pageable, HttpServletRequest request) {
if (ObjectUtil.isEmpty(criteria.getStorageId()) ||criteria.getStorageId().equals("0") ){
criteria.setStorageId(null);
}
......
......@@ -12,7 +12,7 @@ import java.util.List;
@Data
public class StoragePosFindCriteria {
@QueryCondition(blurry = "barcode.partNumber,barcode,posName")
@QueryCondition(blurry = "barcode.partNumber,barcode.barcode,posName")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN, propName = "barcode.putInDate")
......
package com.neotel.smfcore.core.system.api;
public class APIUtil {
}
package com.neotel.smfcore.core.system.api;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.po.DataLog;
import org.springframework.stereotype.Service;
/**
* Created by sunke on 2021/7/12.
*/
@Service
public class DefaultSMFListener implements ISMFListener {
@Override
public void onTaskStatusChange(DataLog task) {
}
@Override
public void onLiteOrderStatusChange(LiteOrder liteOrder) {
}
@Override
public Barcode canPutIn(Barcode barcode) throws ValidateException {
return null;
}
}
package com.neotel.smfcore.core.system.api;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.system.service.po.DataLog;
/**
* Created by sunke on 2021/7/12.
*/
public interface ISMFListener {
void onTaskStatusChange(DataLog task);
void onLiteOrderStatusChange(LiteOrder liteOrder);
/**
* 是否可入库验证
*/
Barcode canPutIn(Barcode barcode) throws ValidateException;
}
......@@ -248,6 +248,10 @@ public class DataLog extends BasePo implements Serializable {
return OP_STATUS.FINISHED.name().equals(status);
}
public boolean isOutBox(){
return OP_STATUS.OUTBOX.name().equals(status);
}
public boolean isWait(){
return OP_STATUS.WAIT.name().equals(status);
}
......@@ -404,7 +408,7 @@ public class DataLog extends BasePo implements Serializable {
* 判断任务是否异常,执行中,且10分钟未更新的认为异常
*/
public boolean isAbnormal(){
if(isExecuting() ){
if(isExecuting()){
if(System.currentTimeMillis() - super.getUpdateDate().getTime() > 10 * 60 * 1000){
return true;
}
......
......@@ -648,37 +648,7 @@ public class TaskService {
}
String lockPosId = ReelLockPosUtil.getReelLockPosId(barcode.getBarcode());
StoragePos pos = null;
if (!Strings.isNullOrEmpty(lockPosId)) {
//已有锁定库位
pos = storagePosManager.get(lockPosId);
if (pos != null) {
if(!storageIds.contains(pos.getStorageId())){
log.info("条码[" + barcode.getBarcode() + "]已有锁定库位[" + pos.getPosName() + "],料仓ID["+pos.getStorageId()+"]不在请求列表["+String.join(",",storageIds)+"]中,重新查找库位");
pos = null;
}
else if (pos.getW() < barcode.getPlateSize() || pos.getH() < barcode.getHeight()) {
log.info("条码[" + barcode.getBarcode() + "]尺寸已改变,无法放入已锁定库位[" + pos.getPosName() + "],重新查找库位");
pos = null;
} else {
Barcode posBarcode = pos.getBarcode();
if (posBarcode == null) {
log.info("条码[" + barcode.getBarcode() + "]已锁定库位[" + pos.getPosName() + "],返回锁定中的库位");
} else {
log.info("条码[" + barcode.getBarcode() + "]已锁定库位[" + pos.getPosName() + "]中已有物料[" + posBarcode.getBarcode() + "],重新查找库位");
pos = null;
}
}
}
}
if (pos != null) {
return pos;
}
//可用的料仓(在线,且可以放入)
List<Storage> availbleStorageList = new ArrayList<>();
......@@ -926,7 +896,7 @@ public class TaskService {
dataCache.updateInventory(storagePos, barcode);
//记录日志
task.setStatus(OP_STATUS.FINISHED.name());
task.setStatus(OP_STATUS.OUTBOX.name());
if (isCancelTask) {
task.setStatus(OP_STATUS.CANCEL.name());
}
......
......@@ -424,7 +424,7 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
}
}
}else{
log.info("没有配置PanaCIM条码检测接口,查找setConfiguration注册的IP 及端口");
//log.info("没有配置PanaCIM条码检测接口,查找setConfiguration注册的IP 及端口");
return null;
}
} catch (Exception e) {
......@@ -477,7 +477,7 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
String result = HttpHelper.postJson(inNotifyApi,params);
log.info("Response Of checkInNotification From PanaCIM:"+result);
}else{
log.info("没有配置PanaCIM接口,无需通知");
//log.info("没有配置PanaCIM接口,无需通知");
}
} catch (Exception e) {
......@@ -511,7 +511,7 @@ public class PanaApiController implements IOpAuthApi, ITaskListener{
log.info("Response Of deliverNotification From PanaCIM:"+result);
}else{
log.info("没有配置PanaCIM接口,无需通知");
//log.info("没有配置PanaCIM接口,无需通知");
}
} catch (Exception e) {
log.error("出库通知PanaCIM["+outNotifyApi+"]料盘"+task.getBarcode()+" 出错",e);
......
package com.neotel.smfcore.taizhi;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.api.CodeValidateParam;
import com.neotel.smfcore.core.device.api.IOpAuthApi;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.system.listener.ITaskListener;
import com.neotel.smfcore.core.system.service.po.DataLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
public class TaiZhiApi implements ITaskListener, IOpAuthApi {
private static TaiZhiConfig config;
@Autowired
public void setConfig(TaiZhiConfig config){
TaiZhiApi.config=config;
}
@Override
public void onTaskStatusChange(DataLog task) {
if(task.isFinished() || task.isOutBox()){
if(task.isPutInTask()){
inFinished(task);
}else{
outFinished(task);
}
}
}
/**
* 8、物料出库完成接口
* @param task
*/
private void outFinished(DataLog task) {
String outDoneUrl = config.outDoneUrl;
if(Strings.isNotBlank(outDoneUrl)){
try {
String reelId = task.getBarcode();
String deviceId = task.getCid();
String location = task.getPosName();
//"status": "状态:R:开始出库,Y:出库成功,N:出库失败",
String status = "Y";
log.info("调用物料出库完成接口deviceId="+deviceId+",reelId="+reelId+",location="+location+","+status);
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("deviceId",deviceId);
paramMap.put("location",location);
paramMap.put("reelId",reelId);
paramMap.put("status",status);
paramMap.put("outTime",task.getUpdateDate());
paramMap.put("remark","");
String result = HttpHelper.postJson(outDoneUrl,paramMap);
log.info(reelId + "物料出库完成接口返回:" +result);
} catch (ApiException e) {
log.error("调用物料出库完成接口",e);
}
}
}
/**
* 5、物料入库储位接口
* @param task
*/
private void inFinished(DataLog task){
String inLocationUrl = config.inLocationUrl;
if(Strings.isNotBlank(inLocationUrl)){
try {
String reelId = task.getBarcode();
String deviceId = task.getCid();
String location = task.getPosName();
String status = "Y";
log.info("物料入库储位接口deviceId="+deviceId+",reelId="+reelId+",location="+location+","+status);
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("deviceId",deviceId);
paramMap.put("location",location);
paramMap.put("reelId",reelId);
paramMap.put("status",status);
String result = HttpHelper.postJson(inLocationUrl,paramMap);
log.info(deviceId + "物料入库储位接口返回:" +result);
} catch (ApiException e) {
log.error("调用物料入库储位接口出错",e);
}
}
}
/**
* 1、设备报警接口
* 简要描述
* 此接口由泰治提供,当设备发生报警时,设备端调用此接口,推送报 警。
* @param deviceId
* @param alarmMsg
*/
public static void onDeviceAlarm(String deviceId, String alarmMsg) {
String deviceAlarmUrl = config.deviceAlarmUrl;
if(Strings.isNotBlank(deviceAlarmUrl)){
try {
log.info("调用设备报警接口deviceId="+deviceId+",alarmInfo="+alarmMsg);
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("deviceId",deviceId);
String encodeMsg = alarmMsg;
// try{
// encodeMsg = URLEncoder.encode(alarmMsg, "UTF-8");
// }catch (Exception e){
// log.info("转义出错",e);
// }
paramMap.put("alarmInfo",encodeMsg);
String dateTimeStr = DateUtil.toDateString(new Date(),"yyyy-MM-dd HH:mm:ss");
paramMap.put("alarmTime",dateTimeStr);
paramMap.put("remark","");
String result = HttpHelper.postJson(deviceAlarmUrl,paramMap);
log.info(deviceId + "报警接口返回:" +result);
} catch (ApiException e) {
log.error("调用设备报警接口出错",e);
}
}
}
@Override
public Barcode resolveBarcode(CodeValidateParam param) throws ValidateException {
return null;
}
/**
* 4 此接口由泰治提供,物料入库前,设备调用此接口接收信息判定物料 能否入库。
* @param barcode
* @return
* @throws ValidateException
*/
@Override
public Barcode canPutIn(Barcode barcode) throws ValidateException {
String inAssertUrl = config.inAssertUrl;
if(Strings.isNotBlank(inAssertUrl)){
try {
String reelId = barcode.getBarcode();
int w = barcode.getPlateSize();
int h = barcode.getHeight();
log.info("调用物料能否入库接口reelId="+reelId+",w="+w + ",h="+h);
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("deviceId","T01");
paramMap.put("reelId",reelId);
paramMap.put("w",w+"");
paramMap.put("h",h+"");
paramMap.put("remark","");
String result = HttpHelper.postJson(inAssertUrl,paramMap);
log.info(reelId + "入库验证接口返回:" +result);
Map<String,Object> resultMap = JsonUtil.toMap(result);
String isStorage = resultMap.get("isStorage").toString();
if(!isStorage.equalsIgnoreCase("Y")){
String msg = resultMap.get("msg").toString();
throw new ValidateException("smfcore.taizhi.inAssert.error","MES验证失败:" + msg);
}
return barcode;
} catch (ApiException e) {
log.error("调用入库验证接口出错",e);
throw new ValidateException("smfcore.taizhi.inAssert.error","MES验证失败:" + e.getMessage());
}
}
return null;
}
@Override
public boolean canCheckout(Barcode barcode) throws ValidateException {
return false;
}
@Override
public boolean isEnable() {
return true;
}
/**
* 3、设备状态推送接口
*/
public static void deviceStatusChange(String deviceId, int taiZhiStatus) {
String deviceStatusUrl = config.deviceStatusUrl;
if (Strings.isNotBlank(deviceStatusUrl)) {
try {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("deviceId", deviceId);
paramMap.put("status", taiZhiStatus +"");
String dateTimeStr = DateUtil.toDateString(new Date(),"yyyy-MM-dd HH:mm:ss");
paramMap.put("sendTime", dateTimeStr);
paramMap.put("remark", "");
String result = HttpHelper.postJson(deviceStatusUrl, paramMap);
} catch (ApiException e) {
log.error("调用设备状态推送接口", e);
}
}
}
/**
* 7、物料出库任务状态接口
*/
public static void orderStatusChange(LiteOrder liteOrder){
String outStatusUrl = config.outStatusUrl;
if (Strings.isNotBlank(outStatusUrl)) {
try {
//"status": "任务状态:Created=已创建; Executed=开始执行; Completed= 已完成; Closed=已关闭",
String orderStatus = "";
if(liteOrder.isTaskFinished()){
orderStatus = "Completed";
}else if(liteOrder.isClosed()){
orderStatus = "Closed";
}else if(liteOrder.isNew()){
orderStatus = "Created";
}else{
orderStatus = "Executed";
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("jobNo", liteOrder.getOrderNo());
paramMap.put("status", orderStatus);
paramMap.put("deviceId", liteOrder.getLine());
paramMap.put("total", liteOrder.getTaskReelCount());
paramMap.put("count", liteOrder.getFinishedReelCount());
log.info("调用物料出库任务状态接口jobNo="+liteOrder.getOrderNo()+",orderStatus="+orderStatus + ",total="+liteOrder.getTaskReelCount()+"count"+liteOrder.getTaskReelCount());
String result = HttpHelper.postJson(outStatusUrl, paramMap);
} catch (ApiException e) {
log.error("调用物料出库任务状态接口", e);
}
}
}
/**
* 9、仓储温湿度接口
*/
public static void tempEnv(String deviceId, String temp,String humidity){
String storageEnvUrl = config.storageEnvUrl;
if(Strings.isNotBlank(storageEnvUrl)){
try {
//log.info("调用温湿度接口deviceId="+deviceId+",alarmInfo="+alarmMsg);
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("deviceId",deviceId);
paramMap.put("temp",temp);
paramMap.put("humidity",humidity);
String dateTimeStr = DateUtil.toDateString(new Date(),"yyyy-MM-dd HH:mm:ss");
paramMap.put("sendTime",dateTimeStr);
paramMap.put("N2","");
String result = HttpHelper.postJson(storageEnvUrl,paramMap);
//log.info(deviceId + "报警接口返回:" +result);
} catch (ApiException e) {
log.error("调用温湿度接口出错",e);
}
}
}
}
package com.neotel.smfcore.taizhi;
import com.neotel.smfcore.core.device.util.DataCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@Service
@Slf4j
public class TaiZhiConfig {
//读取配置中的地址
@Value("${taizhi.url.deviceAlarm:}")
public String deviceAlarmUrl = "";
@Value("${taizhi.url.deviceStatus:}")
public String deviceStatusUrl = "";
/**
* 入库验证地址
*/
@Value("${taizhi.url.inAssert:}")
public String inAssertUrl = "";
/**
* 入库完成通知接口
*/
@Value("${taizhi.url.inLocation:}")
public String inLocationUrl = "";
@Value("${taizhi.url.outStatus:}")
public String outStatusUrl = "";
/**
* 出库完成通知接口
*/
@Value("${taizhi.url.outDone:}")
public String outDoneUrl = "";
/**
* 仓储温湿度接口
*/
@Value("${taizhi.url.storageEnv:}")
public String storageEnvUrl = "";
}
package com.neotel.smfcore.taizhi;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.haman.bean.BINPosInfo;
import com.neotel.smfcore.core.haman.rest.dto.BINPosDto;
import com.neotel.smfcore.core.haman.rest.mapstruct.BINPosMapper;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.security.TokenProvider;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "泰治接口")
@RequestMapping("api/taizhi")
public class TaiZhiRestController {
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
IStoragePosManager storagePosManager;
@Autowired
TaskService taskService;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private DataCache dataCache;
@ApiOperation("2 设备状态查询接口")
@PostMapping(value = "/device/status/search")
@AnonymousAccess
public Map<String,Object> statusSearch(@RequestBody Map<String,String> bodyParamMap) {
String deviceId = bodyParamMap.get("deviceId");
Map<String,Object> resultMap = Maps.newHashMap();
resultMap.put("deviceId",deviceId);
//deviceId string 设备 ID: 贴标机:L01;点料机:C01;料塔 1-1:T01-1;料塔 1-2:T01-2;料塔 1- 3;T01-3;料塔 1-4;T01-4;料塔 1-5;T01-5;料塔 1-6;T01-6;料仓:B01
//status string 设备状态:0:离线;1:空闲;2:急停;3:故障;4:工作中;5:调试中
StatusBean statusBean = DevicesStatusUtil.getStatusBean(deviceId);
int status = 0;
if(statusBean != null){
status = statusBean.getTaiZhiStatus();
}
resultMap.put("status",status+"");
return resultMap;
}
/**
*6、物料出库任务接口
* "userId": "出库人员", "jobNo": "任务编号", "jobType": "任务种类", "deviceId": "设备 ID", "count": "物料数量", "reelIds": "物料 ids"
*/
@ApiOperation("物料出库任务接口")
@PostMapping(value = "/matter/out")
@AnonymousAccess
public Map<String,Object> matterOut(@RequestBody Map<String,Object> paramMap) {
log.info("接收到TaiZhi物料出库任务:" + paramMap.toString());
String jobNo = paramMap.get("jobNo").toString();
LiteOrder dbOrder = liteOrderManager.findByOrderNo(jobNo);
if(dbOrder != null){
Map<String,Object> resultMap = Maps.newHashMap();
resultMap.put("code","501");
log.info("工单号:"+ jobNo+"对应的工单已存在");
resultMap.put("msg","工单号:"+ jobNo+"对应的工单已存在");
return resultMap;
}
String deviceId = paramMap.get("deviceId").toString();
List<LiteOrderItem> liteOrderItems = Lists.newArrayList();
JSONArray reelIds = (JSONArray) paramMap.get("reelIds");
for (Object reelId : reelIds) {
LiteOrderItem item = new LiteOrderItem();
item.setRi(reelId.toString());
item.setOrderNo(jobNo);
item.setNeedNum(1);
liteOrderItems.add(item);
}
//jobType 任务种类:M 常规发料;P 改机发料(优先级最高)
String jobType = paramMap.get("jobType").toString();
LiteOrder liteOrder = new LiteOrder(jobNo, liteOrderItems);
liteOrder.setJobType(jobType);
liteOrder.setLine(deviceId);
liteOrder = liteOrderManager.createWithItems(liteOrder);
log.info("创建工单:" + jobNo);
TaiZhiApi.orderStatusChange(liteOrder);
boolean outBom = false;
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),outBom);
Map<String,Object> resultMap = Maps.newHashMap();
resultMap.put("code","200");
resultMap.put("msg","OK");
return resultMap;
}
// private void outOrder(LiteOrder liteOrder){
//
// }
/**
* 10、异常出库接口
*/
@ApiOperation("异常出库接口")
@PostMapping(value = "/exception/out")
@AnonymousAccess
public Map<String,Object> exceptionOut(@RequestBody Map<String,String> bodyParamMap) {
String reelId = bodyParamMap.get("reelId");
log.info("收到异常出库接口指令:"+ bodyParamMap);
String code = "200";
String msg = "ok";
StoragePos storagePos = storagePosManager.getByBarcode(reelId);
if (storagePos != null) {
try {
log.info("开始执行接口清除库位[" + storagePos.getPosName() + "]" + reelId);
//Barcode barcode = storagePos.getBarcode();
taskService.addTaskToFinished(storagePos, null, "MES-clear");
} catch (Exception e) {
log.error("异常出库接口指令执行出错",e);
code = "500";
msg = "内部错误";
}
}else{
code = "401";
msg = "库存中不存在reelId="+reelId+"的物料";
}
Map<String,Object> resultMap = Maps.newHashMap();
resultMap.put("code",code);
resultMap.put("msg",msg);
return resultMap;
}
/**
* 11、出库任务中途取消接口
*/
@ApiOperation("11、出库任务中途取消接口")
@PostMapping(value = "/out/cancel")
@AnonymousAccess
public Map<String,Object> outCancel(@RequestBody Map<String,String> bodyParamMap) {
String reelId = bodyParamMap.get("reelId");
String deviceId = bodyParamMap.get("deviceId");
log.info("收到出库任务中途取消接口:"+ bodyParamMap);
List<DataLog> allTask = taskService.getAllTasks();
DataLog cancelTask = null;
for (DataLog dataLog : allTask) {
if(dataLog.isCheckOutTask() && dataLog.getBarcode().equals(reelId)){
cancelTask = dataLog;
break;
}
}
String code = "200";
String msg = "ok";
if(cancelTask != null){
if(cancelTask.isWait()){
taskService.cancelTask(cancelTask.getId());
log.info("MES接口取消等待中的任务:" + reelId);
}else{
code = "301";
msg = "出库任务取消失败:" + reelId +" 出库任务正在执行";
log.info(msg);
}
}else{
code = "404";
msg = "未找到要取消的出库任务:" + reelId;
log.info(msg);
}
Map<String,Object> resultMap = Maps.newHashMap();
resultMap.put("code",code);
resultMap.put("msg",msg);
return resultMap;
}
/**
* 12、物料储位手动同步接口(即设备库 存信息查询)
*/
@ApiOperation("12、物料储位手动同步接口")
@PostMapping(value = "/location/sync")
@AnonymousAccess
public Map<String,Object> locationSync(@RequestBody Map<String,String> bodyParamMap) {
String deviceId = bodyParamMap.get("deviceId");
log.info("物料储位手动同步接口:"+ bodyParamMap);
Map<String,Object> resultMap = Maps.newHashMap();
String statusCode = "200";
String msg = "ok";
List<Map<String,String>> data = Lists.newArrayList();
Storage storage = dataCache.getStorage(deviceId);
if(storage != null){
List<StoragePos> posList = storagePosManager.findNotEmptyByStorageId(storage.getId());
for (StoragePos pos : posList) {
Map<String,String> reelData = Maps.newHashMap();
String reelId = pos.getBarcode().getBarcode();
reelData.put("reelId",reelId);
reelData.put("location", pos.getPosName());
String putInDataStr = DateUtil.toDateString(pos.getBarcode().getPutInDate(),"yyyy-MM-dd HH:mm:ss");
reelData.put("checkInTime",putInDataStr);
String status = "S";
DataLog task = taskService.findTask(reelId);
if(task != null){
status = "W";
}
reelData.put("status",status);
data.add(reelData);
}
}
resultMap.put("statusCode",statusCode);
resultMap.put("deviceId",deviceId);
resultMap.put("data",data);
resultMap.put("msg",msg);
return resultMap;
}
/**
* 13、库存清理接口
* 此接口由设备提供,当需要清理库存数据时,泰治可调用此接口清理 物料库存(设备在清除前要判断该储位是否有实物料盘,有料盘则返 回清除失败,需先将料盘从储位取出)。
*/
@ApiOperation("13、库存清理接口")
@PostMapping(value = "/stock/clear")
@AnonymousAccess
public Map<String,Object> stockClear(@RequestBody Map<String,String> bodyParamMap) {
String deviceId = bodyParamMap.get("deviceId");
String location = bodyParamMap.get("location");
String reelId = bodyParamMap.get("reelId");
log.info("库存清理接口:"+ bodyParamMap);
Map<String,Object> resultMap = Maps.newHashMap();
String code = "200";
String msg = "ok";
StoragePos pos = storagePosManager.getByBarcode(reelId);
if(pos != null){
//物料在设备中,清理失败
code = "-1";
msg = "清除失败,料盘在库位中";
}
resultMap.put("code",code);
resultMap.put("msg",msg);
return resultMap;
}
}
taizhi:
#url:
inAssert: http://172.26.13.211:9030/device/alarm
deviceAlarm: http://172.26.13.211:9030/device/alarm
# 登录相关配置
......
taizhi:
url:
deviceAlarm: http://172.26.13.211:9030/device/alarm
deviceStatus: http://172.26.13.211:9030/device/status
inAssert: http://172.26.13.211:9030/matter/in/assert
inLocation: http://172.26.13.211:9030/matter/in/location
outStatus: http://172.26.13.211:9030/matter/out/status
outDone: http://172.26.13.211:9030/matter/out/done
storageEnv: http://172.26.13.211:9030/storage/env
server:
port: 8800
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!