Commit 1c6c8e84 LN

盘点修改:增加异常库位处理功能。

1 个父辈 67329427
......@@ -103,7 +103,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
@Autowired
protected IComponentManager componentManager;
@Autowired
private ISelfAuditManager selfAuditManager;
private SelfAuditUtil selfAuditUtil;
@Autowired
private IInOutDataManager inOutDataManager;
......@@ -183,25 +183,20 @@ public class BaseDeviceHandler implements IDeviceHandler {
protected StatusBean handleSelfAudit(StatusBean statusBean) {
try {
String batchNo = dataCache.getCache(Constants.CACHE_SELFAUDIT_BATCHNO);
if (ObjectUtil.isNotEmpty(batchNo)) {
//盘点是否暂停
SelfAudit selfAudit = SelfAuditUtil.getSelfAudit(batchNo);
if (selfAudit == null) {
selfAudit = selfAuditManager.findByBatchNo(batchNo);
if(selfAudit!=null){
SelfAuditUtil.updateShelfAudit(selfAudit);
}
}
if (selfAudit != null) {
Storage storage = dataCache.getStorage(statusBean.getCid());
if (storage != null && selfAudit.getStorageIds().contains(storage.getId())){
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.NEW.name()) || selfAudit.getStatus().equals(SELFAUDIT_STATUS.EXECUTING.name())) {
statusBean.addData("selfAudit", batchNo);
}
//盘点是否暂停
SelfAudit selfAudit = selfAuditUtil.getCurrSelfAudit();
if (selfAudit != null) {
Storage storage = dataCache.getStorage(statusBean.getCid());
if (storage != null && selfAudit.getStorageIds().contains(storage.getId())) {
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.NEW.name()) || selfAudit.getStatus().equals(SELFAUDIT_STATUS.EXECUTING.name())) {
statusBean.addData("selfAudit", selfAudit.getBatchNo());
}
//如果是已结束等待处理
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.END.name())) {
statusBean.addData("selfAuditException", "true");
}
}
}
} catch (Exception ex) {
......
......@@ -20,7 +20,7 @@ public enum SELFAUDIT_STATUS {
FINISHED,
/**
* 已结束,未完成手动结束
* 已结束,库位有异常,需要处理后完成
*/
END;
......
......@@ -50,23 +50,21 @@ public class SelfAuditDeviceController {
private ISelfAuditItemManager selfAuditItemManager;
@Autowired
private CodeResolve codeResolve;
@Autowired
private SelfAuditUtil selfAuditUtil;
private SelfAudit getCurrObj(){
private SelfAudit getCurrObj() {
//获取当前的盘点信息
String batchNo = dataCache.getCache(Constants.CACHE_SELFAUDIT_BATCHNO);
if (ObjectUtil.isNotEmpty(batchNo)) {
SelfAudit selfAudit = SelfAuditUtil.getSelfAudit(batchNo);
if (selfAudit == null) {
selfAudit = selfAuditManager.findByBatchNo(batchNo);
}
//如果已结束
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.END.name()) || selfAudit.getStatus().equals(SELFAUDIT_STATUS.FINISHED.name())) {
log.info("从dataCache删除已完成的盘点批次号:" + batchNo + " ");
dataCache.updateCache(Constants.CACHE_SELFAUDIT_BATCHNO, "");
return null;
}
SelfAudit selfAudit = selfAuditUtil.getCurrSelfAudit();
if (selfAudit != null) {
// //如果已结束
// if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.FINISHED.name())) {
// log.info("从dataCache删除已完成的盘点批次号:" + selfAudit.getBatchNo() + " ");
// dataCache.updateCache(Constants.CACHE_SELFAUDIT_BATCHNO, "");
// return null;
// }
return selfAudit;
}
......@@ -127,6 +125,7 @@ public class SelfAuditDeviceController {
for (SelfAuditItem item :
items) {
if (item.getPosName().equals(posName)) {
findOk=true;
log.info(" 盘点["+selfAudit.getBatchNo()+"]库位出库成功:posName["+item.getPosName()+"]barcode["+item.getBarcode()+"],自动生成出库任务,清空库位");
StoragePos storagePos = storagePosManager.getByPosName(posName);
......@@ -158,7 +157,11 @@ public class SelfAuditDeviceController {
}
if(findOk){
selfAudit.setItems(newItems);
SelfAuditUtil.updateShelfAudit(selfAudit);
//更改自检状态
if(selfAudit.getStatus().equals(SELFAUDIT_STATUS.NEW.name())){
selfAudit.setStatus(SELFAUDIT_STATUS.EXECUTING.name());
}
selfAuditUtil.updateShelfAudit(selfAudit);
return ResultBean.newOkResult("ok");
}
log.error("盘点:posOutEnd:posName=["+posName+"]:未找到库位的盘点信息");
......@@ -194,23 +197,59 @@ public class SelfAuditDeviceController {
StoragePos storagePos = storagePosManager.getByPosName(posName);
if (storagePos != null) {
try {
if(ObjectUtil.isNotEmpty(barcode)&&barcode.equals(actualBarcode)){
Barcode barcode1=codeResolve.resolveOneValideBarcode(barcode);
if(barcode1!=null){
log.info("盘点入库完成,条码一致,自动生成入库任务,更新库位[" + storagePos.getPosName() + "]");
taskService.addTaskToFinished(storagePos,barcode1,"selfAudit");
if(ObjectUtil.isNotEmpty(barcode) ){
if(barcode.equals(actualBarcode)) {
//物料一致
Barcode barcodeIn = codeResolve.resolveOneValideBarcode(barcode);
if (barcodeIn != null) {
log.info("盘点入库完成,条码一致,自动生成入库任务,更新库位[" + storagePos.getPosName() + "]=[" + barcodeIn.getBarcode() + "]");
taskService.addTaskToFinished(storagePos, barcodeIn, "selfAudit");
}
}else if(ObjectUtil.isNotEmpty(actualBarcode)){
//物料不一致 优先实际条码入库
Barcode barcodeIn=codeResolve.resolveOneValideBarcode(actualBarcode);
if(barcodeIn!=null){
log.info("盘点入库完成,物料不一致,自动生成实际条码入库任务,更新库位[" + storagePos.getPosName() + "]=["+barcodeIn.getBarcode()+"]");
taskService.addTaskToFinished(storagePos,barcodeIn,"selfAudit");
}else{
barcodeIn=codeResolve.resolveOneValideBarcode(barcode);
if(barcodeIn!=null){
log.info("盘点入库完成,条码一致,实际条码解析失败,自动生成原条码入库任务,更新库位[" + storagePos.getPosName() + "]=["+barcodeIn.getBarcode()+"]");
taskService.addTaskToFinished(storagePos,barcodeIn,"selfAudit");
}
}
}else{
//库存有料,实际没料
}
} else if(ObjectUtil.isNotEmpty(actualBarcode)){
//库存没料,实际有料
//物料不一致 优先实际条码入库
Barcode barcodeIn=codeResolve.resolveOneValideBarcode(actualBarcode);
if(barcodeIn!=null){
log.info("盘点入库完成,库存没料,实际有料,自动生成实际条码入库任务,更新库位[" + storagePos.getPosName() + "]=["+barcodeIn.getBarcode()+"]");
taskService.addTaskToFinished(storagePos,barcodeIn,"selfAudit");
}else{
log.error("盘点入库完成,库存没料,实际有料,实际条码解析失败,生成入库任务失败,库位[" + storagePos.getPosName() + "]库存仍为空");
}
}
//TODO
//TODO 如果原来有料,默认增加一条入库任务
} catch (Exception e) {
throw new ValidateException("smfcore.error", "出错{0}", new String[]{e.toString()});
//只打印提示信息,还需要继续执行
log.error("盘点[" + selfAudit.getBatchNo() + "]库位入库完成:posName[" + item.getPosName() + "]处理出错:"+e.toString());
// throw new ValidateException("smfcore.error", "出错{0}", new String[]{e.toString()});
}
}
item.setActualBarcode(actualBarcode);
item.setItemStatus(2);
//如果异常,改为3,否则改为2
if(barcode.equals(actualBarcode)){
item.setItemStatus(2);
}else{
item.setItemStatus(3);
}
selfAuditItemManager.save(item);
}
newItems.add(item);
......@@ -219,12 +258,27 @@ public class SelfAuditDeviceController {
selfAudit.setItems(newItems);
selfAudit.setEndItemNum(selfAudit.getEndItemNum()+1);
if(selfAudit.getEndItemNum()>=selfAudit.getTotalItemNum()){
selfAudit.setStatus(SELFAUDIT_STATUS.FINISHED.name());
log.info(" 盘点[" + selfAudit.getBatchNo() + "] 已完成库位数[" + selfAudit.getEndItemNum() + "]总库位数[" + selfAudit.getTotalItemNum() + "],更改盘点状态为已完成");
boolean hasE=false;
//判断是否有异常
for (SelfAuditItem item :
newItems) {
if(item.getItemStatus()==3){
hasE=true;
break;
}
}
if(hasE){
selfAudit.setStatus(SELFAUDIT_STATUS.END.name());
log.info(" 盘点[" + selfAudit.getBatchNo() + "] 已完成库位数[" + selfAudit.getEndItemNum() + "]总库位数[" + selfAudit.getTotalItemNum() + "],存在异常库位,更改盘点状态为完成,等待处理异常库位");
}else{
selfAudit.setStatus(SELFAUDIT_STATUS.FINISHED.name());
log.info(" 盘点[" + selfAudit.getBatchNo() + "] 已完成库位数[" + selfAudit.getEndItemNum() + "]总库位数[" + selfAudit.getTotalItemNum() + "],更改盘点状态为已结束");
}
}
selfAuditManager.save(selfAudit);
SelfAuditUtil.updateShelfAudit(selfAudit);
// selfAuditManager.save(selfAudit);
selfAuditUtil.updateShelfAudit(selfAudit);
return ResultBean.newOkResult("ok");
}
log.info("盘点:posSelfAuditEnd:posName=[" + posName + "],barcode=[" + barcode + "],actualBarcode=[" + actualBarcode + "]:未找到库位的盘点信息");
......
......@@ -29,6 +29,6 @@ public class SelfAuditItemDto implements Serializable {
@ApiModelProperty("实际条码")
private String actualBarcode;
@ApiModelProperty("0=等待中,1=出库完成,2=盘点完成")
@ApiModelProperty("盘点状态 0=等待中,1=出库完成,2=入库完成,3=数据异常待处理,4=异常已处理")
private int itemStatus=0;
}
......@@ -46,7 +46,7 @@ public class SelfAuditItem extends BasePo implements Serializable {
*/
private String actualBarcode;
/**
* 盘点状态 0=等待中,1=出库完成,2=盘点完成
* 盘点状态 0=等待中,1=出库完成,2=入库完成,3=数据异常待处理,4=异常已处理
*/
private int itemStatus=0;
......
package com.neotel.smfcore.core.selfAudit.util;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.selfAudit.enums.SELFAUDIT_STATUS;
import com.neotel.smfcore.core.selfAudit.service.manager.ISelfAuditItemManager;
import com.neotel.smfcore.core.selfAudit.service.manager.ISelfAuditManager;
import com.neotel.smfcore.core.selfAudit.service.po.SelfAudit;
import com.neotel.smfcore.core.selfAudit.service.po.SelfAuditItem;
import com.neotel.smfcore.core.system.service.po.DataLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Service
public class SelfAuditUtil {
@Autowired
private DataCache dataCache;
@Autowired
private ISelfAuditManager selfAuditManager;
@Autowired
private ISelfAuditItemManager selfAuditItemManager;
public static String createBatchNo() {
Date date = new Date();
String dateStr = DateUtil.toDateString(date, "yyyyMMddHHmm");
return "NO" + dateStr;
}
private static Map<String, SelfAudit> selfAuditMap=new ConcurrentHashMap<>();
private Map<String, SelfAudit> selfAuditMap=new ConcurrentHashMap<>();
public static SelfAudit getSelfAudit(String batchNo){
if(selfAuditMap==null){
selfAuditMap=new HashMap<>();
public SelfAudit getSelfAudit(String batchNo) {
if (selfAuditMap == null) {
selfAuditMap = new HashMap<>();
}
SelfAudit selfAudit = selfAuditMap.get(batchNo);
if (selfAudit == null) {
selfAudit = selfAuditManager.findByBatchNo(batchNo);
if (selfAudit != null) {
updateCache(selfAudit);
}
}
return selfAuditMap.get(batchNo);
return selfAudit;
}
/**
* 更新数据库,更新缓存
* @param selfAudit
*/
public void updateShelfAudit(SelfAudit selfAudit) {
selfAuditManager.save(selfAudit);
selfAuditMap.put(selfAudit.getBatchNo(), selfAudit);
}
/**
* 更新缓存
* @param selfAudit
*/
public void updateCache(SelfAudit selfAudit) {
selfAuditMap.put(selfAudit.getBatchNo(), selfAudit);
}
public SelfAudit getCurrSelfAudit() {
String batchNo = dataCache.getCache(Constants.CACHE_SELFAUDIT_BATCHNO);
if (ObjectUtil.isNotEmpty(batchNo)) {
SelfAudit selfAudit = getSelfAudit(batchNo);
if (selfAudit != null) {
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.FINISHED.name())) {
log.info("从dataCache删除已完成的盘点批次号:" + selfAudit.getBatchNo() + " ");
dataCache.updateCache(Constants.CACHE_SELFAUDIT_BATCHNO, "");
return null;
}
}
return selfAudit;
public static void updateShelfAudit(SelfAudit selfAudit){
selfAuditMap.put(selfAudit.getBatchNo(),selfAudit);
}
return null;
}
public void onTaskStatusChange(DataLog task) {
try {
//只有出库任务才需要处理
if (task.isFinished() && task.isCheckOutTask()) {
finishedOutTask(task);
}
} catch (Exception e) {
log.error("更新判断任务状态出错", e);
}
}
private void finishedOutTask(DataLog task) {
try {
//盘点是否暂停
SelfAudit selfAudit = getCurrSelfAudit();
if (selfAudit != null) {
//如果是已结束等待处理
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.END.name())) {
String posName = task.getPosName();
//自动生成出库任务
List<SelfAuditItem> newItems = new ArrayList<>();
boolean findOk = false;
for (SelfAuditItem item :
selfAudit.getItems()) {
if (item.getItemStatus() == 3 && item.getPosName().equals(posName)) {
//判断是否有异常的料
item.setItemStatus(4);
selfAuditItemManager.save(item);
log.info("处理盘点批次【" + selfAudit.getBatchNo() + "】, 仓位【" + posName + "】 出库任务执行完成,更改状态为4");
findOk = true;
}
newItems.add(item);
}
//判断是否完成
if (findOk) {
selfAudit.setItems(newItems);
//判断是否有异常
for (SelfAuditItem item : newItems) {
if (item.getItemStatus() == 3) {
return;
}
}
selfAudit.setStatus(SELFAUDIT_STATUS.FINISHED.name());
log.info(" 盘点[" + selfAudit.getBatchNo() + "] 已全部处理完成 更改盘点状态为已结束");
// selfAuditManager.save(selfAudit);
updateShelfAudit(selfAudit);
}
}
}
} catch (Exception ex) {
log.error("handleSelfAudit error:" + ex.getMessage());
}
}
}
......@@ -20,6 +20,7 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.selfAudit.util.SelfAuditUtil;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
......@@ -54,6 +55,8 @@ public class TaskService {
protected LiteOrderCache liteOrderCache;
@Autowired
protected SelfAuditUtil selfAuditUtil;
@Autowired
private SmfApi smfApi;
/**
......@@ -153,6 +156,7 @@ public class TaskService {
private void tiggerTaskChangeListener(DataLog task) {
liteOrderCache.onTaskStatusChange(task);
smfApi.onTaskStatusChange(task);
selfAuditUtil.onTaskStatusChange(task);
}
/**
......
......@@ -352,6 +352,7 @@ smfcore.mesApi.loginCheck.fail=MES\u767B\u9646\u9A8C\u8BC1\u5931\u8D25
smfcore.mesApi.loginCheck.error=MES\u767B\u9646\u9A8C\u8BC1\u9519\u8BEF\uFF1A{0}
smfcore.lockMaterials=\u9501\u5B9A\u7269\u6599
smfcore.storage.error.posNameExist=\u5E93\u4F4D\u53F7\u5DF2\u5728\u5176\u4ED6\u6599\u4ED3\u5B58\u5728\uFF1A{0}
smfcore.selfAudit.hasOutTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
......@@ -350,4 +350,5 @@ smfcore.mesApi.inCheck.error=MES verification error\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES Login fail
smfcore.mesApi.loginCheck.error=MES Login error\uFF1A{0}
smfcore.lockMaterials=Locking Materials
smfcore.storage.error.posNameExist=Bin number already exists in other bins\uFF1A{0}
\ No newline at end of file
smfcore.storage.error.posNameExist=Bin number already exists in other bins\uFF1A{0}
smfcore.selfAudit.hasOutTask=The location [{0}] already has a release task
\ No newline at end of file
......@@ -347,4 +347,5 @@ smfcore.mesApi.inCheck.error=MES\u9A8C\u8BC1\u51FA\u9519\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES\u767B\u9646\u9A8C\u8BC1\u5931\u8D25
smfcore.mesApi.loginCheck.error=MES\u767B\u9646\u9A8C\u8BC1\u9519\u8BEF\uFF1A{0}
smfcore.lockMaterials=\u9501\u5B9A\u7269\u6599
smfcore.storage.error.posNameExist=\u5E93\u4F4D\u53F7\u5DF2\u5728\u5176\u4ED6\u6599\u4ED3\u5B58\u5728\uFF1A{0}
\ No newline at end of file
smfcore.storage.error.posNameExist=\u5E93\u4F4D\u53F7\u5DF2\u5728\u5176\u4ED6\u6599\u4ED3\u5B58\u5728\uFF1A{0}
smfcore.selfAudit.hasOutTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1
\ No newline at end of file
......@@ -347,4 +347,5 @@ smfcore.mesApi.inCheck.error=MES\u9A8C\u8BC1\u51FA\u9519\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES\u767B\u9646\u9A8C\u8BC1\u5931\u8D25
smfcore.mesApi.loginCheck.error=MES\u767B\u9646\u9A8C\u8BC1\u9519\u8BEF\uFF1A{0}
smfcore.lockMaterials=\u9501\u5B9A\u7269\u6599
smfcore.storage.error.posNameExist=\u5E93\u4F4D\u53F7\u5DF2\u5728\u5176\u4ED6\u6599\u4ED3\u5B58\u5728\uFF1A{0}
\ No newline at end of file
smfcore.storage.error.posNameExist=\u5E93\u4F4D\u53F7\u5DF2\u5728\u5176\u4ED6\u6599\u4ED3\u5B58\u5728\uFF1A{0}
smfcore.selfAudit.hasOutTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1
\ No newline at end of file
......@@ -348,4 +348,5 @@ smfcore.mesApi.inCheck.error=MES\u9A57\u8B49\u51FA\u932F\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES\u767B\u9678\u9A57\u8B49\u5931\u6557
smfcore.mesApi.loginCheck.error=MES\u767B\u9678\u9A57\u8B49\u932F\u8AA4\uFF1A{0}
smfcore.lockMaterials=\u9396\u5B9A\u7269\u6599
smfcore.storage.error.posNameExist=\u5EAB\u4F4D\u865F\u5DF2\u5728\u5176\u4ED6\u6599\u5009\u5B58\u5728\uFF1A{0}
\ No newline at end of file
smfcore.storage.error.posNameExist=\u5EAB\u4F4D\u865F\u5DF2\u5728\u5176\u4ED6\u6599\u5009\u5B58\u5728\uFF1A{0}
smfcore.selfAudit.hasOutTask=\u5EAB\u4F4D[{0}]\u5DF2\u6709\u51FA\u5EAB\u4EFB\u52D9
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!