Commit bd25c3f1 zshaohui

1.工单出库 休眠10毫秒

2.入库的时候 直接保存到数据库
1 个父辈 2ef9a125
...@@ -1028,6 +1028,12 @@ public class LiteOrderCache { ...@@ -1028,6 +1028,12 @@ public class LiteOrderCache {
//9.开始挑料 //9.开始挑料
while (outReelCount < orderItem.getNeedReelCount() || outNumCount < orderItem.getNeedNum()) { while (outReelCount < orderItem.getNeedReelCount() || outNumCount < orderItem.getNeedNum()) {
try {
log.info("让当前线程休眠10毫秒");
Thread.sleep(10l);
} catch (InterruptedException e) {
e.printStackTrace();
}
//根据查询条件,查找新的库位 //根据查询条件,查找新的库位
boolean hasOutReel = false; boolean hasOutReel = false;
String warehouseCode = orderItem.getWarehouseCode(); //厂别 String warehouseCode = orderItem.getWarehouseCode(); //厂别
......
...@@ -26,6 +26,7 @@ import com.neotel.smfcore.core.order.service.po.LiteOrderItem; ...@@ -26,6 +26,7 @@ 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.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil; import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService; import com.neotel.smfcore.core.system.util.TaskService;
...@@ -61,6 +62,7 @@ import org.springframework.web.bind.annotation.RequestParam; ...@@ -61,6 +62,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -106,6 +108,9 @@ public class CDeviceController { ...@@ -106,6 +108,9 @@ public class CDeviceController {
@Autowired @Autowired
private IMessageManager messageManager; private IMessageManager messageManager;
@Autowired
private IDataLogManager dataLogManager;
@ApiOperation("获取料盘尺寸信息") @ApiOperation("获取料盘尺寸信息")
@RequestMapping("/partNumberComponent") @RequestMapping("/partNumberComponent")
...@@ -152,17 +157,18 @@ public class CDeviceController { ...@@ -152,17 +157,18 @@ public class CDeviceController {
return ResultBean.newOkResult(resultMap); return ResultBean.newOkResult(resultMap);
} }
Map<String,Object> lockMap = new ConcurrentHashMap<>();
@ApiOperation("物料放入料格") @ApiOperation("物料放入料格")
@RequestMapping("/putInMaterialBin") @RequestMapping("/putInMaterialBin")
@AnonymousAccess @AnonymousAccess
public synchronized ResultBean putInMaterialBin(@RequestBody Map<String, String> paramMap) { public ResultBean putInMaterialBin(@RequestBody Map<String, String> paramMap) {
String binCodeStr = paramMap.get("binCode"); //料格 String binCodeStr = paramMap.get("binCode"); //料格
String codeStr = paramMap.get("codeStr"); //物料条码 String codeStr = paramMap.get("codeStr"); //物料条码
String materialStr = paramMap.get("materialStr"); //料串信息 String materialStr = paramMap.get("materialStr"); //料串信息
String currentLoc = paramMap.get("currentLoc"); //当前位置 String currentLoc = paramMap.get("currentLoc"); //当前位置
log.info("物料放入料格,料格为:"+binCodeStr+",物料条码为:"+codeStr+",料串信息为:"+materialStr); log.info("物料放入料格,料格为:" + binCodeStr + ",物料条码为:" + codeStr + ",料串信息为:" + materialStr);
//判断入参是否为空 //判断入参是否为空
if (StringUtils.isEmpty(binCodeStr)) { if (StringUtils.isEmpty(binCodeStr)) {
...@@ -179,154 +185,166 @@ public class CDeviceController { ...@@ -179,154 +185,166 @@ public class CDeviceController {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
} }
//对每一个料箱进行加锁
//判断条码是否正常 String lockBoxStr = BoxHandleUtil.getBoxStr(binCodeStr, true);
Barcode barcode = null; Object lockBoxObj = lockMap.get(lockBoxStr);
try{ if (lockBoxObj == null) {
barcode = codeResolve.resolveOneValideBarcode(codeStr); lockMap.put(lockBoxStr, new Object());
}catch (ValidateException ve){
return ResultBean.newErrorResult(-1, ve.getMsgKey(), ve.getDefaultMsg());
} }
Object lockObj = lockMap.get(lockBoxStr);
synchronized (lockObj) {
//判断条码是否正常
Barcode barcode = null;
try {
barcode = codeResolve.resolveOneValideBarcode(codeStr);
} catch (ValidateException ve) {
return ResultBean.newErrorResult(-1, ve.getMsgKey(), ve.getDefaultMsg());
}
log.info("料串["+materialStr+"]上的物料["+barcode.getBarcode()+"] 准备放入料格["+binCodeStr+"]"); log.info("料串[" + materialStr + "]上的物料[" + barcode.getBarcode() + "] 准备放入料格[" + binCodeStr + "]");
//判断是否存在料箱中 //判断是否存在料箱中
if (StringUtils.isNotEmpty(barcode.getPosName())) { if (StringUtils.isNotEmpty(barcode.getPosName())) {
log.info(barcode.getBarcode() + "已经存在料格" + barcode.getPosName()); log.info(barcode.getBarcode() + "已经存在料格" + barcode.getPosName());
ResultBean resultBean = ResultBean.newErrorResult(101, "", barcode.getBarcode() + "已经存在料格" + barcode.getPosName()); ResultBean resultBean = ResultBean.newErrorResult(101, "", barcode.getBarcode() + "已经存在料格" + barcode.getPosName());
resultBean.setData(barcode.getPosName()); resultBean.setData(barcode.getPosName());
return resultBean; return resultBean;
} }
//判断是否绑定其他料串
if (!MaterialUtil.bindInfo(materialStr)) {
return ResultBean.newErrorResult(-1, "", materialStr + "没有任何绑定信息");
}
//调用禁用料信息
//barcode = smfApi.canPutInAfterResolve(barcode);
//获取库别 //判断是否绑定其他料串
String warhouseCode = MaterialUtil.getWarhouseCode(materialStr); if (!MaterialUtil.bindInfo(materialStr)) {
barcode.setWarehouseCode(warhouseCode); return ResultBean.newErrorResult(-1, "", materialStr + "没有任何绑定信息");
}
String soucre = ""; //调用禁用料信息
if (MaterialUtil.bindGr(materialStr)) { //barcode = smfApi.canPutInAfterResolve(barcode);
soucre = MaterialUtil.getBindGrInfo(materialStr).getGrCode();
}
//获取库别
String warhouseCode = MaterialUtil.getWarhouseCode(materialStr);
barcode.setWarehouseCode(warhouseCode);
//判断料格是否正常 String soucre = "";
Barcode boxBarcode = null; if (MaterialUtil.bindGr(materialStr)) {
StoragePos inPos = null; soucre = MaterialUtil.getBindGrInfo(materialStr).getGrCode();
try{
String boxStr = BoxHandleUtil.getBoxStr(binCodeStr,true);
boxBarcode = codeResolve.resolveOneValideBarcode(boxStr);
inPos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
if(inPos != null){
boxBarcode = inPos.getBarcode();
//log.error("流程异常:料箱["+boxStr+"]在库位["+inPos.getPosName()+"],但物料["+barcode.getBarcode()+"]放入了料格中");
} }
}catch (ValidateException ve){
return ResultBean.newErrorResult(-1, ve.getMsgKey(), "料格条码不正确:" + binCodeStr);
}
if(boxBarcode != null){
//判断隔口是否可以放入
if (BinCacheUtil.canPutInBinCode(binCodeStr, warhouseCode)) {
//绑定gr //判断料格是否正常
if (MaterialUtil.bindGr(materialStr)) { Barcode boxBarcode = null;
log.info(materialStr+"绑定Gr入库,barcode为:"+barcode.getBarcode()); StoragePos inPos = null;
BindGrInfo bindGrInfo = MaterialUtil.getBindGrInfo(materialStr); try {
NewLabelToCellResult cell = LuxsanApi.newLabelToCell(new NewLabelToCellRequest( String boxStr = BoxHandleUtil.getBoxStr(binCodeStr, true);
CommonUtil.plantCode, boxBarcode = codeResolve.resolveOneValideBarcode(boxStr);
Arrays.asList(bindGrInfo.getUdCode()), inPos = storagePosManager.getByBarcode(boxBarcode.getBarcode());
barcode.getAmount(), if (inPos != null) {
binCodeStr, Arrays.asList(barcode.getFullCode()) boxBarcode = inPos.getBarcode();
)); //log.error("流程异常:料箱["+boxStr+"]在库位["+inPos.getPosName()+"],但物料["+barcode.getBarcode()+"]放入了料格中");
//将GR日期设置为生产日期
Date grDate = DateUtil.getNoTimeDate(bindGrInfo.getGrDate());
barcode.setProduceDate(grDate);
barcode.setLabelId(cell.getLABEL_ID());
} }
} catch (ValidateException ve) {
return ResultBean.newErrorResult(-1, ve.getMsgKey(), "料格条码不正确:" + binCodeStr);
}
//储位移转 if (boxBarcode != null) {
else if (MaterialUtil.storTransfer(materialStr)){ //判断隔口是否可以放入
log.info(materialStr+"绑定储位移转,barcode为:"+barcode.getBarcode()); if (BinCacheUtil.canPutInBinCode(binCodeStr, warhouseCode)) {
BinMoveResult binMoveResult = LuxsanApi.binMove(new BinMoveRequest(CommonUtil.plantCode, binCodeStr, Arrays.asList(barcode.getBarcode()), barcode.getAmount(),barcode.getLabelId()));
if (StringUtils.isNotEmpty(binMoveResult.getGR_DATE())){ //绑定gr
Date grDate = DateUtil.getNoTimeDate(binMoveResult.getGR_DATE()); if (MaterialUtil.bindGr(materialStr)) {
log.info(materialStr + "绑定Gr入库,barcode为:" + barcode.getBarcode());
BindGrInfo bindGrInfo = MaterialUtil.getBindGrInfo(materialStr);
NewLabelToCellResult cell = LuxsanApi.newLabelToCell(new NewLabelToCellRequest(
CommonUtil.plantCode,
Arrays.asList(bindGrInfo.getUdCode()),
barcode.getAmount(),
binCodeStr, Arrays.asList(barcode.getFullCode())
));
//将GR日期设置为生产日期
Date grDate = DateUtil.getNoTimeDate(bindGrInfo.getGrDate());
barcode.setProduceDate(grDate); barcode.setProduceDate(grDate);
barcode.setLabelId(cell.getLABEL_ID());
} }
barcode.setLabelId(binMoveResult.getLABEL_ID());
}
//311单据转库 //储位移转
else if (MaterialUtil.ticketTransfer(materialStr)) { else if (MaterialUtil.storTransfer(materialStr)) {
log.info(materialStr+"绑定单据转库,barcode为:"+barcode.getBarcode()); log.info(materialStr + "绑定储位移转,barcode为:" + barcode.getBarcode());
TicketTransfer transfer = MaterialUtil.getTicketTransferInfo(materialStr); BinMoveResult binMoveResult = LuxsanApi.binMove(new BinMoveRequest(CommonUtil.plantCode, binCodeStr, Arrays.asList(barcode.getBarcode()), barcode.getAmount(), barcode.getLabelId()));
TicketPickRequest request = new TicketPickRequest(); if (StringUtils.isNotEmpty(binMoveResult.getGR_DATE())) {
request.setPLANT_CODE(CommonUtil.plantCode); Date grDate = DateUtil.getNoTimeDate(binMoveResult.getGR_DATE());
request.setTICKET_CODE(transfer.getTicket()); barcode.setProduceDate(grDate);
request.setTICKET_ITEM(transfer.getTicketItem()); }
request.setQTY(barcode.getAmount()); barcode.setLabelId(binMoveResult.getLABEL_ID());
request.setBIN_CODE(binCodeStr); }
List<TicketPickLabelList> labelList = new ArrayList<>();
TicketPickLabelList tickPick = new TicketPickLabelList();
tickPick.setREEL_LIST(Arrays.asList(barcode.getBarcode()));
tickPick.setLABEL_ID(barcode.getLabelId());
labelList.add(tickPick);
request.setLABEL_LIST(labelList);
LuxsanApi.ticketPick(request);
//LuxsanApi.ticketPost(new TicketPostRequest(CommonUtil.plantCode,transfer.getTicket()));
}
//单据退库上架 //311单据转库
else if (MaterialUtil.ticketReturn(materialStr)){ else if (MaterialUtil.ticketTransfer(materialStr)) {
log.info(materialStr+"绑定单据退库上架,barcode为:"+barcode.getBarcode()); log.info(materialStr + "绑定单据转库,barcode为:" + barcode.getBarcode());
TicketReturn ticketReturn = MaterialUtil.getTicketReturnInfo(materialStr); TicketTransfer transfer = MaterialUtil.getTicketTransferInfo(materialStr);
TicketUpResult ticketUp = LuxsanApi.ticketUp(new TicketUpRequest(CommonUtil.plantCode, ticketReturn.getTicket(), ticketReturn.getTicketItem(), binCodeStr, Arrays.asList(barcode.getFullCode()),barcode.getAmount())); TicketPickRequest request = new TicketPickRequest();
barcode.setLabelId(ticketUp.getLABEL_ID()); request.setPLANT_CODE(CommonUtil.plantCode);
} request.setTICKET_CODE(transfer.getTicket());
request.setTICKET_ITEM(transfer.getTicketItem());
request.setQTY(barcode.getAmount());
request.setBIN_CODE(binCodeStr);
List<TicketPickLabelList> labelList = new ArrayList<>();
TicketPickLabelList tickPick = new TicketPickLabelList();
tickPick.setREEL_LIST(Arrays.asList(barcode.getBarcode()));
tickPick.setLABEL_ID(barcode.getLabelId());
labelList.add(tickPick);
request.setLABEL_LIST(labelList);
LuxsanApi.ticketPick(request);
//LuxsanApi.ticketPost(new TicketPostRequest(CommonUtil.plantCode,transfer.getTicket()));
}
//退库上架 //单据退库上架
else if (MaterialUtil.returnTower(materialStr)){ else if (MaterialUtil.ticketReturn(materialStr)) {
log.info(materialStr+"绑定退库上架,barcode为:"+barcode.getBarcode()); log.info(materialStr + "绑定单据退库上架,barcode为:" + barcode.getBarcode());
BackToWarehouseRequest request = new BackToWarehouseRequest(); TicketReturn ticketReturn = MaterialUtil.getTicketReturnInfo(materialStr);
request.setBIN_CODE(binCodeStr); TicketUpResult ticketUp = LuxsanApi.ticketUp(new TicketUpRequest(CommonUtil.plantCode, ticketReturn.getTicket(), ticketReturn.getTicketItem(), binCodeStr, Arrays.asList(barcode.getFullCode()), barcode.getAmount()));
request.setPLANT_CODE(CommonUtil.plantCode); barcode.setLabelId(ticketUp.getLABEL_ID());
request.setRETURN_TYPE("return"); }
request.setREEL_LIST(Arrays.asList(barcode.getBarcode()));
BackToWarehouseResult result = LuxsanApi.backToWarehouse(request);
barcode.setLabelId(result.getLABEL_ID());
}
barcode.setPosName(binCodeStr); //退库上架
barcode.setWarehouseCode(warhouseCode); else if (MaterialUtil.returnTower(materialStr)) {
barcode.setBarSource(soucre); log.info(materialStr + "绑定退库上架,barcode为:" + barcode.getBarcode());
barcode.setSeq(BoxHandleUtil.getSeq(boxBarcode,binCodeStr)+1); BackToWarehouseRequest request = new BackToWarehouseRequest();
barcode.setPutInTime(System.currentTimeMillis()); request.setBIN_CODE(binCodeStr);
barcode = barcodeManager.save(barcode); request.setPLANT_CODE(CommonUtil.plantCode);
request.setRETURN_TYPE("return");
generatePutInTask(barcode, boxBarcode,OP_STATUS.FINISHED.name(),currentLoc); request.setREEL_LIST(Arrays.asList(barcode.getBarcode()));
boxBarcode.updateSubCodes(barcode); BackToWarehouseResult result = LuxsanApi.backToWarehouse(request);
boxBarcode.setAmount(boxBarcode.getAmount()+barcode.getAmount()); barcode.setLabelId(result.getLABEL_ID());
barcodeManager.save(boxBarcode); }
if(inPos != null){
//流程异常时,为保证数据一致性, pos中的box barcode也需要更新
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
kafkaService.sendMachineParameterStackerAndBox(materialStr,currentLoc,barcode.getAmount(),boxBarcode.getBarcode(),0,1); barcode.setPosName(binCodeStr);
barcode.setWarehouseCode(warhouseCode);
barcode.setBarSource(soucre);
barcode.setSeq(BoxHandleUtil.getSeq(boxBarcode, binCodeStr) + 1);
barcode.setPutInTime(System.currentTimeMillis());
log.info("料格:"+binCodeStr+"barcode:"+barcode.getBarcode()+"开始保存数据库");
barcode = barcodeManager.save(barcode);
log.info("料格:"+binCodeStr+"barcode:"+barcode.getBarcode()+"结束保存数据库");
log.info("料格:"+binCodeStr+"barcode:"+barcode.getBarcode()+"开始生成任务");
generatePutInTask(barcode, boxBarcode, OP_STATUS.FINISHED.name(), currentLoc);
boxBarcode.updateSubCodes(barcode);
boxBarcode.setAmount(boxBarcode.getAmount() + barcode.getAmount());
barcodeManager.save(boxBarcode);
if (inPos != null) {
//流程异常时,为保证数据一致性, pos中的box barcode也需要更新
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
log.info("料格:"+binCodeStr+"barcode:"+barcode.getBarcode()+"结束生成任务");
return ResultBean.newOkResult(""); kafkaService.sendMachineParameterStackerAndBox(materialStr, currentLoc, barcode.getAmount(), boxBarcode.getBarcode(), 0, 1);
log.info("料格:"+binCodeStr+"barcode:"+barcode.getBarcode()+"返回成功");
return ResultBean.newOkResult("");
}
} }
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不可以放到料格:" + binCodeStr);
} }
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不可以放到料格:" + binCodeStr);
} }
...@@ -1422,7 +1440,7 @@ public class CDeviceController { ...@@ -1422,7 +1440,7 @@ public class CDeviceController {
if (StringUtils.isNotEmpty(currentLoc)){ if (StringUtils.isNotEmpty(currentLoc)){
dataLog.setCurrentLoc(currentLoc); dataLog.setCurrentLoc(currentLoc);
} }
taskService.updateQueueTask(dataLog); dataLogManager.save(dataLog);
} }
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!