Commit bb3bf610 LN

盘点功能修改,增加盘点处理操作

1 个父辈 76a758e3
...@@ -103,7 +103,7 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -103,7 +103,7 @@ public class BaseDeviceHandler implements IDeviceHandler {
@Autowired @Autowired
protected IComponentManager componentManager; protected IComponentManager componentManager;
@Autowired @Autowired
private ISelfAuditManager selfAuditManager; private SelfAuditUtil selfAuditUtil;
@Autowired @Autowired
private IInOutDataManager inOutDataManager; private IInOutDataManager inOutDataManager;
...@@ -183,25 +183,20 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -183,25 +183,20 @@ public class BaseDeviceHandler implements IDeviceHandler {
protected StatusBean handleSelfAudit(StatusBean statusBean) { protected StatusBean handleSelfAudit(StatusBean statusBean) {
try { 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);
}
}
//盘点是否暂停
SelfAudit selfAudit = selfAuditUtil.getCurrSelfAudit();
if (selfAudit != null) { if (selfAudit != null) {
Storage storage = dataCache.getStorage(statusBean.getCid()); Storage storage = dataCache.getStorage(statusBean.getCid());
if (storage != null && selfAudit.getStorageIds().contains(storage.getId())){ if (storage != null && selfAudit.getStorageIds().contains(storage.getId())) {
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.NEW.name()) || selfAudit.getStatus().equals(SELFAUDIT_STATUS.EXECUTING.name())) { if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.NEW.name()) || selfAudit.getStatus().equals(SELFAUDIT_STATUS.EXECUTING.name())) {
statusBean.addData("selfAudit", batchNo); statusBean.addData("selfAudit", selfAudit.getBatchNo());
} }
//如果是已结束等待处理
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.END.name())) {
statusBean.addData("selfAuditException", "true");
} }
} }
} }
} catch (Exception ex) { } catch (Exception ex) {
......
...@@ -20,7 +20,7 @@ public enum SELFAUDIT_STATUS { ...@@ -20,7 +20,7 @@ public enum SELFAUDIT_STATUS {
FINISHED, FINISHED,
/** /**
* 已结束,未完成手动结束 * 已结束,库位有异常,需要处理后完成
*/ */
END; END;
......
...@@ -50,23 +50,21 @@ public class SelfAuditDeviceController { ...@@ -50,23 +50,21 @@ public class SelfAuditDeviceController {
private ISelfAuditItemManager selfAuditItemManager; private ISelfAuditItemManager selfAuditItemManager;
@Autowired @Autowired
private CodeResolve codeResolve; 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);
}
//如果已结束 SelfAudit selfAudit = selfAuditUtil.getCurrSelfAudit();
if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.END.name()) || selfAudit.getStatus().equals(SELFAUDIT_STATUS.FINISHED.name())) { if (selfAudit != null) {
log.info("从dataCache删除已完成的盘点批次号:" + batchNo + " "); // //如果已结束
dataCache.updateCache(Constants.CACHE_SELFAUDIT_BATCHNO, ""); // if (selfAudit.getStatus().equals(SELFAUDIT_STATUS.FINISHED.name())) {
return null; // log.info("从dataCache删除已完成的盘点批次号:" + selfAudit.getBatchNo() + " ");
} // dataCache.updateCache(Constants.CACHE_SELFAUDIT_BATCHNO, "");
// return null;
// }
return selfAudit; return selfAudit;
} }
...@@ -158,7 +156,7 @@ public class SelfAuditDeviceController { ...@@ -158,7 +156,7 @@ public class SelfAuditDeviceController {
} }
if(findOk){ if(findOk){
selfAudit.setItems(newItems); selfAudit.setItems(newItems);
SelfAuditUtil.updateShelfAudit(selfAudit); selfAuditUtil.updateShelfAudit(selfAudit);
return ResultBean.newOkResult("ok"); return ResultBean.newOkResult("ok");
} }
log.error("盘点:posOutEnd:posName=["+posName+"]:未找到库位的盘点信息"); log.error("盘点:posOutEnd:posName=["+posName+"]:未找到库位的盘点信息");
...@@ -238,7 +236,13 @@ public class SelfAuditDeviceController { ...@@ -238,7 +236,13 @@ public class SelfAuditDeviceController {
} }
item.setActualBarcode(actualBarcode); item.setActualBarcode(actualBarcode);
//如果异常,改为3,否则改为2
if(barcode.equals(actualBarcode)){
item.setItemStatus(2); item.setItemStatus(2);
}else{
item.setItemStatus(3);
}
selfAuditItemManager.save(item); selfAuditItemManager.save(item);
} }
newItems.add(item); newItems.add(item);
...@@ -247,12 +251,27 @@ public class SelfAuditDeviceController { ...@@ -247,12 +251,27 @@ public class SelfAuditDeviceController {
selfAudit.setItems(newItems); selfAudit.setItems(newItems);
selfAudit.setEndItemNum(selfAudit.getEndItemNum()+1); selfAudit.setEndItemNum(selfAudit.getEndItemNum()+1);
if(selfAudit.getEndItemNum()>=selfAudit.getTotalItemNum()){ if(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()); selfAudit.setStatus(SELFAUDIT_STATUS.FINISHED.name());
log.info(" 盘点[" + selfAudit.getBatchNo() + "] 已完成库位数[" + selfAudit.getEndItemNum() + "]总库位数[" + selfAudit.getTotalItemNum() + "],更改盘点状态为已完成"); log.info(" 盘点[" + selfAudit.getBatchNo() + "] 已完成库位数[" + selfAudit.getEndItemNum() + "]总库位数[" + selfAudit.getTotalItemNum() + "],更改盘点状态为已结束");
}
} }
selfAuditManager.save(selfAudit); // selfAuditManager.save(selfAudit);
SelfAuditUtil.updateShelfAudit(selfAudit); selfAuditUtil.updateShelfAudit(selfAudit);
return ResultBean.newOkResult("ok"); return ResultBean.newOkResult("ok");
} }
log.info("盘点:posSelfAuditEnd:posName=[" + posName + "],barcode=[" + barcode + "],actualBarcode=[" + actualBarcode + "]:未找到库位的盘点信息"); log.info("盘点:posSelfAuditEnd:posName=[" + posName + "],barcode=[" + barcode + "],actualBarcode=[" + actualBarcode + "]:未找到库位的盘点信息");
......
...@@ -29,6 +29,6 @@ public class SelfAuditItemDto implements Serializable { ...@@ -29,6 +29,6 @@ public class SelfAuditItemDto implements Serializable {
@ApiModelProperty("实际条码") @ApiModelProperty("实际条码")
private String actualBarcode; private String actualBarcode;
@ApiModelProperty("0=等待中,1=出库完成,2=盘点完成") @ApiModelProperty("盘点状态 0=等待中,1=出库完成,2=入库完成,3=数据异常待处理,4=异常已处理")
private int itemStatus=0; private int itemStatus=0;
} }
...@@ -46,7 +46,7 @@ public class SelfAuditItem extends BasePo implements Serializable { ...@@ -46,7 +46,7 @@ public class SelfAuditItem extends BasePo implements Serializable {
*/ */
private String actualBarcode; private String actualBarcode;
/** /**
* 盘点状态 0=等待中,1=出库完成,2=盘点完成 * 盘点状态 0=等待中,1=出库完成,2=入库完成,3=数据异常待处理,4=异常已处理
*/ */
private int itemStatus=0; private int itemStatus=0;
......
package com.neotel.smfcore.core.selfAudit.util; 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.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.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.*;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Service
public class SelfAuditUtil { public class SelfAuditUtil {
@Autowired
private DataCache dataCache;
@Autowired
private ISelfAuditManager selfAuditManager;
@Autowired
private ISelfAuditItemManager selfAuditItemManager;
public static String createBatchNo() { public static String createBatchNo() {
Date date = new Date(); Date date = new Date();
String dateStr = DateUtil.toDateString(date, "yyyyMMddHHmm"); String dateStr = DateUtil.toDateString(date, "yyyyMMddHHmm");
return "NO" + dateStr; return "NO" + dateStr;
} }
private static Map<String, SelfAudit> selfAuditMap=new ConcurrentHashMap<>(); private Map<String, SelfAudit> selfAuditMap=new ConcurrentHashMap<>();
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 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;
}
return null;
}
public static SelfAudit getSelfAudit(String batchNo){ public void onTaskStatusChange(DataLog task) {
if(selfAuditMap==null){ try {
selfAuditMap=new HashMap<>(); //只有出库任务才需要处理
if (task.isFinished() && task.isCheckOutTask()) {
finishedOutTask(task);
}
} catch (Exception e) {
log.error("更新判断任务状态出错", e);
} }
return selfAuditMap.get(batchNo); }
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);
} }
public static void updateShelfAudit(SelfAudit selfAudit){ //判断是否完成
selfAuditMap.put(selfAudit.getBatchNo(),selfAudit); 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());
}
}
} }
...@@ -19,6 +19,7 @@ import com.neotel.smfcore.core.device.util.DataCache; ...@@ -19,6 +19,7 @@ import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder; 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.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto; import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
...@@ -51,6 +52,8 @@ public class TaskService { ...@@ -51,6 +52,8 @@ public class TaskService {
@Autowired @Autowired
protected LiteOrderCache liteOrderCache; protected LiteOrderCache liteOrderCache;
@Autowired
protected SelfAuditUtil selfAuditUtil;
@Autowired @Autowired
private SmfApi smfApi; private SmfApi smfApi;
...@@ -152,6 +155,7 @@ public class TaskService { ...@@ -152,6 +155,7 @@ public class TaskService {
private void tiggerTaskChangeListener(DataLog task) { private void tiggerTaskChangeListener(DataLog task) {
liteOrderCache.onTaskStatusChange(task); liteOrderCache.onTaskStatusChange(task);
smfApi.onTaskStatusChange(task); smfApi.onTaskStatusChange(task);
selfAuditUtil.onTaskStatusChange(task);
} }
/** /**
......
...@@ -342,6 +342,7 @@ smfcore.selfAudit.pause=\u76D8\u70B9{0}\u5DF2\u6682\u505C ...@@ -342,6 +342,7 @@ smfcore.selfAudit.pause=\u76D8\u70B9{0}\u5DF2\u6682\u505C
smfcore.shelf.error.orderError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u5DE5\u5355[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.orderError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u5DE5\u5355[{0}]\u4E0D\u4E00\u81F4
smfcore.shelf.error.storageError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.storageError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4
smfcore.selfAudit.noPos=\u76D8\u70B9{0}\u672A\u627E\u5230\u5E93\u4F4D\u53F7 smfcore.selfAudit.noPos=\u76D8\u70B9{0}\u672A\u627E\u5230\u5E93\u4F4D\u53F7
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.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1} #smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F #smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
...@@ -341,3 +341,4 @@ smfcore.selfAudit.pause=self audit {0} has Paused ...@@ -341,3 +341,4 @@ smfcore.selfAudit.pause=self audit {0} has Paused
smfcore.shelf.error.orderError=Task does not match the assigned work order [{0}] smfcore.shelf.error.orderError=Task does not match the assigned work order [{0}]
smfcore.shelf.error.storageError=Task does not match the specified shelf [{0}] smfcore.shelf.error.storageError=Task does not match the specified shelf [{0}]
smfcore.selfAudit.noPos=Self Audit{0}No depot number found smfcore.selfAudit.noPos=Self Audit{0}No depot number found
smfcore.selfAudit.hasOutTask=The location [{0}] already has a release task
\ No newline at end of file \ No newline at end of file
...@@ -338,3 +338,4 @@ smfcore.selfAudit.pause=\u30BB\u30EB\u30D5\u30C6\u30B9\u30C8{0}\u304C\u4E2D\u65A ...@@ -338,3 +338,4 @@ smfcore.selfAudit.pause=\u30BB\u30EB\u30D5\u30C6\u30B9\u30C8{0}\u304C\u4E2D\u65A
smfcore.shelf.error.orderError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u5DE5\u5355[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.orderError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u5DE5\u5355[{0}]\u4E0D\u4E00\u81F4
smfcore.shelf.error.storageError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.storageError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4
smfcore.selfAudit.noPos=\u76D8\u70B9{0}\u672A\u627E\u5230\u5E93\u4F4D\u53F7 smfcore.selfAudit.noPos=\u76D8\u70B9{0}\u672A\u627E\u5230\u5E93\u4F4D\u53F7
smfcore.selfAudit.hasOutTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1
\ No newline at end of file \ No newline at end of file
...@@ -338,3 +338,4 @@ smfcore.selfAudit.pause=\u76D8\u70B9{0}\u5DF2\u6682\u505C ...@@ -338,3 +338,4 @@ smfcore.selfAudit.pause=\u76D8\u70B9{0}\u5DF2\u6682\u505C
smfcore.shelf.error.orderError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u5DE5\u5355[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.orderError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u5DE5\u5355[{0}]\u4E0D\u4E00\u81F4
smfcore.shelf.error.storageError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.storageError=\u4EFB\u52A1\u4E0E\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4
smfcore.selfAudit.noPos=\u76D8\u70B9{0}\u672A\u627E\u5230\u5E93\u4F4D\u53F7 smfcore.selfAudit.noPos=\u76D8\u70B9{0}\u672A\u627E\u5230\u5E93\u4F4D\u53F7
smfcore.selfAudit.hasOutTask=\u5E93\u4F4D[{0}]\u5DF2\u6709\u51FA\u5E93\u4EFB\u52A1
\ No newline at end of file \ No newline at end of file
...@@ -339,3 +339,4 @@ smfcore.selfAudit.pause=\u76E4\u9EDE{0}\u5DF2\u66AB\u505C ...@@ -339,3 +339,4 @@ smfcore.selfAudit.pause=\u76E4\u9EDE{0}\u5DF2\u66AB\u505C
smfcore.shelf.error.orderError=\u4EFB\u52D9\u8207\u6307\u5B9A\u5DE5\u55AE[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.orderError=\u4EFB\u52D9\u8207\u6307\u5B9A\u5DE5\u55AE[{0}]\u4E0D\u4E00\u81F4
smfcore.shelf.error.storageError=\u4EFB\u52D9\u8207\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4 smfcore.shelf.error.storageError=\u4EFB\u52D9\u8207\u6307\u5B9A\u6599\u67B6[{0}]\u4E0D\u4E00\u81F4
smfcore.selfAudit.noPos=\u76E4\u9EDE{0}\u672A\u627E\u5230\u5EAB\u4F4D\u865F smfcore.selfAudit.noPos=\u76E4\u9EDE{0}\u672A\u627E\u5230\u5EAB\u4F4D\u865F
smfcore.selfAudit.hasOutTask=\u5EAB\u4F4D[{0}]\u5DF2\u6709\u51FA\u5EAB\u4EFB\u52D9
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!