Commit cfb57918 hc

fix:gr手动入库过账数量计算逻辑优化

1 个父辈 95e1af92
......@@ -100,17 +100,22 @@ public class ManualGrPutInController {
@ApiOperation("缓存已过帐缓存信息")
@RequestMapping("/bindGrUdQty")
@AnonymousAccess
public ResultBean bindGrUdQty(@RequestBody GrUdNum grUdNum) throws Exception {
public ResultBean bindGrUdQty(@RequestBody GrUdNum grUdNum) {
GrUtil.updateGrUdQty(grUdNum.getCode(), grUdNum.getGrCode(), grUdNum.getGrItem(), grUdNum.getUdQty(), grUdNum.getLotQty());
return ResultBean.newOkResult(GrUtil.getGrUdQty(grUdNum.getGrCode(), grUdNum.getGrItem()));
}
@ApiOperation("缓存已过帐缓存信息")
@ApiOperation("获取过账信息")
@RequestMapping("/grUdNum")
@AnonymousAccess
public ResultBean getGrUdNum(String grCode, String grItem) throws Exception {
return ResultBean.newOkResult(
GrUtil.getGrUdQty(grCode, grItem));
public ResultBean getGrUdNum(String grCode, String grItem) {
if (StringUtils.isEmpty(grCode)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"grCode"});
}
if (StringUtils.isEmpty(grItem)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"grItem"});
}
return ResultBean.newOkResult(GrUtil.getGrUdQty(grCode, grItem));
}
@ApiOperation("获取料箱信息")
......@@ -248,6 +253,9 @@ public class ManualGrPutInController {
barcode.setBarSource(grCode);
barcode.setSeq(BoxHandleUtil.getSeq(boxBarcode,binCode)+1);
barcode.setPutInTime(System.currentTimeMillis());
// 刷新缓存中gr已过帐数量, 如果超出数量则报错
int amount = barcode.getAmount();
GrUtil.addQty(grCode, grItem, amount);
barcode = barcodeManager.save(barcode);
generatePutInTask(barcode, boxBarcode, OP_STATUS.FINISHED.name());
boxBarcode.updateSubCodes(barcode);
......@@ -258,8 +266,6 @@ public class ManualGrPutInController {
inPos.setBarcode(boxBarcode);
storagePosManager.save(inPos);
}
int amount = barcode.getAmount();
GrUtil.addQty(grCode, grItem, amount);
return ResultBean.newOkResult(BoxHandleUtil.getBoxInfo(boxStr));
} else {
log.info(barcode.getBarcode() + "不可以放到料格:" + binCode+",原因为:"+canPutIn);
......
......@@ -2,6 +2,7 @@ package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.util;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.util.DataCache;
......@@ -46,7 +47,13 @@ public class GrUtil {
dataCache.updateCache(CACHE_GR_UDQTY, cacheMap);
}
public static GrUdNum getGrUdQty(String grCode, String grItem) throws Exception {
/**
* 获取对应gr信息,如果此时本地缓存当前gr过账完成,则刷新缓存
* @param grCode
* @param grItem
* @return
*/
public static GrUdNum getGrUdQty(String grCode, String grItem) {
Map<String, GrUdNum> cacheMap = dataCache.getCache(CACHE_GR_UDQTY);
if (cacheMap == null) {
cacheMap = Maps.newConcurrentMap();
......@@ -60,7 +67,7 @@ public class GrUtil {
return grUdNum;
}
private static GrUdNum refreshGrNumFromAPI(String grCode, String grItem) throws Exception {
private static GrUdNum refreshGrNumFromAPI(String grCode, String grItem) {
Map<String, GrUdNum> cacheMap = dataCache.getCache(CACHE_GR_UDQTY);
if (cacheMap == null) {
cacheMap = Maps.newConcurrentMap();
......@@ -70,7 +77,7 @@ public class GrUtil {
//解析条码为barcode
Barcode barcode = codeResolve.resolveCode(grUdNum.getCode());
if (barcode == null) {
throw new Exception("条码无效");
throw new ValidateException("smfcore.error.barcode.invalid", "条码无效");
}
QueryGrStatusRequest request = new QueryGrStatusRequest(CommonUtil.plantCode, barcode.getProvider(), barcode.getPartNumber(), "", "");
......@@ -86,7 +93,7 @@ public class GrUtil {
}
}
if (ObjectUtil.isNull(queryGrStatusDto)) {
throw new Exception(String.format("更新 [%s] GR过账信息缓存失败", key));
throw new ValidateException("smfcore.error", "更新GR过账信息缓存失败");
}
grUdNum.setLotQty(Double.valueOf(queryGrStatusDto.getLotQty()).intValue());
grUdNum.setUdQty(Double.valueOf(queryGrStatusDto.getUdQty()).intValue());
......@@ -96,14 +103,35 @@ public class GrUtil {
return grUdNum;
}
public static synchronized void addQty(String grCode, String grItem, int count) {
public static void addQty(String grCode, String grItem, int count) {
Map<String, GrUdNum> cacheMap = dataCache.getCache(CACHE_GR_UDQTY);
if (cacheMap == null) {
cacheMap = Maps.newConcurrentMap();
}
String key = grCode + "_" + grItem;
GrUdNum grUdNum = cacheMap.get(key);
synchronized (grUdNum) {
if (canPutIn(grCode, grItem, count)) {
throw new ValidateException("smfcore.error", "正在过账的物料数量大于当前GR所需过账数量");
}
}
grUdNum.setUdQty(grUdNum.getUdQty()+count);
}
public static boolean canPutIn(String grCode, String grItem, int addCount) {
Map<String, GrUdNum> cacheMap = dataCache.getCache(CACHE_GR_UDQTY);
if (cacheMap == null) {
cacheMap = Maps.newConcurrentMap();
}
String key = grCode + "_" + grItem;
GrUdNum grUdNum = cacheMap.get(key);
synchronized (grUdNum) {
boolean canPutIn = grUdNum.getUdQty() + addCount <= grUdNum.getLotQty();
if (!canPutIn) {
refreshGrNumFromAPI(grCode, grItem);
}
return grUdNum.getUdQty() + addCount <= grUdNum.getLotQty();
}
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!