Commit ce43893c 孙克

库存料格中不再保存,直接保存到料箱中

1 个父辈 0ad6690d
......@@ -35,7 +35,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(Throwable.class)
public ResponseEntity<ApiError> handleException(Throwable e){
// 打印堆栈信息
log.error(ThrowableUtil.getStackTrace(e));
log.error(e.getMessage());
return buildResponseEntity(ApiError.error(e.getMessage()));
}
......
......@@ -593,6 +593,15 @@ public class Barcode extends BasePo implements Serializable {
}
}
public void removeFromSubCodes(Barcode subCode){
if(subCodeList != null && subCodeList.size() > 0){
boolean removeOk = subCodeList.removeIf(t -> t.getBarcode().equals(subCode.getBarcode()));
if(removeOk){
setAmount(getAmount() - subCode.getAmount());
}
}
}
public void updateSubCodes(Barcode subCode) {
if (subCodeList == null) {
subCodeList = new ArrayList<>();
......
......@@ -106,12 +106,12 @@ public class CDeviceController {
@RequestMapping("/putInMaterialBin")
@AnonymousAccess
public synchronized ResultBean putInMaterialBin(@RequestBody Map<String, String> paramMap) {
String binCode = paramMap.get("binCode"); //料格
String binCodeStr = paramMap.get("binCode"); //料格
String codeStr = paramMap.get("codeStr"); //物料条码
String materialStr = paramMap.get("materialStr"); //料串信息
//判断入参是否为空
if (StringUtils.isEmpty(binCode)) {
if (StringUtils.isEmpty(binCodeStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料格信息"});
}
......@@ -130,12 +130,8 @@ public class CDeviceController {
return ResultBean.newErrorResult(-1, "", "物料条码无效");
}
//判断料格是否正常
Barcode binBarcode = codeResolve.resolveOneValideBarcode(binCode);
if (binBarcode == null) {
return ResultBean.newErrorResult(-1, "", "料格条码无效");
}
log.info("料串["+materialStr+"]上的物料["+barcode.getBarcode()+"] 放入了料箱["+binCodeStr+"]");
//判断是否存在料箱中
if (StringUtils.isNotEmpty(barcode.getPosName())) {
log.info(barcode.getBarcode() + "已经存在料格" + barcode.getPosName());
......@@ -162,47 +158,83 @@ public class CDeviceController {
}
List<Barcode> subCodeList = binBarcode.getSubCodeList();
//判断料格是否正常
Barcode boxBarcode = null;
StoragePos inPos = null;
try{
String boxStr = BoxHandleUtil.getBoxStr(binCodeStr);
boxBarcode = codeResolve.resolveOneValideBarcode(boxStr);
inPos = storagePosManager.getByBarcode(boxStr);
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){
List<Barcode> subCodeList = boxBarcode.getSubCodeList();
Barcode subCodeInBin = null;
if (subCodeList != null && !subCodeList.isEmpty()) {
Barcode subCode = subCodeList.get(0);
//找到料箱中该料格的第一个条码
for (Barcode subCodeInBox : subCodeList) {
if(subCodeInBox.getPosName().equalsIgnoreCase(binCodeStr)){
subCodeInBin = subCodeInBox;
break;
}
}
if(subCodeInBin != null){
String partNumber = barcode.getPartNumber();
String provider = barcode.getProvider();
String warehouseCode = barcode.getWarehouseCode();
if (partNumber.equals(subCode.getPartNumber())
&& provider.equals(subCode.getProvider())
&& subCode.getWarehouseCode().equals(warehouseCode)) {
if (partNumber.equals(subCodeInBin.getPartNumber())
&& provider.equals(subCodeInBin.getProvider())
&& subCodeInBin.getWarehouseCode().equals(warehouseCode)) {
//判断GR信息是否相同
log.info(barcode.getBarcode()+"当前物料的来源是:"+soucre+",料格"+binBarcode.getBarcode()+"的来源是:"+binBarcode.getBarSource());
log.info(barcode.getBarcode()+"当前物料的来源是:"+soucre+",料格"+subCodeInBin.getBarcode()+"的来源是:"+subCodeInBin.getBarSource());
if (StringUtils.isNotEmpty(soucre)){
if (!soucre.equals(binBarcode.getBarSource())){
return ResultBean.newErrorResult(-1,"",binCode+"的来源是:"+binBarcode.getBarSource()+"与当前入库的来源:"+soucre+"不一致");
if (!soucre.equals(subCodeInBin.getBarSource())){
return ResultBean.newErrorResult(-1,"",binCodeStr+"的来源是:"+subCodeInBin.getBarSource()+"与当前入库的来源:"+soucre+"不一致");
}
}
} else {
return ResultBean.newErrorResult(-1, "",
"料号:" + partNumber + ",供应商:" + provider + ",库别:" + warehouseCode
+ "与料格中的料号:" + subCode.getPartNumber() + ",供应商:" + subCode.getProvider() + "库别:" + subCode.getWarehouseCode() + "不一致");
+ "与料格中的料号:" + subCodeInBin.getPartNumber() + ",供应商:" + subCodeInBin.getProvider() + "库别:" + subCodeInBin.getWarehouseCode() + "不一致");
}
}
}
String boxStr = BoxHandleUtil.getBoxStr(binCode);
Barcode boxBarcode = codeResolve.resolveOneValideBarcode(boxStr);
//判断隔口是否可以放入
if (BinCacheUtil.canPutInBinCode(binCode, warhouseCode)) {
if (BinCacheUtil.canPutInBinCode(binCodeStr, warhouseCode)) {
if (MaterialUtil.bindGr(materialStr)){
BindGrInfo bindGrInfo = MaterialUtil.getBindGrInfo(materialStr);
LuxsanApi.newLabelToCell(new NewLabelToCellRequest(
CommonUtil.plantCode,
Arrays.asList(bindGrInfo.getUdCode()),
barcode.getAmount(),
binCode,Arrays.asList(barcode.getFullCode())
binCodeStr,Arrays.asList(barcode.getFullCode())
));
}
generatePutInTask(barcode, binBarcode, OP.PUT_IN, soucre, warhouseCode,boxBarcode);
barcode.setPosName(binCodeStr);
barcode.setWarehouseCode(warhouseCode);
barcode.setBarSource(soucre);
barcode = barcodeManager.save(barcode);
generatePutInTask(barcode, boxBarcode);
if(inPos != null){
//流程异常时,为保证数据一致性, pos中的box barcode也需要更新
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
return ResultBean.newOkResult("");
}
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不可以放到料格:" + binCode);
}
return ResultBean.newErrorResult(-1, "", barcode.getBarcode() + "不可以放到料格:" + binCodeStr);
}
......@@ -215,10 +247,10 @@ public class CDeviceController {
log.info("料箱或者料串已经放满,收到料格信息为" + binCode + ",料串信息为:" + materialStr);
Barcode barcode = codeResolve.resolveOneValideBarcode(binCode);
if (barcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{binCode});
}
//Barcode barcode = codeResolve.resolveOneValideBarcode(binCode);
//if (barcode == null) {
// throw new ValidateException("smfcore.error.barcode.invalid", "{0}不是有效的条码", new String[]{binCode});
//}
return ResultBean.newOkResult("");
}
......@@ -289,7 +321,7 @@ public class CDeviceController {
reelLocInfo.setLockPosId(pos.getId());
reelLocInfo = ReelLockPosUtil.addReelLockPosInfo(reelLocInfo, cidList);
if (reelLocInfo == null) {
return ResultBean.newErrorResult(-1, "", "[" + barcode.getBarcode() + "]库位[" + reelLocInfo.getLockPosName() + "]已被锁定,暂停入库", new String[]{});
return ResultBean.newErrorResult(-1, "", "[" + barcode.getBarcode() + "]库位锁定失败,暂停入库", new String[]{});
}
//4.生成入库任务
......@@ -336,118 +368,97 @@ public class CDeviceController {
@AnonymousAccess
public synchronized ResultBean reelCheckOut(String boxStr) {
//1.解析条码内容
Barcode binCode = codeResolve.resolveOneValideBarcode(boxStr);
//Barcode binCode = codeResolve.resolveOneValideBarcode(boxStr);
//解析料箱信息
String box = BoxHandleUtil.getBoxStr(binCode.getBarcode());
String box = BoxHandleUtil.getBoxStr(boxStr);
Barcode boxBarcode = codeResolve.resolveOneValideBarcode(box);
//2.获取要出库的code
int seq = binCode.getSeq();
Barcode barcode = null;
for (Barcode subCode : boxBarcode.getSubCodeList()) {
if (seq == subCode.getSeq() && binCode.getBarcode().equals(subCode.getPosName())) {
barcode = subCode;
break;
}
}
List<Barcode> barcodeList = new ArrayList<>();
List<Barcode> subCodeList = boxBarcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
if (binCode.getBarcode().equals(subCode.getPosName())){
barcodeList.add(subCode);
}
StoragePos inPos = storagePosManager.getByBarcode(boxStr);
if(inPos != null){
boxBarcode = inPos.getBarcode();
log.error("流程异常:料箱["+boxStr+"]在库位["+inPos.getPosName()+"],但物料从料格中出库");
}
//2.获取要出库的code
//int seq = binCode.getSeq();
//Barcode barcode = null;
// for (Barcode subCode : boxBarcode.getSubCodeList()) {
// if (seq == subCode.getSeq() && binCode.getBarcode().equals(subCode.getPosName())) {
// barcode = subCode;
// break;
// }
// }
//判断barcode是否为需要出库的
if (!barcode.isOut()){
log.info(barcode.getBarcode()+"不是要出库的料盘");
Barcode needOutBarcode = null;
for (Barcode subCode : barcodeList) {
if (subCode.isOut()){
needOutBarcode = subCode;
break;
}
}
if (needOutBarcode != null){
String orderItemId = needOutBarcode.getOrderItemId();
needOutBarcode.setOrderItemId("");
needOutBarcode.setOut(false);
log.info(needOutBarcode.getBarcode()+"需要改成不需要出库");
barcodeManager.save(needOutBarcode);
binCode.updateSubCodes(needOutBarcode);
boxBarcode.updateSubCodes(needOutBarcode);
barcode.setOut(true);
barcode.setOrderItemId(orderItemId);
log.info(barcode.getBarcode()+"改成要出库,orderItemId为:"+orderItemId);
}
}
//3.判断barcode是否为空
if (barcode == null) {
return ResultBean.newErrorResult(-1, "", "未找到可以出库的物料");
}
List<Barcode> subCodeList = boxBarcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
if (boxStr.equals(subCode.getPosName()) && subCode.isOut()){
//第一个该格口的就是要出的, 生成出库任务
//4.开始生成出库任务
log.info(barcode.getBarcode() + "从" + binCode.getBarcode() + "出库,序列号为:" + seq);
log.info(subCode.getBarcode() + "从" + boxStr + "出库");
DataLog dataLog = new DataLog(new Storage(), subCode, new StoragePos());
//4.生成出库任务
int checkType = -1;
String orderItemId = barcode.getOrderItemId();
String orderId = "";
String orderItemId = subCode.getOrderItemId();
LiteOrderItem orderItem = null;
if (StringUtils.isNotEmpty(orderItemId)) {
orderItem = liteOrderItemManager.get(orderItemId);
}
String orderNo = "";
String orderId = "";
int checkType = -1;
String pkItemId = "";
String face = "";
String brand = "";
String batchCode = "";
if (StringUtils.isNotEmpty(orderItemId)){
LiteOrderItem orderItem = liteOrderItemManager.get(orderItemId);
if (orderItem != null){
orderId = orderItem.getOrderId();
if(orderItem != null){
orderNo = orderItem.getOrderNo();
orderId = orderItem.getOrderId();
pkItemId = orderItem.getItemId();
face = orderItem.getFace();
brand = orderItem.getBrand();
if (!"N/A".equals(orderItem.getBatchCode())){
batchCode = orderItem.getBatchCode();
}
}
LiteOrder order = liteOrderManager.get(orderItem.getOrderId());
if (order != null){
checkType = order.getCheckType();
}
}
int amount = barcode.getAmount();
String posName = barcode.getPosName();
barcode.setPosName("");
barcode.setAmount(0);
binCode.setSeq(binCode.getSeq()-1);
binCode.updateSubCodes(barcode);
binCode.setAmount(binCode.getAmount() - amount);
barcodeManager.save(binCode);
binCode.setAmount(boxBarcode.getAmount() - amount);
boxBarcode.updateSubCodes(barcode);
barcodeManager.save(boxBarcode);
//TODO: barcode是否也要保存?? 24002AT这盘料未人subBarcode中清除
barcode.setAmount(amount);
DataLog dataLog = new DataLog(new Storage(), barcode, new StoragePos());
dataLog.setSubSourceId(orderItemId);
dataLog.setSourceId(orderId);
dataLog.setSourceName(orderNo);
dataLog.setType(OP.CHECKOUT);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setPosName(posName);
dataLog.setPosName(boxStr);
taskService.updateFinishedTask(dataLog);
boxBarcode.removeFromSubCodes(subCode);
barcodeManager.save(boxBarcode);
if(inPos != null){
//流程异常时,为保证数据一致性, pos中的box barcode也需要更新
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
//清理条码档案信息
subCode.setPosName("");
subCode.setOut(false);
subCode.setOrderId("");
subCode.setOrderItemId("");
subCode.setBarSource("");
barcodeManager.saveBarcode(subCode);
//通知WMS
if (checkType == LiteorderCheckType.PICKING_CHECKOUT){
LuxsanApi.pickingIssue(new PickingIssueRequest(CommonUtil.plantCode,orderNo,pkItemId,barcode.getPartNumber()
,barcode.getWarehouseCode(),brand,face,batchCode,Arrays.asList(barcode.getBarcode())));
LuxsanApi.pickingIssue(new PickingIssueRequest(CommonUtil.plantCode,orderNo,pkItemId,subCode.getPartNumber()
,subCode.getWarehouseCode(),brand,face,batchCode,Arrays.asList(subCode.getBarcode())));
}
break;
}
}
return ResultBean.newOkResult("");
......@@ -540,37 +551,21 @@ public class CDeviceController {
return barcode;
}
private void generatePutInTask(Barcode barcode, Barcode binBarcode, int type, String source, String warhouseCode,Barcode boxBarcode) {
private void generatePutInTask(Barcode barcode, Barcode boxBarcode) {
DataLog dataLog = new DataLog();
dataLog.setPosId(binBarcode.getId());
dataLog.setPosName(binBarcode.getBarcode());
dataLog.setPosId(boxBarcode.getId());
dataLog.setPosName(barcode.getPosName());
dataLog.setBarcode(barcode.getBarcode());
dataLog.setW(barcode.getPlateSize());
dataLog.setH(barcode.getHeight());
dataLog.setPartNumber(barcode.getPartNumber());
dataLog.setNum(barcode.getAmount());
dataLog.setType(type);
dataLog.setType(OP.PUT_IN);
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setBatchInfo(barcode.getBatch());
dataLog.setSourceName(source);
dataLog.setWarehouseCode(warhouseCode);
int seq = binBarcode.getSeq();
seq = seq + 1;
barcode.setSeq(seq);
barcode.setWarehouseCode(warhouseCode);
barcode.setPosName(binBarcode.getBarcode());
barcode = barcodeManager.save(barcode);
binBarcode.setSeq(seq);
binBarcode.setWarehouseCode(warhouseCode);
binBarcode.setAmount(binBarcode.getAmount()+barcode.getAmount());
binBarcode.setBarSource(source);
binBarcode.updateSubCodes(barcode);
barcodeManager.save(binBarcode);
dataLog.setSourceName(barcode.getBarSource());
dataLog.setWarehouseCode(barcode.getWarehouseCode());
boxBarcode.updateSubCodes(barcode);
boxBarcode.setAmount(boxBarcode.getAmount()+barcode.getAmount());
......
......@@ -21,7 +21,7 @@ public class BinCacheUtil {
private static DataCache dataCache;
private static long binCodeUpdateTime = 0l;
private static long binCodeUpdateTime = 0L;
@Autowired
private void setDataCache(DataCache cache){
......@@ -30,7 +30,7 @@ public class BinCacheUtil {
public static boolean canPutInBinCode(String binCode, String warehouseCode) {
Map<String, String> cacheMap = new HashMap<>();
if (binCodeUpdateTime == 0l || (System.currentTimeMillis() - binCodeUpdateTime >= 1000 * 60 * 60)) {
if (binCodeUpdateTime == 0L || (System.currentTimeMillis() - binCodeUpdateTime >= 1000 * 60 * 60)) {
List<QueryBinResult> resultList = LuxsanApi.queryBin(new QueryBinRequest(CommonUtil.plantCode, BinEnum.STORAGE_TYPE_C, BinEnum.BIN_STATUS_0, warehouseCode));
for (QueryBinResult result : resultList) {
cacheMap.put(result.getBIN_CODE(), result.getWAREHOUSE_CODE());
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!