Commit d46c5411 zshaohui

1.扫码灭灯功能提交

1 个父辈 174e0d21
...@@ -164,7 +164,7 @@ public class MenuInit { ...@@ -164,7 +164,7 @@ public class MenuInit {
addDefaultFunctionMenu(13, poutOut, "呆滞物料", "sluggishMaterials", "system/sluggishMaterials/index", "sMaterial"); addDefaultFunctionMenu(13, poutOut, "呆滞物料", "sluggishMaterials", "system/sluggishMaterials/index", "sMaterial");
//addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder"); //addDefaultFunctionMenu(16, poutOut,"生成工单", "createOrder", "system/createOrder/index", "createOrder");
// addDefaultFunctionMenu(91,poutOut, "共享文件夹", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU); // addDefaultFunctionMenu(91,poutOut, "共享文件夹", "orderSetting", "system/orderSetting/index", "sysSet",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(120,poutOut, "扫码灭灯", "codeLight", "neolight/codeLight/index","findOut");
//MSD管理:MSD库存.MSD追溯性.MSD设置 //MSD管理:MSD库存.MSD追溯性.MSD设置
Menu msd = Menu.CreatePMenu("MSD管理", 4, "msd", "MSD",null); Menu msd = Menu.CreatePMenu("MSD管理", 4, "msd", "MSD",null);
......
package com.neotel.smfcore.custom.zhongche1568.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShelfDto {
@ApiModelProperty("料架rfid")
private String rfid ;
@ApiModelProperty("位置")
private String loc ;
@ApiModelProperty("工单信息")
private String orderNo ;
@ApiModelProperty("物料列表")
private List<ShelfReelDto> reelList;
}
package com.neotel.smfcore.custom.zhongche1568.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ShelfReelDto implements Serializable {
@ApiModelProperty("PN")
private String pn;
@ApiModelProperty("RI")
private String ri;
@ApiModelProperty("库位号")
private String posName;
@ApiModelProperty("是否有任务")
private boolean hasTask = false;
}
package com.neotel.smfcore.custom.zhongche1568.controller;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.init.DataInitManager;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.storage.rest.dto.StorageDto;
import com.neotel.smfcore.core.storage.rest.mapstruct.StorageMapper;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
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.custom.zhongche1568.bean.dto.ShelfDto;
import com.neotel.smfcore.custom.zhongche1568.bean.dto.ShelfReelDto;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfInfo;
import com.neotel.smfcore.custom.zhongche1568.bean.shelf.ShelfLocInfo;
import com.neotel.smfcore.custom.zhongche1568.enums.ShelfStatus;
import com.neotel.smfcore.custom.zhongche1568.util.ShelfInfoUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.po.Group;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 扫码亮灯
*/
@Slf4j
@RestController
public class CodeLightController {
@Autowired
private IStorageManager storageManager;
@Autowired
private StorageMapper storageMapper;
@Autowired
private IGroupManager groupManager;
@Autowired
private ShelfInfoUtil shelfInfoUtil;
@Autowired
private TaskService taskService;
@Autowired
private CodeResolve codeResolve;
@ApiOperation("获取指定类型的料仓列表")
@GetMapping(value = "/api/storage/listByType")
public List<StorageDto> listByType(String type) {
Criteria c = Criteria.where("type").is(type);
List<Storage> storages = storageManager.findByQuery(new Query(c));
List<StorageDto> storageDtos = storageMapper.toDto(storages);
storageDtos = updateDtos(storageDtos);
return storageDtos;
}
@ApiOperation("获取扫码亮灯页面数据")
@GetMapping(value = "/rest/gree/light/reelList")
@ResponseBody
@AnonymousAccess
public List<ShelfDto> reelList(String cid) {
if (ObjectUtil.isEmpty(cid)) {
cid = "";
}
//分左右2个料架,展示
List<ShelfDto> shelfDtos = new ArrayList<>();
shelfDtos.add(new ShelfDto());
shelfDtos.add(new ShelfDto());
//获取到A/B的料架信息
Collection<ShelfInfo> allShelfInfo = shelfInfoUtil.getAllShelfInfo();
if (allShelfInfo != null && !allShelfInfo.isEmpty()) {
for (ShelfInfo shelfInfo : allShelfInfo) {
if (shelfInfo.getStatus() == ShelfStatus.reachLine) {
String currentLine = shelfInfo.getCurrentLine();
if (StringUtils.isNotEmpty(currentLine)) {
if (currentLine.startsWith(cid)) {
if (currentLine.endsWith("A")) {
ShelfDto shelfDto = shelfDtos.get(0);
shelfDto.setLoc(currentLine);
shelfDto.setOrderNo(shelfInfo.getOrderNo());
shelfDto.setRfid(shelfInfo.getShelfNo());
List<ShelfReelDto> reelList = new ArrayList<>();
Map<String, ShelfLocInfo> shelfLocInfoMap = shelfInfo.getShelfLocInfoMap();
if (shelfLocInfoMap != null && !shelfLocInfoMap.isEmpty()){
for (ShelfLocInfo info : shelfLocInfoMap.values()) {
// currentLine = currentLine.replaceAll("_A", "").replaceAll("_B", "");
String posName = cid + "_A_" + info.getLoc();
ShelfReelDto dto = new ShelfReelDto();
dto.setRi(info.getBarcode());
dto.setPn(info.getPartNumber());
dto.setPosName(posName);
boolean hasTask = hasTask(info.getBarcode());
dto.setHasTask(hasTask);
reelList.add(dto);
}
}
shelfDto.setReelList(reelList);
shelfDtos.set(0,shelfDto);
} else if (currentLine.endsWith("B")) {
ShelfDto shelfDto = shelfDtos.get(1);
shelfDto.setLoc(currentLine);
shelfDto.setOrderNo(shelfInfo.getOrderNo());
shelfDto.setRfid(shelfInfo.getShelfNo());
List<ShelfReelDto> reelList = new ArrayList<>();
Map<String, ShelfLocInfo> shelfLocInfoMap = shelfInfo.getShelfLocInfoMap();
if (shelfLocInfoMap != null && !shelfLocInfoMap.isEmpty()){
for (ShelfLocInfo info : shelfLocInfoMap.values()) {
// currentLine = currentLine.replaceAll("_A", "").replaceAll("_B", "");
String posName = cid + "_B_" + info.getLoc();
ShelfReelDto dto = new ShelfReelDto();
dto.setRi(info.getBarcode());
dto.setPn(info.getPartNumber());
dto.setPosName(posName);
boolean hasTask = hasTask(info.getBarcode());
dto.setHasTask(hasTask);
reelList.add(dto);
}
}
shelfDto.setReelList(reelList);
shelfDtos.set(1,shelfDto);
}
}
}
}
}
}
return shelfDtos;
}
@ApiOperation("扫码灭灯")
@PostMapping(value = "/rest/gree/light/lightOff")
@ResponseBody
@AnonymousAccess
public ResultBean lightOff(@RequestBody Map<String, String> mapValues, HttpServletRequest request) {
String code = mapValues.get("code");
Barcode barcode = codeResolve.resolveOneValideBarcode(code);
if (barcode == null) {
log.info("codeLed 未找到有效条码[" + code + "]");
return ResultBean.newErrorResult(99, "smfcore.error.barcode.invalid", "未找到有效条码");
}
String reelId = barcode.getBarcode();
log.info("人工输入灭灯指令,reelId为" + reelId);
//根据reelId获取到对应的料架和库位号,进行灭灯
ShelfLocInfo info = shelfInfoUtil.getShelfLocByBarcode(reelId);
if (info != null) {
String shelfNo = info.getShelfNo();
String loc = info.getLoc();
shelfInfoUtil.removeByShelfNoAndBarcode(shelfNo, reelId);
}
//判断有没有对应的任务,直接完成,发送灭灯指令
DataLog dataLog = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.isCheckOutTask() && !task.isCancel() && !task.isFinished()) {
if (task.getBarcode().equals(reelId)) {
dataLog = task;
break;
}
}
}
if (dataLog != null) {
dataLog.setStatus(OP_STATUS.FINISHED.name());
taskService.moveTaskToFinished(dataLog);
taskService.updateFinishedTask(dataLog);
//同时灭灯
DevicesStatusUtil.addOp(dataLog.getCid(), "close", dataLog.getPosName() + "=");
}
return ResultBean.newOkResult("");
}
private boolean hasTask(String barcode) {
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && (dataLog.isExecuting() || dataLog.isWait())) {
if (barcode.equals(dataLog.getBarcode())){
return true;
}
}
}
return false;
}
private List<StorageDto> updateDtos(List<StorageDto> dtoList){
for (int i=0;i<dtoList.size();i++) {
String groupId = "";
if (dtoList.get(i).getGroupId() != null && (!dtoList.get(i).getGroupId().isEmpty())) {
groupId = dtoList.get(i).getGroupId();
}
Group group = groupManager.get(groupId);
if (group != null) {
dtoList.get(i).setGroupName(group.getGroupName());
} else {
//此料仓未分组
dtoList.get(i).setGroupName("");
if (!dtoList.get(i).getGroupId().equals("")) {
storageManager.updateStorageGroup(dtoList.get(i).getId(), "");
log.info("料仓[" + dtoList.get(i).getId() + "][" + dtoList.get(i).getName() + "]的组不存在,修改组为空");
}
}
//获取设备状态,设置状态和当前任务信息
StatusBean bean = DevicesStatusUtil.getStatusBean(dtoList.get(i).getCid());
if (bean != null && bean.getBoxStatus() != null) {
dtoList.get(i).setClientIp(bean.getClientIp());
}
}
return dtoList;
}
}
...@@ -14,9 +14,7 @@ import com.neotel.smfcore.security.annotation.AnonymousAccess; ...@@ -14,9 +14,7 @@ import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -57,12 +55,12 @@ public class ZhongCheAgvController { ...@@ -57,12 +55,12 @@ public class ZhongCheAgvController {
line = line.substring(0,line.lastIndexOf("-")); line = line.substring(0,line.lastIndexOf("-"));
} }
//判断是否还有任务 //判断是否还有任务
/*boolean hasLastShelf = hasLastShelf(shelfInfo.getOrderNo()); boolean hasLastShelf = hasLastShelf(shelfInfo.getOrderNo());
try { try {
zhongcheApi.shelfFullNotification(shelfInfo, hasLastShelf); zhongcheApi.shelfFullNotification(shelfInfo, hasLastShelf);
}catch (ValidateException e){ }catch (ValidateException e){
return ResultBean.newErrorResult(-1,e.getMsgKey(),e.getMessage(),e.getMsgParam()); //return ResultBean.newErrorResult(-1,e.getMsgKey(),e.getMessage(),e.getMsgParam());
}*/ }
log.info("getShelfTargetLoc 料架 ,rfid=[" + rfid + "],目标位置:[" + line + "]"); log.info("getShelfTargetLoc 料架 ,rfid=[" + rfid + "],目标位置:[" + line + "]");
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!